両者はどのように比較されますか?
3 に答える
TL; DR
DNode
- RMIを提供します。
- リモート関数は、引数としてコールバックを受け入れることができます。
- 完全に非同期なので、これは素晴らしいことです。
- スタンドアロンまたは既存のhttpサーバーを介して実行します。
- ブラウザとノードクライアントを持つことができます。
connect
;と同じようにミドルウェアをサポートします。- NowJSよりも長く存在しています。
NowJS
- RMIだけでなく、「共有スコープ」APIを実装します。これはDropboxに似ていますが、ファイルの代わりに変数と関数のみが含まれています。
- リモート関数もコールバックを受け入れます(説明のためにNowJSのSridattaとEricに感謝します)。
- 動作するのはリスニングhttpサーバーに依存します。
- ブラウザクライアントのみを持つことができます。
- ごく最近公開されました。
- 今はややバグがあります。
結論
NowJSは今のところおもちゃのようなものですが、成熟するまで監視を続けてください。深刻な問題については、おそらくDNodeを使用してください。これらのライブラリの詳細については、以下をお読みください。
DNode
DNodeは、リモートメソッド呼び出しフレームワークを提供します。クライアントとサーバーの両方が相互に機能を公開できます。
// On the server
var server = DNode(function () {
this.echo = function (message) {
console.log(message)
}
}).listen(9999)
// On the client
dnode.connect(9999, function (server) {
server.echo('Hello, world!')
})
に渡される関数はDNode()
、に渡される関数と同じようにハンドラー
http.createServer
です。これには2つのパラメーターがあります。client
クライアントによってエクスポートされた関数にアクセスするために使用でき、connection
接続関連のイベントを処理するために使用できます。
// On the server
var server = DNode(function (client, connection) {
this.echo = function (message) {
console.log(message)
connection.on('end', function () {
console.log('The connection %s ended.', conn.id)
})
}
}).listen(9999)
エクスポートされたメソッドは、関数を含め、何でも渡すことができます。これらはDNodeによってプロキシとして適切にラップされ、他のエンドポイントでコールバックできます。これは基本です。DNodeは完全に非同期です。リモートメソッドが戻るのを待っている間はブロックされません。
// A contrived example, of course.
// On the server
var server = DNode(function (client) {
this.echo = function (message) {
console.log(message)
return 'Hello you too.'
}
}).listen(9999)
// On the client
dnode.connect(9999, function (server) {
var ret = server.echo('Hello, world!')
console.log(ret) // This won't work
})
他のエンドポイントからの応答を受信するには、コールバックを渡す必要があります。複雑な会話は非常に速く読めなくなる可能性があります。この質問では、この問題の可能な解決策について説明します。
// On the server
var server = DNode(function (client, callback) {
this.echo = function (message, callback) {
console.log(message)
callback('Hello you too.')
}
this.hello = function (callback) {
callback('Hello, world!')
}
}).listen(9999)
// On the client
dnode.connect(9999, function (server) {
server.echo("I can't have enough nesting with DNode!", function (response) {
console.log(response)
server.hello(function (greeting) {
console.log(greeting)
})
})
})
DNodeクライアントは、Nodeインスタンス内で実行されるスクリプトにすることも、Webページ内に埋め込むこともできます。この場合、Webページを提供したサーバーにのみ接続します。この場合、 Connectは非常に役立ちます。このシナリオは、すべての最新のブラウザーとInternetExplorer5.5および7でテストされました。
DNodeは、1年未満前の2010年6月に開始されました。ノードライブラリと同じくらい成熟しています。私のテストでは、明らかな問題は見つかりませんでした。
NowJS
NowJSは、かわいらしさに国境を接する一種の魔法のAPIを提供します。サーバーには
everyone.now
スコープがあります。内部に配置されたものはすべて、スコープeveryone.now
を通じてすべてのクライアントに表示されます。now
サーバー上のこのコードはecho
、サーバーコンソールにメッセージを書き込むすべてのクライアントと機能を共有します。
// Server-side:
everyone.now.echo = function (message) {
console.log(message)
}
// So, on the client, one can write:
now.echo('This will be printed on the server console.')
サーバー側の「共有」関数が実行this
されるとnow
、その呼び出しを行ったクライアントに固有の属性があります。
// Client-side
now.receiveResponse = function (response) {
console.log('The server said: %s')
}
// We just touched "now" above and it must be synchronized
// with the server. Will things happen as we expect? Since
// the code is not multithreaded and NowJS talks through TCP,
// the synchronizing message will get to the server first.
// I still feel nervous about it, though.
now.echo('This will be printed on the server console.')
// Server-side:
everyone.now.echo = function (message) {
console.log(message)
this.now.receiveResponse('Thank you for using the "echo" service.')
}
NowJSの関数は戻り値を持つことができます。それらを取得するには、コールバックを渡す必要があります。
// On the client
now.twice(10, function (r) { console.log(r) }
// On the server
everyone.now.twice = function(n) {
return 2 * n
}
これは、コールバックを正直な引数として渡したい場合(戻り値を収集しない場合)に影響します。常に戻り値コレクターを渡す必要があります。そうしないと、NowJSが混乱する可能性があります。開発者によると、暗黙のコールバックを使用して戻り値を取得するこの方法は、おそらく将来変更されるでしょう。
// On the client
now.crunchSomeNumbers('compute-primes',
/* This will be called when our prime numbers are ready to be used. */
function (data) { /* process the data */ },
/* This will be called when the server function returns. Even if we
didn't care about our place in the queue, we'd have to add at least
an empty function. */
function (queueLength) { alert('You are number ' + queueLength + ' on the queue.') }
)
// On the server
everyone.now.crunchSomeNumbers = function(task, dataCallback) {
superComputer.enqueueTask(task, dataCallback)
return superComputer.queueLength
}
これがNowJSAPIの場合です。実際には、クライアントの接続と切断を検出するために使用できる機能がさらに3つあります。しかし、なぜ彼らがこれらの機能を使用して公開しなかったのかはわかりませんEventEmitter
。
DNodeとは異なり、NowJSでは、クライアントがWebブラウザー内で実行されるスクリプトである必要があります。スクリプトを含むページは、サーバーを実行しているのと同じノードによって提供される必要があります。
サーバー側では、NowJSもhttpサーバーをリッスンする必要があります。NowJSを初期化するときに渡す必要があります。
var server = http.createServer(function (req, response) {
fs.readFile(__dirname + '/now-client.html', function (err, data) {
response.writeHead(200, {'Content-Type':'text/html'})
response.write(data)
response.end()
})
})
server.listen(8080)
var everyone = now.initialize(server)
NowJSの最初のコミットは、数週間前(2011年3月)のものです。そのため、バグがあると予想してください。この答えを書いているときに私は自分自身に問題を見つけました。また、APIが大幅に変更されることを期待してください。
良い面として、開発者は非常にアクセスしやすく、エリックはコールバックを機能させるように私を導いてくれました。ソースコードは文書化されていませんが、幸いにも単純で短く、ユーザーガイドと例で十分に始めることができます。
NowJS チーム メンバーはこちら。andrefの答えへの修正:
NowJSは「リモート メソッド呼び出し」を完全にサポートします。リモート呼び出しで関数を引数として渡すことができ、関数を戻り値として持つこともできます。
これらの関数は、関数が定義されたマシン上で実行されるように、DNode と同じように NowJS によってラップされます。これにより、DNode の場合と同様に、リモート エンドに新しい関数を簡単に公開できます。
PSさらに、andrefがリモート呼び出しがDNodeでのみ非同期であることを意味するかどうかはわかりません。NowJS では、リモート呼び出しも非同期です。コードをブロックしません。
Dnode を試したことがないので、私の答えは比較ではありません。しかし、nowjs を使用したいくつかの経験を紹介したいと思います。
Nowjs は非常にバグのあるsocket.ioに基づいています。セッションのタイムアウト、切断、およびnow.ready
イベントの起動が短時間に複数回発生することがよくあります。nowjs github ページでこの問題を確認してください。
また、特定のプラットフォームでは実行不可能な Websocket を使用することがわかりましたが、これは Websocket を明示的に無効にすることで回避できます。
nowjs を使用して本番アプリを作成する予定でしたが、信頼できるほど成熟していないようです。目的にかなう場合は dnode を試します。それ以外の場合は、plain-old に切り替えexpress
ます。
アップデート:
Nowjsは廃棄されたようです。8 か月以降、コミットはありません。