2014-06-10 63 views
3

由於現有應用程序具有javascript方面的範圍,結構更好,易於管理/理解和更好地管理需要爲網站的不同部分運行的腳本,因此我決定嘗試並實施RequireJS作爲解決方案。在現有的應用程序上實現RequireJS

我也使用grunt,我利用了grunt-contrib-requirejs現有的模塊,在一個地方管理它。

咕嚕

requirejs: { 
    options: { 
     baseUrl: "./", 
     mainConfigFile: "<%= project.scripts %>/build.js", 
     name: "<%= project.bowerDir %>/almond/almond", 
     out: "<%= project.scripts %>/main.min.js" 
    }, 

    debug: { 
     options: { 
      optimize: 'none' 
     } 
    }, 

    production: { 
     options: { 
      optimize: 'uglify2' 
     } 
    } 
}, 

build.js

requirejs.config({ 
    baseUrl: "/", 

    // automatically require on page load in debug mode 
    deps: ['assets/scripts/main'], 
    //deps: ['main'], 

    // automatically require this for production build 
    // insertRequire: ['assets/scripts/main'], 

    paths: { 
     "bower" : "../../../bower_components", 
     "module": "../modules", 

     "jquery"    : "bower_components/jquery/dist/jquery", 
     "jquery.ui"   : "assets/scripts/vendor/jquery-ui-1.10.3.custom.min", 
     "jquery.ui.touch-punch": "assets/scripts/vendor/jquery.ui.touch-punch.min", 
     "lazyload"    : "bower_components/jquery.lazyload/jquery.lazyload", 

     "swfobject"   : "assets/scripts/vendor/swfobject", 
     "cookie"    : "assets/scripts/vendor/jquery.cookie", 
     "query"    : "assets/scripts/vendor/jquery.query", 
    } 
}).call(this); 

// Load the main app module to start the app 
// requirejs(["app", "module/home"]); 

main.js

define([ 
    'jquery', 'jquery.ui', 'jquery.ui.touch-punch', 
    'lazyload', 'swfobject', 'cookie', 'query' 
    ], function (require) { 

    'use strict'; 

    $(function() { 
     alert('main.'); 
     // .... 
    }); 

}); 

所以,我到哪裏調用我的build.js(發展ENV點。 ..閱讀這篇文章:Grunt.js and Require.js - compiling with r.js)...

<script data-main="/assets/scripts/build" src="/assets/scripts/vendor/require.js"></script> 

因此,build.js被加載,然後main.js也被執行,alert被執行。到目前爲止,一切都很好......現在來的疑惑:

  • 我似乎無法理解如何與依賴工作(從jquerycookiequery)。我怎麼能期望他們已經加載?因爲在我的main.js上,我會調用這些庫,但由於它們未加載,我得到錯誤。
  • 比方說/articles我有articles.js,對於/profiles我有profiles.js。我將如何根據我需要/希望的頁面處理每個.jsmain.js是常用文件,但網絡中每個模塊都有單獨的.js文件。
  • 我錯過了什麼嗎?
+0

由於您剛剛開始使用RequireJS,因此我會暫停並瀏覽Browserify(http://browserify.org/)。它通過允許你像在NodeJS中那樣編寫require語句來完成所有事情(路徑,填充等)的猜測工作。 '$ = require('jquery')'就是你將jQuery分配給美元符號的方式,只要它是通過你的node_modules中的NPM加載的。想使用已經寫好的庫? 'module.exports'你回來的東西。它使Web組件非常棒。自從我找到它之後,我還沒有使用過RequireJS。 – iamjpg

+0

@iamjpg感謝您的建議。我會看看它 – Alex

回答

3

在requirejs中,您可以指定每個墊片的依賴性。 (http://requirejs.org/docs/api.html#config-shim

因此,如果文件a.js依賴文件b.js在加載之前存在,則可以指定對文件a的依賴關係。每次你需要文件時,它首先需要文件b。

例子:

requirejs.config({ 
baseUrl: "/", 

// automatically require on page load in debug mode 
deps: ['assets/scripts/main'], 
//deps: ['main'], 

// automatically require this for production build 
// insertRequire: ['assets/scripts/main'], 

paths: { 
    "a"    : "assets/scripts/vendor/a", 
    "b"    : "assets/scripts/vendor/b", 
}, 
shim: { 
    "a": { 
     deps: ["b"] 
    } 
} 

}).call(this); 
0

您需要提供有效的標識作爲定義回調(您的入口點)參數。 演示與縮短列表:

define([ 
    'jquery', 
    'jquery.ui', 
    'cookie' 

], function(
    $, 
    jQueryUI, 
    MyCookie 

) { 

    'use strict'; 

    alert($); //your local jQuery 
    jQueryUI.doSomething(); 
    MyCookie.fooBar('I was required'); 

}); 

標識符名稱是對您的選擇,但我建議堅持一些約定。 require.js中有更多,但這可能會讓你開始。

+0

我希望其他庫(如cookie)自動加載,無需一一調用,因爲它們中的一些 – Alex

+0

「我想要」不是有效的參數在JS編程中。您可以嘗試在第一次加載時將它們註冊爲全局變量,但它確實取決於這些庫本身。 – Ingmars

相關問題