Как они сравниваются друг с другом?
В чем разница между dnode и nowjs?
Ответ 1
TL; DR
DNode
- предоставляет RMI;
- удаленные функции могут принимать обратные вызовы как аргументы;
- который хорош, поскольку он полностью асинхронен;
- работает автономно или через существующий http-сервер;
- может иметь браузер и Node клиентов;
- поддерживает промежуточное программное обеспечение, как
connect
; - был дольше, чем NowJS.
NowJS
- выходит за рамки только RMI и реализует API с общим доступом. Мне нравится Dropbox, только с переменными и функциями вместо файлов;
- удаленные функции также принимают обратные вызовы (благодаря Шридатте и Эрику из NowJS для разъяснения);
- зависит от работы 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
. Он имеет два параметра: 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 и могут быть вызваны обратно на другую конечную точку. Это basic: 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 может быть script запущен внутри экземпляра Node или может быть встроенный в веб-страницу. В этом случае он будет подключаться только к серверу, который служил на веб-странице. Connect имеет большую помощь в этом случае. Этот сценарий был протестирован со всеми современными браузерами и с Internet Explorer 5.5 и 7.
DNode был запущен менее года назад, в июне 2010 года. Он созрел как Node библиотека может быть. В моих тестах я не обнаружил очевидных проблем.
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
}
Это имеет значение, если вы хотите передать обратный вызов как честный аргумент (не для сбора возвращаемого значения) - нужно всегда передавать коллектор возвращаемого значения или Теперь JJ может запутаться. По словам разработчиков, этот способ получения возвращаемое значение с неявным обратным вызовом, вероятно, изменится в будущем:
// 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
}
И это для API NowJS. Ну, на самом деле есть еще три функции, которые
может использоваться для обнаружения подключения клиента и отключения. Я не знаю, почему они
однако не отображали эти функции, используя EventEmitter
.
В отличие от DNode, NowJS требует, чтобы клиент был script, запущенным внутри веб-браузера. Страница, содержащая script, должна обслуживаться тем же Node, который запущен сервера.
На стороне сервера 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 г.). Таким образом, быть багги. Я сам нашел вопросы при написании этого ответа. Также ожидаем API, чтобы изменить многое.
С положительной стороны разработчики очень доступны - Эрик даже вел меня для создания обратных вызовов. Исходный код не документирован, но, к счастью, простые и короткие, а руководство пользователя и примеры достаточно, чтобы начать работу.
Ответ 2
Член команды NewJS здесь. Корректировка ответа andref:
NowJS полностью поддерживает "Вызов удаленного метода" . Вы можете передавать функции в качестве аргументов в удаленных вызовах, и вы также можете иметь функции как возвращаемые значения.
Эти функции обертываются NowJS так же, как они находятся в DNode, так что они выполняются на машине, на которой была определена функция. Это позволяет легко открывать новые функции на удаленном конце, как в DNode.
P.S. Кроме того, я не знаю, подразумевает ли andref, что удаленные вызовы только асинхронны для DNode. Удаленные вызовы также являются асинхронными в NowJS. Они не блокируют ваш код.
Ответ 3
Не пробовал Dnode, поэтому мой ответ не сравним. Но я хотел бы сделать несколько опытов, используя nowjs.
Nowjs основан на socket.io, который довольно затруднительно. Я часто испытываю таймауты сеанса, отключается и now.ready
срабатывание событий несколько раз за короткое время. Проверьте эту проблему на странице nowjs github.
Также я обнаружил, что на некоторых платформах нестабильны сетевые файлы, однако это можно обойти, явно отключив веб-сайты.
Я планировал создать производственное приложение, используя nowjs, но, похоже, он недостаточно зрелый, чтобы его можно было использовать. Я попробую dnode, если он будет служить моей цели, иначе я переключусь на обычный express
.
Обновление:
Nowjs кажется, который будет отменен. Без фиксации с 8 месяцев.