Ответ 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.