В чем разница между 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 месяцев.