前端模块化的演变过程

67 阅读2分钟

前端模块化的演变过程

1. 用函数作为块

因为函数有自己的作用域,相对比较独立

2. namespace模式

使用对象作为独立块编程。

var myModule={
  a:1,
  b:2,
  add:function(m,n){...}
}

3. IIFE模式(立即执行函数)

使用立即执行函数来创建块,用window对象来向外暴漏接口

4. CommonJS

最开始出现的模块化方案是在node.js中实现的。node中的模块化方案是根据CommonJS规范实现的。CommonJS规定每个文件就是一个模块,以同步的方式引入其他模块。

//a.js
function add(m,n){
  return m+n;
}
module.exports={add:add}


//b.js
const {add} = require('./a.js');
console.log(add(1,2)); // 3

5. AMD和Require.js

CommonJS模块之前是同步引入的,这在服务端是没有什么问题的,因为文件都是保存在硬盘中,读取文件的速度是非常快的,同步加载带来的阻塞基本可以忽略不计。

因为有些模块用不用都会被引入。会带来一些浪费。

define(['a','b'],function(a,b){
  let sum = a.add(1,2);
  if(false){
    sum = b.add(1,2); //b模块是没有被使用的,应该是不需要执行模块内部代码的
  }
  return sum;
})

6. CMD和Sea.js

需要用到某个模块的时候,才用require引入,模块内部的代码也是在被引入的时候才会执行,声明的时候并没有执行。

//定义模块 math.js
define(function(require,exports,module){
  var a = require('./a.js'); // 引入模块
  function add(m,n){
    return m+n;
  }
  module.exports={
    add:add
  }
});

//加载模块
seajs.use(['math.js'],function(math){
  var sum = math.add(1,2);
})

7. ES Module

ES6开始,在语法标准上实现了模块化功能。简称ES Module ES Module是一种静态依赖的模块化方案,模块与模块之间的依赖关系是在编译期完成连接的。

//a.js
function add(m,n){
  return m+n;
}
export {add};

// b.js
import {add} from './a.js';
console.log(add(1,2)); //3

参考资料
前端模块化的演变过程