JavaScript模块化
浏览器端的模块,不能采用”同步加载”(synchronous),只能采用”异步加载”(asynchronous).
AMD是”Asynchronous Module Definition”的缩写,即”异步模块定义”.采用异步方式加载模块,模块的加载不影响它后面语句的运行,所有依赖这个模块的语句,都定义在同一个回调函数中,等到加载完成之后,这个回调函数才会运行.
AMD采用require()语句加载模块,要求两个参数
// require([module], callback);
// [module]是一个数组,里面的成员就是要加载的模块
// callback是加载成功之后的回调函数.
require(['math'], function(math){
//要执行的语句
});
要执行的语句和math模块加载是不同步的,浏览器不会发生假死,AMD比较适合浏览器环境.
- require.js curl.js 原生写法
<script src="1.js"></script>
<script src="2.js"></script>
<script src="3.js"></script>
<script src="4.js"></script>
<script src="5.js"></script>
- requirejs缺点:
1.加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长
2.js文件之间存在依赖关系,因此必须严格保证加载顺序,(1.js要在2.js前面),依赖性最大的模块一定要放到最后加载.
- requirejs优点:
1.实现js文件的异步加载,避免网页失去响应;
2.管理模块之间的依赖性,便于代码的编写和维护.
<script src="js/require.js" defer async="true" ></script>
// async属性表明文件需要异步加载,避免网页失去响应,IE不支持async舒心,只支持defer.
<script src="js/require.js" data-main="js/main"></script>
// data-main:指定网页程序的主模块
require写法
require.config() // 对模块的加载行为进行自定义,写在主模块的头部.参数是一个对象,对象的paths属性指定各个模块的加载路径.
require.config({
paths: {
"jquery":"jquery.min",
"backbone":"backbone.min",
"underscore":"underscore.min"
}
})
// 上面三个模块默认和main.js在同一路径下(js子目录中).
// 若不同路径,假设三个模块在js/lib目录中.
// 第一种写法:
require.config({
paths:{
"jquery":'lib/jquery.min'
}
});
// 第二种写法:
require.config({
baseUrl: 'js/lib',
paths:{
'jquery': 'jquery.min'
}
});
// 第三种写法:
require.config({
paths:{
"jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
}
});
// require.js加载的模块必须按照AMD的规范来编写,模块必须采用特定的define()函数来定义,如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中.
// 模块:math.js
// math.js
define(function(){
var add = function(x, y){
return x+y;
};
return {
add: add
};
});
//main.js
require(['math'], function(math){
alert(math.add(1, 1));
});
- 如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明改模块的依赖性.
define(['myLib'], function(myLib){
function foo(){
myLib.doSomethig();
}
return{
foo: foo
};
});
require.js加载非规范的模块,在用require()加载之前,要先用require.config()方法定义它们的一些特征.underscore和backone两个库都没有采用AMD规范编写,如果要加载它们的话,就必须先定义它们的特征.
require.config({
shim:{
'underscore':{
exports:'_'
},
'backbone':{
deps: ['underscore', 'jquery'],
exports:'Backbone'
}
}
});
- shim:专门用来配置不兼容的模块,每个模块都要定义(1)exports值(输出的变量名),表明这个模块外部调用时的名称;(2)deps数组,表明该模块的依赖性.
- map:同一模块的不同版本,向下兼容老版本.
- config:给指定的模块传递一些有用的数据.
- enforceDefine:强制模块使用define定义
- errbacks:模块文件没有载入成功时的调用
- path:映射模块别名,可以配置为一个数组,顺序映射
require.js插件
// domready插件:让回调函数在页面DOM结构加载完成后再运行
require(['domready!'], function(doc){
//called once the DOM is ready
});
// text和image插件:允许require.js加载文本和图片文件
define([
'text!review.txt',
'image!cat.jpg'
],
function(){
console.log(review);
document.body.appendChild(cat);
});
// json插件:加载json文件
// markdown:加载markdown文件