Подтвердить что ты не робот

Как конвертировать многофайловое приложение node.js в один файл?

Если у меня есть приложение node.js, которое заполнено многими операторами require, как я могу скомпилировать это в один файл .js? Я должен вручную разрешить операторы require и убедиться, что классы загружены в правильном порядке. Есть ли какой-нибудь инструмент, который делает это?

Позвольте пояснить.

Код, который выполняется на node.js, не является node конкретным. Единственное, что я делаю, не имеет прямого эквивалента браузера, использует require, поэтому я спрашиваю. Он не использует ни одну из библиотек node.

4b9b3361

Ответ 1

Вы можете использовать webpack с целью: 'node', он будет встраивать все необходимые модули и экспортировать все как единый, автономный, один файл, модуль nodejs

http://webpack.github.io/docs/configuration.html#target

Ответ 2

Если вы хотите отправить общий код в браузер, я лично рекомендовал бы что-то вроде brequire или requireJS, который может "скомпилировать" ваш источник nodeJS в асинхронном порядке загрузки кода при сохранении порядка.

Для реального компилятора в один файл вы можете уйти с одним для requireJS, но я бы не стал доверять ему с большими проектами с высокой сложностью и краями.

Не должно быть слишком сложно написать файл, например package.json, который npm использует для указания, в каком порядке файлы должны появляться в вашей упаковке. Таким образом, ваша ответственность за то, чтобы все было уплотнено в правильном порядке, затем вы можете написать упрощенное приложение node для чтения вашего файла package.json и использует файл IO для создания скомпилированного script.

Автоматическое создание порядка, в котором файлы должны быть упакованы, требует создания дерева зависимостей и выполнения большого количества разбора файлов. Это должно быть возможно, но это, вероятно, произойдет сбой по круговым зависимостям. Я не знаю никаких библиотек, чтобы сделать это для вас.

Ответ 3

НЕ используйте requireJS, если вы цените свое здравомыслие. Я видел, как он использовался в довольно большом проекте, и это была абсолютная катастрофа... может быть, худший технический выбор, сделанный в этой компании. RequireJS предназначен для работы в браузере и для асинхронной и рекурсивной загрузки зависимостей JS. Это ТЕЗНАЯ идея. Браузеры сосать при загрузке много-много маленьких файлов по сети; каждый одиночный doc о производительности веб-сайта расскажет об этом. Таким образом, вы очень быстро в конечном итоге нуждаетесь в решении разбить ваши JS файлы вместе... в какой момент, в чем смысл наличия механизма разрешения зависимостей в браузере? И хотя ваш производственный сайт будет разбит на один JS файл, с requireJS, ваш код должен постоянно предполагать, что любая зависимость может быть или не быть загружена; в сложном проекте это приводит к тысячам асинхронных нагрузочных барьеров, перекрывающих каждую точку взаимодействия между модулями. В моей последней компании у нас было несколько мест, где стек закрытия был на 12+ уровней. Все, что логика "если загружена" делает ваш код более сложным и сложным в работе. Он также раздувает код, увеличивая количество байтов, отправленных клиенту. Кроме того, клиент должен загрузить библиотеку requireJS, которая сжигает еще 14.4k. Только размер должен рассказать вам об уровне ползучести функции в проекте requireJS. Для сравнения, весь инструментарий underscore.js - всего 4k.

То, что вы хотите, - это шаг времени компиляции для разгрома JS вместе, а не супертяжелый фрейм, который будет запущен в браузере.

Вы должны проверить https://github.com/substack/node-browserify

Browserify делает именно то, что вы просите.... объединяет несколько модулей NPM в один JS файл для распространения в браузере. Сводный код функционально идентичен исходному коду, а служебные данные являются низкими (приблизительно 4k + 140 байт на дополнительный файл, включая строку require ('file')). Если вы придирчивы, вы можете вырезать большую часть этого 4k, что обеспечивает обертки для эмуляции общих глобальных переменных node.js в браузере (например, "process.nextTick()" ).