Различия между Нарвалом и Node.js?

Я новичок в Node.js, и я читал о Narwhal, который является основой, основанной на Rhino.

Мои вопросы:

  1. Если я использую Node.js, могу ли я использовать Narwhal и его библиотеки / модули?
  2. Разве библиотеки / модули в Narwhal IO не заблокированы (почему Node.js приобрел такую ​​огромную популярность)?
  3. Является ли Node.js только для создания веб-серверов или для создания общих приложений, как Narwhal?

4 ответа

Решение
  1. Если вы используете Node или Narwhal, используйте только пакеты и модули, которые рекламируют совместимость с вашим соответствующим движком. В настоящее время существует множество нюансов при написании приложений, пакетов и модулей, которые работают на обоих движках. Крис Зип из Dojo приложил немало усилий, чтобы его пакеты работали на обеих системах, и я не могу думать ни о ком другом.

  2. Модули ввода и вывода Narwhal блокируются, как и стандартные библиотеки для Python, Ruby, Perl, C, Java и так далее.

    Однако существует класс приложений, которые не могут быть эффективно написаны с блокировкой ввода-вывода, например игры, которые поддерживают свое состояние в памяти сервера и поддерживают связь с множеством клиентов. Только эксперимент может определить, работают ли потоки или циклы событий лучше для отдельных приложений. Но, кроме того, труднее и опаснее писать "выровненные" приложения на большинстве языков программирования и библиотечных экосистем, потому что преимущества использования неблокирующего ввода-вывода можно быстро устранить, используя любой блокирующий ввод-вывод, а блокирующий ввод-вывод часто скрыт в уровни архитектуры, даже на уровне интерфейса операционной системы. Узел интересен тем, что создает экосистему со строго асинхронным вводом-выводом, что делает его первой системой, в которой этот класс приложений достаточно прост для написания.

    Сторонники, такие как Дуг Крокфорд и Марк Миллер, утверждают, что асинхронное программирование цикла событий - это способ, которым должно быть написано большинство приложений, потому что легче рассуждать о потоке данных, параллелизме и безопасности в этих системах и слепо составлять такие подсистемы, не ставя под угрозу правильность или целостность.

    Однако, если вы хотите использовать преимущества JavaScript как языка, но не хотите покупать дополнительную сложность программирования цикла событий, Narwhal предназначен для работы как с JavaScriptCore, быстрым движком JavaScript, стоящим за Safari, так и с Rhino. Использование Rhino дает вам доступ к Google AppEngine. Narwhal был разработан, чтобы предоставить вам гибкость вашего движка JavaScript, но он не учитывал модель IO Node. Narwhal также широко используется программной экосистемой 280 North для создания инструментов и серверов для приложений Cappuccino Objective-J, таких как Jake и Jack.

  3. И Node, и Narwhal могут использоваться для общих приложений и веб-серверов. Node особенно хорошо подходит для сетевых клиентов и серверов. Narwhal особенно хорошо подходит для программ в стиле Unix и JSGI, CGI-подобных веб-серверов и предназначен для запуска приложений JSGI на различных веб-серверах без каких-либо изменений.

Написание приложений, которые работают как на Narwhal, так и на Node, сложно, но возможно. Написание "пакетов", которые работают для Нарвала и Нода, возможно, но должно быть сделано намеренно. Если пакет не сообщает о том, что он был спроектирован и протестирован на Narwhal и Node, вы можете поспорить, что он будет работать только на одном или другом.

io: Модули, которые не используют подсистемы ввода-вывода, такие как парсеры, форматеры, кодеры и декодеры, особенно хорошо подходят для совместного использования кода между Narwhal и Node.

Пакеты: Существуют различия в способах размещения пакетов для NPM (Node Package Manager) и Tusk (менеджер пакетов Narwhal). Они оба используют package.json, но "зависимости" имеют разные значения для каждого. Для Нарвала есть новый патч, который позволяет справиться с этой несогласованностью. Когда пакеты устанавливаются в Narwhal, все они используют одно и то же пространство имен модулей, как Ruby. В NPM каждый пакет имеет поддерево пространства имен модуля с тем же именем, что и у пакета.

Модули: Node и Narwhal предоставляют различные расширения спецификации модуля CommonJS.

  1. Узел предоставляет дополнительные свободные переменные, такие как __dirname,
  2. Узел позволяет переназначить объект экспорта module.exports = x,
  3. Нарвал обеспечивает require.once(id, scope) за выполнение модуля один раз (независимо от того, был ли он ранее загружен) с дополнительными свободными переменными в области (их иногда ошибочно называют "глобальными").
  4. Узел не предоставляет CommonJS module.path для имени файла текущего модуля.
  5. Narwhal и Node предоставляют несовместимые системы для расширения загрузчика модулей для обработки альтернативных языков для модулей, таких как CoffeeScript и ObjectiveJ.

Я бы просто добавил RingoJS к миксу. Это основанная на Rhino система CommonJS, но по сравнению с Narwhal она гораздо более зрелая (ее основной автор годами разрабатывал свою предшественницу Helma), и, следуя обоим хитам, ее разработка RingoJS кажется гораздо более активной. Развитие нарвала в наши дни кажется медленным.

Если вы предпочитаете синхронный стиль Narhwal, вы также можете использовать мой пакет Common Node, который позволяет запускать синхронные пакеты, совместимые с Narwhal, RingoJS и другими CommonJS, а также веб-приложения JSGI на Node.

Node.js не следует сравнивать с Narwhal, вместо этого его следует сравнивать с Rhino. Как и Rhino, Node.js является интерпретатором JavaScript.

Node.js соответствуют спецификации CommonJS для модулей, поэтому все библиотеки для него совместимы с CommonJS. Похоже, что Narwhal также совместим с CommonJS, что означает, что их можно будет использовать в Node.

Но сначала взглянем на стандартные модули Node, так как кажется, что с Narwhal много общего. Также посмотрите список сторонних модулей, доступных для Node.js: http://github.com/ry/node/wiki/modules


Дополнительный ответ:

Ах, теперь я вижу. Нарвал действительно похож на Узел. Вы сказали, что Нарвал - это структура, которая сбила меня с толку. Теперь я вижу, что это не так. Действительно, на вступительной странице написано, что вы можете запускать фреймворки, такие как Nitro, поверх интерпретатора Narwhal.

Разница между Narwhal и Node заключается в том, что Narwhal использует подключаемую архитектуру движка javascript, в то время как Node просто использует V8. Оба являются собственными "оболочками" javascript (давайте назовем их так, чтобы избежать путаницы с термином "интерпретатор").

Я не уверен, насколько далеко можно взять библиотеки CommonJS, написанные для любой платформы, и использовать их на другой платформе. Я предполагаю, что все библиотеки pure-JS совместимы между собой. Node действительно использует неблокирующую модель ввода / вывода, поэтому некоторые двоичные модули для Narwhal могут работать некорректно на Node.

Тем не менее, Node делает упор на программирование в стиле обратного вызова (чтобы максимально использовать неблокирующий ввод / вывод). Для опытного программиста JS это не проблема, так как мы привыкли setTimeout(), XMLHttpRequest На самом деле, как опытный программист JS, я предпочитаю стиль Node. Нарвал чувствует себя слишком похоже на C.


Примеры:

Вот что я имею в виду под "ощущением" Узла над Нарвалом.

В Narwhal пример для удаления файла:

var fs = require("file");
var data = fs.read(myfilename); /* code stops at this point
                                 * until all data is read
                                 */
/* process data here */

В Node.js это:

var fs = require('fs');
fs.readFile(myfilename, function(err,data) {
    /* process data here */
});

/* readFile returns immediately and code continues
 * executing while file is being read
 */

Как setTimeoutчтение файлов в Node происходит асинхронно (ваш код должен ждать, пока жесткий диск будет искать и читать данные, в течение которых вы можете запускать другие фрагменты кода).

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