Узловой стиль требуется для JavaScript в браузере?

Существуют ли какие-либо библиотеки для встроенного в браузер javascript, которые обеспечивают такую ​​же гибкость / модульность / простоту использования, как требует Node ]?

Для более подробной информации: причина require настолько хороша в том, что он:

  1. Позволяет динамически загружать код из других мест (что, на мой взгляд, стилистически лучше, чем связывание весь ваш код в HTML)
  2. Он обеспечивает согласованный интерфейс для создания модулей
  3. Модули легко зависят от других модулей (поэтому я мог бы написать, например, API, который требует jQuery, чтобы я мог использовать jQuery.ajax ()
  4. Загруженный javascript имеет область видимости , что означает, что я могу загрузить с помощью var dsp = require ("dsp.js"); , и я смогу доступ к dsp.FFT , который не будет мешать моей локальной var FFT

. Мне еще предстоит найти библиотеку, которая делает это эффективно. Обходные пути, которые я обычно использую являются:

  • coffeescript-concat - достаточно просто, чтобы потребовать другие js, но вы должны его скомпилировать, а это значит, что он менее подходит для быстрой разработки (например, построение API-интерфейсов в процессе тестирования)

  • RequireJS - он популярен, прост и решает 1-3, но отсутствие области видимости является серьезным препятствием (я считаю, что head.js похож на в том, что в нем отсутствует область видимости, хотя у меня никогда не было возможности его использовать. Точно так же LABjs может загружаться, а .wait () смягчает проблемы с зависимостями, но все еще не работает » t do scoping)

Насколько я могу судить, существует множество решений для динамической и / или асинхронной загрузки javascript, но они, как правило, имеют те же проблемы с масштабом, что и простая загрузка js из HTML. Больше всего на свете мне нужен способ загрузки javascript, который вообще не загрязняет глобальное пространство имен, но по-прежнему позволяет мне загружать и использовать библиотеки (как это делает node).

РЕДАКТИРОВАТЬ (МОЙ ОТВЕТ): С тех пор, как я написал это, я широко использовал RequireJS (который теперь имеет гораздо более четкую документацию). На мой взгляд, RequireJS был правильным выбором. Я хотел бы прояснить, как работает система, для людей, которые так же сбиты с толку, как и я:

Вы можете использовать require в повседневной разработке. Модуль может быть чем угодно, возвращаемым функцией (обычно объектом или функцией), и имеет область видимости как параметр. Вы также можете скомпилировать свой проект в один файл для развертывания с помощью r.js (на практике это почти всегда быстрее, хотя require может загружать сценарии параллельно).

Основное различие между RequireJS и node-style require like browserify (интересный проект, предложенный tjameson) заключается в том, как модули спроектированы и требуются:

  • RequireJS использует AMD (определение асинхронного модуля). В AMD require принимает список модулей (файлов javascript) для загрузки и функцию обратного вызова. Когда он загружает каждый из модулей, он вызывает обратный вызов с каждым модулем в качестве параметра для обратного вызова. Таким образом, он действительно асинхронный и поэтому хорошо подходит для Интернета.
  • Node использует CommonJS. В CommonJS require - это блокирующий вызов, который загружает модуль и возвращает его как объект. Это отлично работает для Node, потому что файлы считываются из файловой системы, что достаточно быстро, но плохо работает в Интернете, потому что синхронная загрузка файлов может занять намного больше времени.

На практике многие разработчики использовали Node (и, следовательно, CommonJS) раньше они хоть раз видели AMD. Кроме того, многие библиотеки / модули написаны для CommonJS (путем добавления элементов в объект exports ), а не для AMD (путем возврата модуля из функции define ). Поэтому многие веб-разработчики, перешедшие на Node, хотят использовать библиотеки CommonJS в Интернете. Это возможно, поскольку загрузка из тега блокируется. Такие решения, как browserify, берут модули CommonJS (Node) и обертывают их, чтобы вы могли включать их в теги сценариев.

Поэтому, если вы разрабатываете свой собственный многофайловый проект для Интернета, я настоятельно рекомендую RequireJS, поскольку он действительно модульная система для Интернета (хотя, откровенно говоря, я считаю AMD более естественной, чем CommonJS). В последнее время это различие стало менее важным, поскольку RequireJS теперь позволяет вам по существу использовать синтаксис CommonJS. Кроме того, RequireJS можно использовать для загрузки модулей AMD в Node (хотя я предпочитаю node-amd-loader ).

73
задан Alex Churchill 17 December 2012 в 18:49
поделиться