我有越來越步兵用以下結構的一個項目進行requirejs優化問題:咕嚕&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.js
如下:
requirejs: {
compile: {
options: {
appDir: 'static/js/',
baseUrl: './apps/',
dir: 'static/js/build/',
modules: [
{
name: 'app',
}
]
}
}
}
運行產生
這是目前正在由一個基本的bash腳本執行出現以下錯誤:
>> 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/build/app.js
來自static/js/apps/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/
目錄中的最後一個文件,而不是每個單獨的文件。異步問題?
但是'baseUrl'與'appDir'相關,所以當加載'app'模塊時,requirejs將會在'/ static/js/static/js/app.js'中查找。 –
對不起,我錯過了這一點。然後,您可以將BaseUrl更改爲__.__ baseUrl:「。」 – shree33
謝謝。然而,在這種情況下,'module'需要更新爲'name:'apps/app''。這導致'static/js'的全部內容被複制到'static/js/build'中。 –