В чем разница между dnode и nowjs? - PullRequest
45 голосов
/ 15 марта 2011

Как они сравниваются друг с другом?

Ответы [ 3 ]

61 голосов
/ 16 марта 2011

TL; DR

DNode

  • обеспечивает RMI;
  • удаленные функции могут принимать обратные вызовы в качестве аргументов;
  • что приятно, так как оно полностью асинхронное;
  • работает автономно или через существующий http-сервер;
  • может иметь браузерные и Node-клиенты;
  • поддерживает промежуточное ПО, как и connect;
  • существует дольше, чем NowJS.

NowJS

  • выходит за рамки просто RMI и реализует API с «общей областью действия». Это как Dropbox , только с переменными и функциями вместо файлов;
  • удаленные функции также принимают обратные вызовы ( благодаря Sridatta и Эрику из NowJS для уточнения );
  • зависит от работы прослушивающего http-сервера;
  • может иметь только браузерные клиенты;
  • стал публичным совсем недавно;
  • сейчас немного глючит.

Заключение

Сейчас JS больше похожа на игрушку, но следите за ее развитием. За серьезные вещи, может быть, пойти с 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 упакован в качестве прокси и может быть вызван обратно на другой конечной точке. Это фундаментальный: 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 года. Он так же зрел, как и узел библиотека может быть. В моих тестах я не обнаружил очевидных проблем.

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
}

Это имеет значение, если вы хотите передать обратный вызов в качестве честного аргумента (не собирать возвращаемое значение) - нужно всегда проходить сборщик возвращаемого значения, или Теперь JS может запутаться. По словам разработчиков, этот способ получения возвращаемое значение с неявным обратным вызовом, вероятно, изменится в будущем:

// 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. Ну, на самом деле есть еще 3 функции, которые может использоваться для обнаружения клиентского подключения и отключения. Я не знаю почему они однако не раскрывал эти функции с помощью EventEmitter.

В отличие от DNode, NowJS требует, чтобы клиент был скриптом, работающим внутри веб-браузера. Страница, содержащая скрипт, должна обслуживаться тем же узлом, на котором выполняется сервер.

На стороне сервера 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 сильно изменился.

С положительной стороны, разработчики очень доступны - Эрик даже наставил меня чтобы заставить работать обратные вызовы. Исходный код не задокументирован, но к счастью просто и кратко, и руководство пользователя и примеры достаточно, чтобы начать.

14 голосов
/ 17 марта 2011

Член команды NowJS здесь. Исправление к ответу Андрефа:

NowJS полностью поддерживает «Удаленный вызов метода» . Вы можете передавать функции в качестве аргументов при удаленных вызовах, а также иметь функции в качестве возвращаемых значений.

Эти функции упакованы в NowJS так же, как и в DNode, поэтому они выполняются на компьютере, на котором была определена функция. Это облегчает предоставление новых функций удаленному концу, как в DNode.

P.S. Кроме того, я не знаю, подразумевал ли andref, что удаленные вызовы только асинхронны в DNode. Удаленные вызовы также являются асинхронными на NowJS. Они не блокируют ваш код.

2 голосов
/ 26 апреля 2012

Не пробовал Dnode, поэтому мой ответ не сравнение. Но я хотел бы предложить несколько примеров использования nowjs.

Nowjs основан на socket.io , который довольно глючит. Я часто испытываю тайм-ауты сеансов, отключение и запуск события now.ready несколько раз за короткое время. Проверьте эту проблему на странице nowjs github.

Также я обнаружил, что использование веб-сокетов на некоторых платформах нежизнеспособно, однако это можно обойти, явно отключив веб-сокеты.

Я планировал создать производственное приложение с использованием nowjs, но оно кажется недостаточно зрелым, чтобы на него можно было положиться. Я попробую dnode, если это будет соответствовать моим целям, иначе я переключусь на обычный express.

Обновление:

Nowjs кажется списанным. Нет коммитов с 8 месяцев.

...