@FunC
2017-03-07T20:01:12.000000Z
字数 1233
阅读 2028
JavaScript
记录一下JavaScript的各种模块化
简单来说就是下面这样:
var moduleName = (function (anotherName){
var innerValue = 10;
function innerMethod(num){
return innerValue * num;
}
return{
value: innerValue,//指向innerValue这个值
myMethod: innerMethod//指向innerMethod这个函数的指针
}
})(injectValue);
moduleName就是暴露在全局的模块名,模块通过把内部变量与函数的指针写进对象字面量,return到全局变量moduleName
优点:接口清晰,简单易写
缺点:
CommonJS规范采用同步加载模块的策略
Node.js就是采用CommonJS规范来实现模块依赖的。
该规范规定每个JavaScript文件就是一个独立的模块上下文,在这个文件中默认创建的属性都是私有的
向外暴露借口时,通过module.exports
对象来暴露(此处module
对象时CommonJS规范规定的类似global
的对象)
优点:
require
时可以赋值给自己随意命名的局部变量中。缺点:
require
时是引入整个js文件,当只需要该模块某个方法时会引入大量无用代码(尤见于各种大型库中)直接来看AMD模块的使用方式吧:
define(['myModule', 'myOtherModule'], function(myModule, myOtherModule) {
console.log(myModule.hello());
});
典型的通过回调实现异步加载的方式。
通过define
函数,传入两个参数。第一个参数是要所需依赖组成的数组,第二个参数是回调函数,以前面那个数组的元素作参数。
同时,define
既是一种引用模块的方式,也是定义模块的方式。
简单来说就是先判断是否支持AMD,再判断是否支持CommonJS,否则为window环境
官方原生支持的模块化手段。
浏览器虽然没完全支持,但已可以通过Babel编译实现
ES6原生模块功能语法简约,支持异步加载、支持循环依赖、支持部分方法导出等