私はNode.jsを初めて使用し、Rhinoに基づくフレームワークであるNarwhalについて読んでいます。
私の質問:
- Node.jsを使用している場合、Narwhalとそのライブラリ/モジュールを使用できますか?
- Narwhal I / Oのライブラリ/モジュールはブロックされていませんか(Node.jsがこのように大きな人気を得た理由)?
- Node.jsはWebサーバーを作成するためだけのものですか、それともNarwhalのように一般的なアプリケーションを作成するためのものですか?
私はNode.jsを初めて使用し、Rhinoに基づくフレームワークであるNarwhalについて読んでいます。
私の質問:
Node.jsまたはNarwhalのいずれかを使用している場合は、それぞれのエンジンとの互換性をアドバタイズするパッケージとモジュールのみを使用してください。現在、両方のエンジンで動作するアプリケーション、パッケージ、およびモジュールの作成には多くのニュアンスがあります。DojoのKrisZypは、彼のパッケージを両方のシステムで機能させるためにかなりの努力を払ってきました。私は他の誰も考えられません。
Narwhalの入力モジュールと出力モジュールは、Python、Ruby、Perl、C、Javaなどの標準ライブラリと同様にブロックされています。
ただし、サーバーのメモリ内で状態を維持するゲームや多数のクライアントとのステートフル通信など、I/Oをブロックして効果的に作成できないアプリケーションのクラスがあります。実験によってのみ、スレッドまたはイベントループが個々のアプリケーションに対してより優れたパフォーマンスを発揮するかどうかを明らかにできます。ただし、ほとんどのプログラミング言語とライブラリエコシステムで「イベント」アプリケーションを作成することはさらに困難で危険です。これは、ブロッキングI /OとブロッキングI/を使用することで、非ブロッキングI/Oを使用する利点をすばやく回避できるためです。 Oは、オペレーティングシステムのインターフェイスと同じくらい低くても、アーキテクチャのレイヤーに隠されていることがよくあります。Node.jsは、厳密に非同期のI / Oを備えたエコシステムを作成しているため、エキサイティングです。
DouglasCrockfordやMarkMillerのような支持者は、非同期イベントループプログラミングは、これらのシステムのデータフロー、同時実行性、セキュリティについて推論し、正確性や整合性を損なうことなくそのようなサブシステムを盲目的に構成する方が簡単であるため、ほとんどのアプリケーションを作成する方法であると主張しています。
ただし、JavaScriptを言語として利用したいが、イベントループプログラミングの複雑さを受け入れたくない場合、Narwhalは、Safariの背後にある高速JavaScriptエンジンであるJavaScriptCoreとRhinoの両方で動作するように設計されています。 。Rhinoを使用すると、 GoogleAppEngineにアクセスできます。Narwhalは、JavaScriptエンジンの柔軟性を提供するように設計されていますが、Node.jsのI/Oモデルを考慮していません。Narwhalは、 JakeやJackなどのCappuccino Objective-Jアプリケーション用のビルドツールやサーバーとして、280Northソフトウェアエコシステムでも広く使用されています。
Node.jsとNarwhalはどちらも、一般的なアプリケーションとWebサーバーに使用できます。Node.jsは、ネットワーククライアントとサーバーに特に適しています。Narwhalは、UnixスタイルのプログラムやJSGI、CGIのようなWebサーバーに特に適しており、さまざまなWebサーバーでJSGIアプリケーションを変更せずに実行するように設計されています。
NarwhalとNode.jsの両方で動作するアプリケーションを作成することは困難ですが、可能です。NarwhalとNode.jsで機能する「パッケージ」を作成することは可能ですが、意図的に行う必要があります。パッケージがNarwhalとNode.jsの両方で設計およびテストされていることをアドバタイズしない場合は、どちらか一方でのみ機能することは間違いありません。
io:パーサー、フォーマッター、エンコーダー、デコーダーなど、I / Oサブシステムを使用しないモジュールは、NarwhalとNode.jsの両方の間でコードを共有するのに特に適しています。
パッケージ: NPM(ノードパッケージマネージャー)とTusk(Narwhalのパッケージマネージャー)のパッケージのレイアウト方法には違いがあります。どちらもpackage.jsonを使用しますが、「依存関係」にはそれぞれ異なる意味があります。この不整合を許容できるようにするNarwhalのパッチが間もなく登場します。パッケージがNarwhalにインストールされると、Rubyのように、それらはすべて同じモジュール名前空間を共有します。NPMを使用すると、各パッケージには、パッケージと同じ名前のモジュール名前空間のサブツリーがあります。
モジュール: Node.jsとNarwhalはどちらも、CommonJSモジュール仕様にさまざまな拡張機能を提供します。
Node.jsは、のような追加の自由変数を提供します__dirname
。
Node.jsを使用すると、エクスポートオブジェクトを。で再割り当てできますmodule.exports = x
。
Narwhalはrequire.once(id, scope)
、スコープ内に追加の自由変数を使用して(以前にロードされているかどうかに関係なく)モジュールを1回実行することを提供します(これらは誤って「グローバル」と呼ばれることがあります)。
Node.jsは、現在のモジュールのファイル名にCommonJS を提供しません。module.path
NarwhalとNode.jsは、 CoffeeScriptやObjective-Jなどのモジュールの代替言語を処理するようにモジュールローダーを拡張するための互換性のないシステムを提供します。
Narhwalの同期スタイルが必要な場合は、私のCommon Nodeパッケージを使用して、Node.jsで同期Narwhal、RingoJS、その他のCommonJS互換パッケージおよびJSGIWebアプリケーションを実行することもできます。
Node.jsをNarwhalと比較しないでください。代わりに、 Rhinoと比較する必要があります。Rhinoと同様に、Node.jsはJavaScriptインタープリターです。
Node.jsはモジュールのCommonJS仕様に準拠しているため、Node.jsのすべてのライブラリはCommonJSと互換性があります。NarwhalもCommonJSと互換性があるようです。つまり、Node.jsで使用できるようになります。
ただし、Narwhalとの重複が多いように思われるため、最初にNode.jsの標準モジュールを確認してください。また、Node.jsで利用可能なサードパーティモジュールのリストもご覧ください:http://github.com/ry/node/wiki/modules
追加の回答:
ああ、なるほど。Narwhalは確かにNode.jsのようなものです。イッカクは私を失望させたフレームワークだとあなたは言いました。そうではないことがわかりました。実際、イントロページには、Narwhalインタープリターの上でNitroのようなフレームワークを実行できると書かれています。
NarwhalとNode.jsの違いは、基本的にNarwhalはプラグ可能なJavaScriptエンジンアーキテクチャを使用しているのに対し、Node.jsはV8のみを使用していることです。どちらもJavaScriptの「シェル」として適切です(「インタープリター」という用語との混同を避けるために、今のところはそれと呼びましょう)。
どちらかのプラットフォーム用に作成されたCommonJSライブラリをどこまで取得して、もう一方のプラットフォームで使用できるかはわかりません。確かに、すべての純粋なJavaScriptライブラリは相互互換性があると思います。Node.jsはノンブロッキングI/Oモデルを使用するため、Narwhalの一部のバイナリモジュールはNode.jsで正しく機能しない可能性があります。
ただし、Node.jsはコールバックスタイルのプログラミングを強調します(ノンブロッキングI / Oを最大限に活用するため)。経験豊富なJavaScriptプログラマーにとっては、これは問題ではありません。実際setTimeout()
、XMLHttpRequest
経験豊富なJavaScriptプログラマーとして、私はNode.jsのスタイルを好みます。イッカクはCのように感じすぎます。
例:
これが、イッカクに対するノードの異なる「感触」の意味です。
Narwhalでは、ファイルを丸呑みする例は次のとおりです。
var fs = require("file");
var data = fs.read(myfilename); /* Code stops at this point
* until all data is read
*/
/* Process data here */
Node.jsでは次のようになります。
var fs = require('fs');
fs.readFile(myfilename, function(err,data) {
/* Process data here */
});
/* readFile returns immediately and code continues
* executing while file is being read
*/
と同様setTimeout
に、Node.jsでのファイルの読み取りは非同期です(コードは、ハードディスクがデータを検索して読み取るのを待つ必要があります。その間、他のコードを実行できます)。