两者相比如何?
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 个月以来没有提交。