У меня возникли вопросы, получать Grunt выполнять оптимизацию requirejs по проекту со следующей структурой:Grunt & requirejs оптимизатор для нескольких приложений проекта
static/js
|── apps
|── app.js
|── dash.js
|── news.js
... (many more 'app' files)
|── build
|── collections
|── libs
|── models
|── util
|── views
Каждый из static/js/apps/*.js
должен быть скомпилирован для static/js/build/*.js
, содержащей соответствующие зависимости (например, views/view1
, libs/query
и т. д.).
Это в настоящее время осуществляется основной Баш скрипт:
JS_ROOT="static/js"
for f in ${JS_ROOT}/apps/*
do
FILE=$(basename -s .js ${f})
pushd .
cd ${JS_ROOT} && r.js -o baseUrl=. name=libs/require-min.js include=apps/${FILE} out=build/${FILE}.js
popd
done
Я пытаюсь перейти к оптимизации Grunt основе, следующее в Grunt.js
:
requirejs: {
compile: {
options: {
appDir: 'static/js/',
baseUrl: './apps/',
dir: 'static/js/build/',
modules: [
{
name: 'app',
}
]
}
}
}
Running генерирует следующая ошибка:
>> Tracing dependencies for: app
>> Error: ENOENT, no such file or directory
>> 'static/js/build/apps/libs/jquery.js'
>> In module tree:
>> app
Я четко вижу, что проблема, но я не в состоянии понять, как указать, что зависимость в каждом static/js/apps/*.js
файле находится в static/js/
не static/js/build
В дополнении к этому, я предполагаю, что modules
блока, содержащий name: 'app'
следует выводить скомпилированный файл static/js/build/app.js
из содержания static/js/apps/app.js
.
Не создавая дополнительный module
блок для каждого файла в static/js/apps
, как я могу скомпилировать каждый из файлов в их соответствующий файл static/js/build/*.js
?
Update 1
Так следующее в моем Gruntfile компилирует static/js/apps/app.js
успешно в static/js/build/app.js
:
requirejs: {
compile: {
options: {
baseUrl: 'static/js/',
include: './apps/app.js',
out: 'static/js/build/app.js',
}
}
}
Следующий шаг в том, чтобы собрать static/js/apps/*.js
в static/js/build/*.js
без определения каждого индивидуально ...
Обновление 2
Модификация выше:
requirejs: {
compile: {
options: {
baseUrl: '../',
include: './apps/<%= appFile %>',
out: 'static/js/build/<%= appFile %>',
}
}
}
И создает задачу:
grunt.registerTask('buildrjs', function() {
var dir='static/js/apps/';
grunt.file.setBase(dir);
var files = grunt.file.expand(['*.js']);
files.forEach(function(filename) {
grunt.log.write('Compiling '+filename+'\n');
grunt.config.set('appFile', filename);
grunt.task.run('requirejs:compile');
});
});
Почти получает меня к решению. Задачи проходят через каждый файл в static/js/apps/
и передают имя файла в grunt.config.set('appFile', filename);
. Вывод результатов задачи Compiling app.js Compiling news.js...
и т. Д., Однако после этого фактические задачи requirejs:compile
выполняются над & поверх последнего файла в каталоге static/js/apps/
, а не в каждом отдельном файле. Асинхронный вопрос?
Но 'baseUrl' относится к' appDir', поэтому при загрузке модуля 'app' requirejs будет искать в'/static/js/static/js/app.js'. –
Извините, я пропустил этот момент. Затем вы можете изменить BaseUrl на __.__ baseUrl: "." – shree33
Спасибо. В этом случае, однако, 'module' потребуется обновление для' name: 'apps/app''. Это приводит к тому, что все содержимое 'static/js' копируется в' static/js/build'. –