【发布时间】:2014-01-02 05:50:49
【问题描述】:
我在让 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 等)。
目前这是由一个基本的 bash 脚本执行的:
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',
}
]
}
}
}
运行产生如下错误:
>> 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
除此之外,我假设包含name: 'app' 的modules 块应该从static/js/apps/app.js 的内容输出编译文件static/js/build/app.js。
如果不为static/js/apps 中的每个文件创建额外的module 块,我如何将每个文件编译成相关的static/js/build/*.js 文件?
更新 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/ 目录中的最后一个文件上运行,而不是每个单独的文件。异步问题?
【问题讨论】:
标签: javascript optimization requirejs task gruntjs