2013-12-14 25 views
9

我有越來越步兵用以下結構的一個項目進行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/*.jsstatic/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/目錄中的最後一個文件,而不是每個單獨的文件。異步問題?

回答

11

解決,通過將多套方案的requirejs任務,感謝this article爲最終指針我需要:

module.exports = function(grunt) { 
    var files = grunt.file.expand('static/js/apps/*.js'); 
    var requirejsOptions = {}; 

    files.forEach(function(file) { 
     var filename = file.split('/').pop(); 
     requirejsOptions[filename] = { 
      options: { 
       baseUrl: 'static/js/', 
       include: './apps/'+filename, 
       out: 'static/js/build/'+filename 
      } 
     }; 
    }); 

    grunt.initConfig({ 
     pkg: grunt.file.readJSON('package.json'), 
     requirejs: requirejsOptions, 
    }); 
}; 

然後['requirejs']任務可以照常運行,並會輸出適當編譯js文件按每個requirejsOptions中指定的options: {}塊,例如:

grunt.registerTask('default', ['requirejs']);

0

您需要的baseUrl從應用在requirejs改變靜態/ JS構建配置。由於目前baseUrl指向應用程序目錄,因此require正試圖搜索apps目錄中的依賴項文件。如果您將baseUrl更改爲static/js它會找到這些依賴項文件。

requirejs: { 
    compile: { 
     options: { 
     appDir: 'static/js/', 
     baseUrl: 'static/js', 
     dir: 'static/js/build/', 
     modules: [ 
      { 
       name: 'app', 
      } 
     ] 
     } 
    } 
    } 
+0

但是'baseUrl'與'appDir'相關,所以當加載'app'模塊時,requirejs將會在'/ static/js/static/js/app.js'中查找。 –

+0

對不起,我錯過了這一點。然後,您可以將BaseUrl更改爲__.__ baseUrl:「。」 – shree33

+0

謝謝。然而,在這種情況下,'module'需要更新爲'name:'apps/app''。這導致'static/js'的全部內容被複制到'static/js/build'中。 –