ES6以後引入import 或者使用Commonjs的方式引入模塊,在將來方向上將替換Requirejs是必然的。javascript
一個產品是否選用ES6來開發仍然須要面臨不少問題。css
<1>.ES6還不能爲瀏覽器所有識別,發佈以前要編譯,調試起來比瀏覽器上提示覆雜得多。html
<2>.應用ES6 必然要必定的高水平的開發資源,ES6 ,webpack等構建工具都須要必定的學習曲線。java
<3>.老項目基本上很難遷移,那意味着不少組件極可能要從新書寫。node
因此requirejs任然是開源模塊加載器首選。jquery
1.聲明不一樣js文件之間的依賴webpack
2.能夠按需、並行、延時載入js庫git
3.可讓咱們的代碼以模塊化的方式組織github
<script data-main="js/app.js" src="js/require.js"></script>
其中data-main中對應的路徑是Requirejs配置的主入口, data-main和 src中路徑都是相對html的路勁,或者是絕對路徑web
requirejs.config({ baseUrl:'js/lib', paths :{ app:'../app' } }); require(["app/start"], function(app) { app.hello(); });
2.1 baseUrl爲模塊(module)的根目錄,若是require(依賴) 的模塊直接是用文件名做爲id的會直接在這個目錄尋找同名文件資源
2.2 paths 中的屬性能夠給不一樣的路徑或者文件別名,若是require(依賴) 的模塊使用路徑做爲id的時候能夠 經過別名匹配path中路徑,
requirejs提供了多種定義模塊的方式,可使用/不使用依賴,返回變量,返回對象,函數,可以使用CommonJs的方法在export,module中返結果
本例中是定義了一個無依賴的模塊
define([], function() { return { hello: function() { alert("hello, world"); } } });
還有一種定義了模塊id 的定義方式,如:jquery源代碼中的,申明過id的不能直接使用path定義其餘別名訪問
if ( typeof define === "function" && define.amd ) { define( "jquery", [], function() { return jQuery; } ); }
如官網中例子 ,把backbone.js引入拋出Backbone做爲模塊名引入,dept中申明它須要的依賴,backbone依賴underscore 和jquery
requirejs.config({ shim: { 'backbone': { deps: ['underscore', 'jquery'], exports: 'Backbone' }, 'underscore': { exports: '_' } } });
對於不依賴於requirejs的庫, 除了把js改成require.js的amd方式書寫,還能使用shim來拋出全局對象。
/* util.js */
function util(){ alert("i am util"); }
/** app.js **/
requirejs.config({ baseUrl:'js/lib', paths :{ app:'../app', util:'../util' }, shim:{ util: { exports: 'util' } } }); require(["util"], function(util) { util(); });
暴露多個全局函數
/* util.js */
function util() { alert("hello, util~"); } function util2() { alert("hello, util2~"); }
/** app.js **/
requirejs.config({
baseUrl:'js/lib',
paths :{
app:'../app',
util:'../util'
},
shim:{
util: {
init: function() {
return {
util: util,
util2: util2
}
}
}
}
});
require(["util"], function(util) {
util.util();
util.util2();
});
5.關於打包壓縮,requirejs官方提供了一套打包工具r.js 只要配置對應的build.js能夠幫助咱們自動化構建
具體例子 https://github.com/volojs/create-template
build.js如何配置能夠參考 Richard Chen的翻譯 http://www.chenliqiang.cn/node/22
官網配置說明http://requirejs.org/docs/optimization.html
5.1 構建js
{ "appDir": "../www", //打包前目錄 "mainConfigFile": "../www/app.js", //打包入口文件 "dir": "../www-built", //打包後生成文件 "modules": [ //注意若是要分包,把依賴和主文件分開,需參考modules 第⑶種配置 { "name": "app" //指定生產文件的文件名 } ] }
運行命令
node tools/r.js -o tools/build.js
5.2構建css文件
須要一個css文件使用@import 包含全部依賴的css文件,
@import "bootstrap.min.css"; @import "font-awesome.min.css"; @import "main.css";
node build/r.js -o cssIn=../www/css/styles.css out=../www-built/css/all.css optimizeCss=standard
若是構建多頁面,以及構建多頁面使用shim的,請參考官網例子
https://github.com/requirejs/example-multipage
https://github.com/requirejs/example-multipage-shim
主要是配置modules來處理模塊加載,分包,給頁面和資源文件重命名。
其中 step order在新版本中已經不支持了,il8n作國際化的,domReady 敢於引入其餘amd加載器。
text.js 能夠配置依賴css ,htm等模版文件,支持html或者模版ajax加載,我和我工做過的一家公司用過這個插件,多模塊化十分好用,後臺系統能夠常常讓用戶清空緩存的能夠用
可是用r.js來構建的時候會悲劇,最主要的是css合併的問題,使用這種方式加載css合併後十分不友好的,畢竟css都是顆粒加載經來的,發佈新版本css資源文件爲了防止緩存常常會使用路徑加版本號,或者文件md5更名,
https://github.com/requirejs/requirejs/wiki/Plugins