require

作者 新城 日期 2017-09-12
require

什么是AMD,CMD,CommonJS-

CommibJS

CommonJS规范是诞生比较早的。NodeJS就采用了CommonJS

1
2
var clock = require('clock');
clock.start();

AMD

AMD,即 (Asynchronous Module Definition),这种规范是异步的加载模块,requireJs应用了这一规范。先定义所有依赖,然后在加载完成后的回调函数中执行:

1
2
3
require(['clock'],function(clock){
clock.start();
});

AMD虽然实现了异步加载,但是开始就把所有依赖写出来是不符合书写的逻辑顺序的

CMD

CMD (Common Module Definition), 是seajs推崇的规范,CMD则是依赖就近,用的时候再require。它写起来是这样的:

1
2
3
4
define(function(require, exports, module) {
var clock = require('clock');
clock.start();
});

javascript模块化编程

1.原始方法封装函数

1
2
3
4
5
6
function m1(){
    console.log('原始写m1')
  }
  function m2(){
    console.log('原始写m2')
  }

优点:哪里使用直接调用
缺点:污染”了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。

2.对象写法

1
2
3
4
5
6
7
8
9
10
 var module1 = new Object({
    _count : 0,
    m1 : function (){
      console.log('封装对象方法 module1.m1()')
    },
    m2 : function (){
      //...
    }
  });
module1.m1()

缺点:会暴露所有模块成员,内部状态可以被外部改写

3.立即执行函数写法

1
2
3
4
5
6
7
8
9
10
11
12
13
 var module1 = (function(){
    var _count = 0;
    var m1 = function(){
      console.log('立即执行函数写法')
    };
    var m2 = function(){
    };
    return {
      m1 : m1,
      m2 : m2
    };
  })();
module1.m1()

缺点:外部代码无法读取内部的_count变量

4.放大模式

1
2
3
4
5
6
7
  var module2 = (function (mod){
    mod.m3 = function () {
      console.log('新添加的方法m3')
    };
    return mod;
  })(module1); //导入module1对象
module2.m3() //输出 '新添加的方法m3'

5.宽放大模式
在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用”宽放大模式”。

1
2
3
4
  var module1 = ( function (mod){
    //...
    return mod;
  })(window.module1 || {});

与”放大模式”相比,"宽放大模式"就是”立即执行函数”的参数可以是空对象。

  1. 输入全局变量
    使用频率较高
1
2
3
var module1 = (function ($, YAHOO) {
   //...
})(jQuery, YAHOO);

commonJs适用于服务器端
AMD适用于浏览器端