两者相比如何?
3 回答
TL;博士
节点
- 提供 RMI;
- 远程函数可以接受回调作为参数;
- 这很好,因为它是完全异步的;
- 独立运行或通过现有的 http 服务器运行;
- 可以有浏览器和Node客户端;
- 支持中间件,就像
connect; - 比 NowJS 存在的时间更长。
现在JS
- 超越了 RMI 并实现了“共享范围”API。就像 Dropbox 一样,只有变量和函数,而不是文件;
- 远程函数也接受回调(感谢来自 NowJS 的 Sridatta 和 Eric 的澄清);
- 依赖于一个监听的 http 服务器来工作;
- 只能有浏览器客户端;
- 最近才公开;
- 现在有点马车。
结论
NowJS 现在更像是一个玩具——但要注意它的成熟。对于严肃的事情,也许可以使用 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。它有两个参数: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 实例中运行的脚本,也可以嵌入在网页中。在这种情况下,它只会连接到为网页提供服务的服务器。在这种情况下, Connect可以提供很大帮助。此方案已使用所有现代浏览器以及 Internet Explorer 5.5 和 7 进行了测试。
DNode 于不到一年前于 2010 年 6 月启动。它与 Node 库一样成熟。在我的测试中,我没有发现明显的问题。
现在JS
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
}
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 会发生很大的变化。
从积极的方面来说,开发人员非常容易接近——Eric 甚至指导我让回调工作。源代码没有文档记录,但幸运的是简单而简短,用户指南和示例足以让您入门。
NowJS 团队成员在这里。更正andref的答案:
NowJS完全支持“远程方法调用”。您可以在远程调用中将函数作为参数传递,也可以将函数作为返回值。
这些函数由 NowJS 包装,就像它们在 DNode 中一样,以便它们在定义函数的机器上执行。这使得向远程端公开新功能变得容易,就像在 DNode 中一样。
PS 另外,我不知道 andref 是否意味着远程调用仅在 DNode 上是异步的。远程调用在 NowJS 上也是异步的。他们不会阻止您的代码。
没有尝试过 Dnode,所以我的回答不是比较。但是我想提出一些使用nowjs的经验。
Nowjs 是基于socket.io的,这是相当有问题的。now.ready我经常在短时间内多次遇到会话超时、断开连接和事件触发。在 nowjs github 页面上查看此问题。
我还发现在某些平台上使用 websocket 是不可行的,但是可以通过显式禁用 websocket 来规避这一点。
我曾计划使用 nowjs 创建一个生产应用程序,但它似乎还不够成熟,无法依赖。如果它符合我的目的,我会尝试 dnode ,否则我将切换到 plain-old express。
更新:
Nowjs似乎被废弃了。自 8 个月以来没有提交。