Существуют ли библиотеки для браузера в браузере, которые обеспечивают такую же гибкость/модульность/простоту использования, как require
узла?
Для того, чтобы предоставить более подробную информацию: причина require
настолько хороша, что она:
- Позволяет динамически загружать код из других мест (что, на мой взгляд, стилистически лучше, чем связывание всего кода в HTML)
- Он обеспечивает согласованный интерфейс для построения модулей
- Модулям легко зависеть от других модулей (поэтому я мог бы написать, например, API, который требует jQuery, поэтому я могу использовать
jQuery.ajax()
- Загруженный javascript имеет область видимости, то есть я могу загрузить с помощью
var dsp = require("dsp.js");
и я смог бы получить доступ кdsp.FFT
, что не помешало бы моему локальномуvar FFT
Мне еще предстоит найти библиотеку, которая делает это эффективно. Обходные пути, которые я имею в виду:
-
coffeescript-concat - достаточно просто потребовать другие js, но вы должны скомпилировать его, что означает, что он менее велик для быстрой разработки (например, создание API-интерфейсов в тесте)
-
RequireJS - он популярен, прост и решается 1-3, но отсутствие обзора - это реальный развязка (я считаю, что head.js похож на то, что ему не хватает обзора, хотя у меня никогда не было возможности его использовать. Точно так же LABjs может загружаться, а
.wait()
проблемы с зависимостями, но по-прежнему не делает видимости)
Насколько я могу судить, существует множество решений для динамической и/или асинхронной загрузки javascript, но они, как правило, имеют те же проблемы, что и при загрузке js из HTML. Больше всего на свете я хотел бы загрузить javascript, который вообще не загрязняет глобальное пространство имен, но все же позволяет мне загружать и использовать библиотеки (так же, как это требует узел).
EDIT (MY ANSWER): С момента написания этого, я широко использовал RequireJS (который теперь имеет гораздо более четкую документацию). Требование действительно было правильным выбором, на мой взгляд. Я хотел бы уточнить, как система работает для людей, которые так же запутались, как и я:
Вы можете использовать require
в повседневной жизни. Модуль может быть любым, возвращаемым функцией (как правило, объектом или функцией) и определяется как параметр. Вы также можете скомпилировать свой проект в один файл для развертывания с использованием r.js
(на практике это почти всегда быстрее, хотя require
r.js
скриптов).
Основное различие между RequireJS и node-style требует, например, браузера (классный проект, предложенный tjameson), так это то, как модули разрабатываются и требуются:
- RequireJS использует AMD (определение модуля Async). В AMD
require
получить список модулей (файлы javascript) для загрузки и функцию обратного вызова. Когда он загружает каждый из модулей, он вызывает обратный вызов с каждым модулем в качестве параметра для обратного вызова. Таким образом, он действительно асинхронен и поэтому хорошо подходит для Интернета. - Узел использует CommonJS. В CommonJS
require
блокирующий вызов, который загружает модуль и возвращает его как объект. Это отлично работает для узла, потому что файлы считываются с файловой системы, что достаточно быстро, но работает плохо в Интернете, потому что загрузка файлов синхронно может занять гораздо больше времени.
На практике многие разработчики использовали Node (и, следовательно, CommonJS), прежде чем они увидели AMD. Кроме того, многие библиотеки/модули написаны для CommonJS (путем добавления вещей к объекту exports
), а не для AMD (путем возврата модуля из функции define
). Поэтому многие разработчики, основанные на узлах, хотят использовать библиотеки CommonJS в Интернете. Это возможно, так как загрузка из <script>
блокируется. Такие решения, как браузер, используют модули CommonJS (Node) и завершают их, чтобы вы могли включать их с помощью тегов скриптов.
Поэтому, если вы разрабатываете свой собственный многофайловый проект для Интернета, я настоятельно рекомендую RequireJS, поскольку он действительно является модульной системой для Интернета (хотя при честном раскрытии я считаю AMD намного более естественным, чем CommonJS). В последнее время различие стало менее важным, так как RequireJS теперь позволяет существенно использовать синтаксис CommonJS. Кроме того, RequireJS можно использовать для загрузки модулей AMD в Node (хотя я предпочитаю node-amd-loader).