DNodeとNowjsの違いは何ですか?
-
24-10-2019 - |
質問
2人はお互いにどのように比較しますか?
解決
tl; dr
dnode
- RMIを提供します。
- リモート関数は、コールバックを引数として受け入れることができます。
- 完全に非同期であるため、これは素晴らしいことです。
- スタンドアロンまたは既存のHTTPサーバーを介して実行します。
- ブラウザとノードのクライアントを持つことができます。
- 同じようにミドルウェアをサポートします
connect
; - Nowjsよりも長く存在しています。
nowjs
- RMIだけを超えて、「共有スコープ」APIを実装します。 ドロップボックスのようなものです, 、ファイルの代わりに変数と関数のみ。
- リモート関数 また、コールバックを受け入れます (明確化については、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クライアントは、ノードインスタンス内で実行されているスクリプトであるか、Webページ内に埋め込むことができます。この場合、Webページを提供するサーバーにのみ接続します。 接続 この場合、大きな支援が必要です。このシナリオは、すべての最新のブラウザとInternet Explorer 5.5および7でテストされました。
DNodeは2010年6月に1年前に開始されました。ノードライブラリと同じくらい成熟しています。私のテストでは、明らかな問題は見つかりませんでした。
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
aがあります 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
}
そして、これはnowjs APIのためです。まあ、実際には、クライアントの接続と切断を検出するために使用できる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が大きく変わることを期待しています。
ポジティブな面では、開発者は非常にアクセスしやすいです - エリックはコールバックを機能させることさえしました。ソースコードは文書化されていませんが、幸いなことにシンプルで短く、ユーザーガイドと例は1つを開始するのに十分です。
他のヒント
Nowjsチームメンバーはこちら。アンドレフの答えへの修正:
nowjs 「リモートメソッドの呼び出し」を完全にサポートしています. 。リモートコールで関数を引数として渡すことができ、return値としても関数を持つことができます。
これらの関数は、dnodeにあるのと同じようにNowjsによってラップされているため、関数が定義されているマシンで実行されます。これにより、DNodeのように、新しい機能をリモートエンドに簡単に公開できます。
PSさらに、AndrefがリモートコールがDNodeでのみ非同期であることを暗示することを意味するかどうかはわかりません。リモートコールもnowjsでは非同期です。彼らはあなたのコードをブロックしません。
DNODEを試していないので、私の答えは比較ではありません。しかし、私はNowjsを使用していくつかの経験を提示したいと思います。
Nowjsはに基づいています socket.io これはかなりバグです。セッションのタイムアウト、切断などを頻繁に経験しています now.ready
イベントは短期間で複数回発砲します。チェックアウト この問題 nowjs githubページ。
また、特定のプラットフォームではWebSocketを使用していないことがわかりましたが、これは明示的にWebSocketを無効にすることで回避できます。
Nowjsを使用して制作アプリの作成を計画していましたが、依存するほど成熟していないようです。それが私の目的に役立つなら、私はdnodeを試してみます、そうでなければ私は平野に切り替えます express
.
アップデート:
nowjs 思われる 廃棄される。 8か月からコミットしません。