简单记录JS模块化,主要存在以下几类。

一、CommonJS

诞生于Node社区,只能在服务端使用;

特点:一个文件为一个模块,通过module.exports方式暴露出模块接口,通过require方式引用;

由于在node环境中引用,相当于引用本地文件,属于同步执行方式;

CommonJS代码示例:

var EventEmitter = require('events').EventEmitter;

var mixin = reuqire('merge-descriptors');

var Route = require('./router');

exports = module.exports = createApplication; // 对外暴露该方法

 

二、AMD

Async Module Definition;

使用define定义模块;

使用require加载模块;

AMD规范代表 RequireJS;

特点:依赖前置,提前执行;

AMD代码示例:

define(

  'alpha', // 模块名, 模块名称可省略

  ['require', 'exports', 'beta'], // 依赖

  // 模块输出

  function (require, export, beta) {

    exports.verb =  function() {

      return beta.verb();

      // 或者

      return require('beta').verb();

  }

);

 

三、CMD

全称: Common Module Definition

特点为: 一个文件为一个模块, 尽可能的懒执行;

定义方式: 使用define来定义一个模块;

使用方式:通过require来加载一个模块;

CMD规范代表:SeaJS

CMD代码示例:

define(function(require, exports, module) {

  var $ = require('jquery);

  var Spining = require('./spinning');

  使用exports.doSomething = ...

  或module.exports = ...

});

 

四、UMD

UMD全称为: Universal Module Definition;

是一个通用解决方案

UMD实质为做了三件事

  1.判断是否支持AMD;

  2.判断是否支持CommonJS

  3.如果都没有,则使用全局变量

UMD代码示例:

(function (root, factory) {

  if  (typeof define === 'function' && define.amd) {

    // 如果满足AMD规范,则使用AMD规范 

    define([], factory);

  }  else if (typeof exports === 'object') {

    // 判断是否满足CommonJS

    module.exports = factory();

  } else {

    root.returnExports = factory();

  }

}(this, function() {

  return {};

});

 

五、ES6 module

EcmaScript Module

一个文件一个模块;

通过export暴露,import 引入;

代码示例:

import theDefault, {named1, named2} from 'src/mylib';

export const Test = ‘test’

export default Named = 'Named';

 

ps: webpack 支持三种类型: AMD, ES Modules(推荐), CommonJs