之前关于模块化开发用的一直是webpack,因为是在线预编译的,所以支持CMD和AMD写法,也支持ES6语法。
但是现在换了新公司,用的requirejs,之前没用过,现在记录一些关于requirejs的使用。
从基础的说起,关于模块化概念的引入,由于传统的标签加载会导致两个问题:
1.过多的js文件加载导致游览器渲染阻塞,大部分的时间都被拿去处理加载文件的事务了,网页在一段时间中失去了响应。
2.由于js文件之间存在着相互依赖的关系,依赖性最大的文件一定是最后加载的,随着js文件的增多,代码变得很难维护,这种感觉抽象的来说,就跟城乡结合部里错综复杂的网线一样缠绕在一起。
requirejs就是为了解决以上痛点而诞生的:
1.通过异步加载来避免网页阻塞失去响应的现象。
2.管理依赖,便于后期维护。
关于requirejs的使用:
1.正常的标签引入头部,可以写成这样 <script src="js/require.js" async="true"></script> 也是异步载入。
2.require(['moduleA','moduleB','moduleC'],function (moduleA,moduleB,moduleC) {})
当主模块依赖其他模块的时候,需要使用AMD规范来定义一个require函数,写法如上。
分析下,第一个参数,是一个数组形式的参数,数组里每一个元素,对应一个模块,既主模块是依赖于这三个模块的。第二个参数是一个回调函数,当指定模块被加载成功后,它将被调用,被加载的模块被当做参数传入,供函数内使用这些模块。require在加载这三个模块的时候是异步的,所以并不会影响游览器的继续响应,同时只有在加载完毕后才会回调函数,解决了依赖问题。
3.AMD模块的写法
允许requirejs加载的模块是必须采用AMD规范来书写的。书写格式,如果一个模块希望被加载成为requirejs模块,需要用define()来定义函数。
3.1当一个模块不依赖于其他模块的时候:
//math.js
define(function(){
var add = function (x,y){
return x+y;
};
return {
add: add
};
})
我们需要拿到的函数或者变量当做一个对象返回出来,把需要的都封装到字面量变量当中。
3.2 当一个模块依赖于其他模块define(['A','B'],function(A,B){}())
3.3 加载一个被注入进来的模块 require(['math.js'],function(){})
4.加载非规范模块
理论上,能够引用的加载模块都必须是按照AMD规范,通过define()函数定义的模块,但是也存在着一批不符合规范的流行库。当然可以也是可以加载这些模块的,只是需要进行require.config()处理,来定义一些特征。写法:
require.config({
shim:{
'underscore':{
exports:'_'
},
'backbone':{
deps:[''underscore'',''jquery''],
exports:'BackB'
}
}
})
解释:首先我们将这些非AMD模块的东西引入到shim属性中,然后每个模块定义一个exports,表明这个模块被调用时的名称。deps为依赖。
5.requirejs插件
define(['image!cat.jpg'],function(){})这样就被引入了。类似的插件还有text,json,mdown。
小结:以上内容都参考阮一峰的模块化编程。大体思路感觉es6差不多,但是es6可以自定义未声明模块的名称,require的话只能是文件名。还是觉得es6的更简单方便一些。如果再有什么使用心得再来更新了。