объединить модули requirejs в один файл
Я пытаюсь объединить все мои требуемые модули и несколько текстовых шаблонов в один объединенный и уродливый main.минута.js, поэтому я могу включить этот файл в свой HTML.
я вычислил конкатенацию и уродливую часть. Тем не менее, я не могу запустить какой-либо код в браузере.
Я создал проект голой кости на github, чтобы воспроизвести проблему.
структура:- main.js .HTML-код
- log.js
- построить-производства
- lib / require.js
- node_modules/require/bin/r.js
я объединяю main.js, log.JS и требуют.js с помощью файла сборки build-production:
./node_modules/requirejs/bin/r.js -o build-production.js
main.js
require.config({
paths: {
requireLib : 'lib/require/require'
},
waitSeconds: 1000
});
console.log('loading main.js');
define(function(require) {
var log = require('log');
console.log('loaded')
log.fine('main loaded');
});
сборки-производства.js:
({
mainConfigFile : 'main.js',
include : [ 'requireLib' ],
name : 'main.js',
out : 'main.min.js' })
.HTML-код:
<script src="main.min.js" type="text/javascript"></script>
так индекс.HTML в браузер должен вывести
загрузка main.js
нагруженный загружено main
но он печатает только первую строку
загрузка main.js
кто-нибудь знает, почему это так?
2 ответов
я только что поближе изучил ваш код.
я не уверен, почему вы загружаете в минифицированный файл через:
<script src="main.min.js" type="text/javascript"></script>
это AMD модуль, следовательно, должен быть загружен с помощью загрузчика AMD (в противном случае define
не обрабатывается).
это работает:
<script type="text/javascript" src="lib/require/require.js"></script>
<script type="text/javascript">
require(['main.min'], function () {
require(['main'], function () {});
});
</script>
Edit: в то время как внешний требует нагрузок в минимизированном файле( содержащем все модули), вам также нужен второй, вложенный требуется загрузить фактический модуль, все еще известный как main.
это довольно вводит в заблуждение, имея один модуль с именем main а затем уменьшенная версия всех модулей с именем main.мин. Например, я мог бы ожидать main быть точно таким же, как main.мин, но без каких-либо оптимизаций, применяемых. Вы можете рассмотреть возможность переименования в нечто вроде:
- точки входа: myApp
- составлен (
optimize: 'none'
):main - составлен (
optimize: 'uglify2'
): main.мин
Edit 2: в файле build:
name: 'main.js'
→ name: 'main'
это сделает requirejs имя этого модуля main вместо:
define('main.js', ...);
→ define('main', ...);
теперь: require(['main'])
находит (и загружает) модуль с именем main в локальная область скомпилированного файла.
перед: require(['main'])
не нашел модуль под названием main (он был назван main.js), поэтому воспринимает его как имя файла и загружает ./main.js
.
Edit 3: вместо Edit 2 в файле сборки можно сохранить:
name: 'main.js'
и добавьте псевдоним пути к конфигурации сборки или времени выполнения config:
paths: { 'main' : 'main.js' }
(эта случайная мысль приходит без гарантии.)
поздно на вечеринку, но я подумал, что это будет полезно для других, которые могут искать аналогичное решение. И я решил разместить здесь документы.
есть еще browserify что делает именно то, что вы ищете. Его использование похоже на требуются (на npm), но вы можете использовать его на стороне браузера. Я нашел это полезным.