Подтвердить что ты не робот

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

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

Мои вопросы:

  • Если я использую Node.js, могу ли я использовать Narvyal и его библиотеки/модули?
  • Разве библиотеки/модули не блокируются в IO-блокировке (почему Node.js получили эту огромную популярность)?
  • Является ли Node.js только для создания веб-серверов или для создания общих приложений, как и для Нарвала?
4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

Если вы предпочитаете синхронный стиль Нарвала, вы также можете использовать мой Общий Node пакет, который позволяет запускать синхронные Нарвал, РингоС и другие Совместимые с CommonJS пакеты, а также веб-приложения JSGI на Node.

Ответ 4

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

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

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


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

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

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

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

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


Примеры:

Вот что я имею в виду под другим "чувством" Node над Нарвалом.

В Нарвале пример для разметки файла:

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