[关闭]
@FunC 2017-03-07T20:01:12.000000Z 字数 1233 阅读 2028

JavaScript模块化简单记录

JavaScript


记录一下JavaScript的各种模块化

0.不使用模块化时期

  1. 大量充斥着全局变量,易出现命名冲突
  2. 因为是全局变量,全局均可访问,易污染

1. 利用闭包(揭示式模块化)

简单来说就是下面这样:

  1. var moduleName = (function (anotherName){
  2. var innerValue = 10;
  3. function innerMethod(num){
  4. return innerValue * num;
  5. }
  6. return{
  7. value: innerValue,//指向innerValue这个值
  8. myMethod: innerMethod//指向innerMethod这个函数的指针
  9. }
  10. })(injectValue);

moduleName就是暴露在全局的模块名,模块通过把内部变量与函数的指针写进对象字面量,return到全局变量moduleName
优点:接口清晰,简单易写
缺点

2.1 CommonJS ---诞生于浏览器之外的解决方案

CommonJS规范采用同步加载模块的策略

Node.js就是采用CommonJS规范来实现模块依赖的。

该规范规定每个JavaScript文件就是一个独立的模块上下文,在这个文件中默认创建的属性都是私有的
向外暴露借口时,通过module.exports对象来暴露(此处module对象时CommonJS规范规定的类似global的对象)
优点

缺点

2.2 AMD ---浏览器端的模块化异步解决方案

直接来看AMD模块的使用方式吧:

  1. define(['myModule', 'myOtherModule'], function(myModule, myOtherModule) {
  2. console.log(myModule.hello());
  3. });

典型的通过回调实现异步加载的方式。

通过define函数,传入两个参数。第一个参数是要所需依赖组成的数组,第二个参数是回调函数,以前面那个数组的元素作参数。

同时,define 既是一种引用模块的方式,也是定义模块的方式。

2.3 UMD ---通用模块定义

简单来说就是先判断是否支持AMD,再判断是否支持CommonJS,否则为window环境

3 ES6模块

官方原生支持的模块化手段。

浏览器虽然没完全支持,但已可以通过Babel编译实现

ES6原生模块功能语法简约,支持异步加载、支持循环依赖、支持部分方法导出等

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注