2010-10-11 2 views
34

Я новичок в Node.js, и я читал о Нарвале, который является основой, основанной на Rhino.Различия между Нарвалом и Node.js?

Мои вопросы:

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

ответ

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

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

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

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

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

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

Написание приложений, которые работают как на Нарбале, так и на Узде, сложно, но возможно. Написание «пакетов», которые работают для Нарвала и Узла, возможно, но должно быть сделано намеренно. Если пакет не рекламирует, что он был разработан и протестирован как на Нарвале, так и в Узле, вы можете поспорить, что он будет работать только на том или ином.

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

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

модули: Узел и Нарвал оба предоставляют различные расширения для CommonJS module specification.

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

"...класс приложений, которые не могут быть эффективно написаны с блокировкой ввода-вывода, как игры, которые поддерживают свое состояние в памяти сервера и поддерживают связь с многочисленными клиентами ». это похоже на сильное утверждение - я согласен с тем, что NodeJs, скорее всего, больше подходит для написания таких приложений, но не зашел так далеко, чтобы сказать, что в целом они «не могут быть эффективно написаны» с помощью нитей и блокирования API. – oberhamsi

+1

«Модули ввода и вывода наррала блокируются, как и стандартные библиотеки для Python , Ruby, Tcl ... «Я просто хотел бы, чтобы стандартный ввод/вывод Tcl не был блокирующим (или, точнее, может использоваться не блокирующим образом), и так с 1990-х годов. – slebetman

+0

Соответствующий Помимо этого (старого) вопроса, Нарвал, похоже, стал заброшенным проектом. –

-2

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

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

Но сначала посмотрите на стандартные модули Узел, поскольку там, похоже, много перекрытий с Нарвалом. Кроме того, взгляните на список 3-модулей сторонних доступных для Node.js:


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

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

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

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

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

+1

Но разве Rhino не сопоставим с V8? –

+0

Да и нет. Rhino.java сопоставим с V8, а Rhino.jar сравним с Node.js. Одна из них - это библиотека движка, а другая - приложение, которое делает исполняемую библиотеку. – slebetman

+5

Node.js не является интерпретатором JavaScript. V8 - это интерпретатор JavaScript, как и Rhino. Node.js - это среда ввода-вывода для V8. Википедия дает довольно хорошее описание того, что Node.js: http://en.wikipedia.org/wiki/Node.js – jbeard4

7

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

1

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