Как я могу «требовать» модули CommonJS в браузере?

Каков наилучший способ загрузки модулей CommonJS в качестве кода JavaScript на стороне клиента в браузере?

Модули CommonJS помещают свою функциональность в пространство имен module.exports и обычно включаются с использованием require(pathToModule) в сценарии на стороне сервера. . Загрузка их на клиенте не может работать так же (require нужно заменить, нужно учитывать асинхронность и т.д.).

Я нашел загрузчики модулей и другие решения: Browserify, RequireJS, yabble и т. д. или способы просто изменить модули. Какой способ вы считаете лучшим и почему?


person travelboy    schedule 27.09.2011    source источник
comment
вы можете попробовать github.com/component/component   -  person Jonathan Ong    schedule 10.05.2013
comment
@JonathanOng С 2015 года компонент устарел.   -  person mgthomas99    schedule 01.02.2018
comment
По состоянию на 2018 год некоторые ответы устарели, а веб-пакет не упоминается. Webpack был бы другим решением. Основываясь на чтении различных решений, веб-пакет становится все более и более используемым/рекомендуемым. Это PITA для изучения, но очень мощный и, начиная с Webpack V4, с хорошей архитектурой для решения проблемы транспиляции/упаковки.   -  person PatS    schedule 30.05.2018


Ответы (6)


В прошлом я активно использовал RequireJS (реализация на BBC iPlayer в 2010 году), и это работает хорошо. Он может работать с модулями CommonJS, но ему нужна дополнительная оболочка, что меня раздражает.

Если вы хотите использовать эти модули и в Node.js, вам также нужно использовать RequireJS на стороне сервера, что мне не нравится делать, поскольку это не идиоматический код JavaScript Node.js.

Я использовал webmake и Browserify в прошлом году в нескольких проектах. Поначалу этап компиляции меня отталкивал, но, активно используя его в этом году, могу сказать, что это не проблема.

В Browserify включена функция часов, которая работает очень хорошо. Webmake можно подключить к наблюдателю (например, watchr) или использовать webmake-middleware, который можно использовать как часть приложения Express.js или подключения. Это имеет то преимущество, что вместо компиляции JavaScript при каждом сохранении он компилируется только тогда, когда вы действительно запрашиваете его.

Connect упрощает создание сервера (также статического), поэтому вы можете создать крошечный статический узел .js для обслуживания ваших файлов, если вы хотите разработать свой интерфейс без бэкэнда.

Бонус: нет необходимости в скрипте сборки, так как вы всегда имеете дело со встроенным кодом.

person gillesruppert    schedule 29.09.2012

Вот полный список ваших текущих вариантов, упорядоченных по их популярности (количеству наблюдателей) на GitHub:

Варианты использования require() в браузере (архив Wayback Machine )

person Bruiser    schedule 06.03.2012
comment
Если вы управляете вышеуказанным, рассмотрите возможность добавления urequire.org в список инструментов. - person Angelos Pikoulas; 01.07.2013
comment
Страница не найдена - person Mark K Cowan; 18.04.2015
comment
Ответы только по ссылкам не разрешены, потому что они могут, гм... сломаться в будущем (правда??). Пожалуйста, укажите соответствующую информацию в своем ответе. - person Flimzy; 18.08.2015

Используйте Browserify.

Его описание: Требование() на стороне браузера для ваших узловых модулей и пакетов npm, которое звучит так, как вам нужно.

person Kevin McTigue    schedule 28.09.2011
comment
Существует также browservefy, который создаст ваш пакет по требованию. Это делает рабочий процесс немного более плавным. - person Olical; 19.06.2013
comment
Browservefy теперь устарел и предлагает вместо этого использовать npmjs.com/package/beefy beefy. - person StackExchange What The Heck; 29.07.2015

компилятор CommonJS.

Почему? Он отлично работает с модулями Node.js (CommonJS) /treat module точно так же, как и Node.js, а с UMD вносит минимум дополнительного кода в скомпилированный JavaScript, позволяет экспортировать глобальные переменные сторонних библиотек, не затрагивая их код, исходные карты и трюк, который другие не могут сделать:

var str = require( "lorem-ipsum.txt" );
console.log( str );

Выход:

 Lorem ipsum dolor
 sit amet, consectetur
 adipiscing elit. Morbi...

Вот слайды: https://speakerdeck.com/dsheiko/modular-javascript-with-commonjs-compiler

person Dmitry Sheiko    schedule 27.01.2015
comment
Что такое UMD? - person Peter Mortensen; 30.12.2020
comment
Определение универсального модуля github.com/umdjs/umd - person Dmitry Sheiko; 01.01.2021

Webmake — один из вариантов. Я использую его для упаковки приложения, состоящего из более чем 200 модулей из более чем 20 пакетов. Оно работает.

Если вы хотите увидеть пример, проверьте: Менеджер плейлистов SoundCloud. Это строго на стороне клиента и создано с помощью Webmake.

person Mariusz Nowak    schedule 26.07.2012

Не могу сказать, что пробовал другие перечисленные вами здесь, но мне нравится RequireJS, потому что:

  • Он работает аналогично CommonJS.
  • Его легко использовать
  • Он реализует некоторые из будущих новых стандартов
  • Вы можете использовать его в Node.js, чтобы использовать одни и те же файлы на сервере и клиенте.
  • Он включает в себя минификатор/упаковщик для развертывания в рабочей среде.
  • У него есть плагины. Плагин Text, позволяющий загружать HTML-файлы, очень полезен для больших приложений.
person evilcelery    schedule 27.09.2011
comment
После некоторого использования RequireJS я планирую перейти на Browserify. RequireJS по-прежнему хорош, но я дошел до того, что мне нужно было начать действительно делиться определенными модулями между Node и браузером, и это проще сделать, написав соответствующие модули CommonJS. - person evilcelery; 03.05.2012
comment
CommonJS и requireJS — это две разные модульные системы. Есть ли способ сделать их совместимыми или автоматически конвертировать из одного формата в другой? - person Anderson Green; 04.01.2013
comment
RequireJs — это только одна модульная система определенного формата модулей (AMD). Единственный инструмент, который действительно устраняет несовместимости модульной системы (commonjs/AMD), — это github.com/anodynos/urequire. Он преобразуется в UMD, который работает везде. (примечание: я его автор) - person Angelos Pikoulas; 01.07.2013
comment
Это не отвечает на вопрос. - person Indolering; 16.02.2014
comment
что вы можете сделать, так это написать модули commonjs, а затем заставить сервер разработки и скрипт сборки обернуть эти модули в определения AMD, чтобы исходный код был CJS, но при запросе в браузере он работал как AMD - person Misha Reyzlin; 23.03.2014
comment
Конечно, вы можете использовать require.js с node.js, который я использую прямо сейчас и обмениваюсь файлами между клиентом и сервером... - person Totty.js; 09.09.2014
comment
@Indolering Вопрос буквально говорит What do you consider the best way and why? - person The Muffin Man; 25.02.2020