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