В чем разница между dnode и nowjs?

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

3 ответа

Решение

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 года. Он настолько же совершенен, насколько может быть библиотека 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
}

Это имеет значение, если вы хотите передать обратный вызов в качестве честного аргумента (не собирать возвращаемое значение) - нужно всегда передавать коллектор возвращаемого значения, иначе 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
}

И это для 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 сильно изменится.

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

Сейчас член команды JS здесь. Исправление к ответу Андрефа:

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

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

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

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

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

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

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

Обновить:

Nowjs, кажется, слом. Нет коммитов с 8 месяцев.

Другие вопросы по тегам