1.CommonJS
适用于服务端,node.js遵循该规范,运行时加载,同步加载模块,服务端数据存放于本地,同步加载避免异步加载引起的“假死”状态。不重复引用模块,直接获取导出的数据,导出的数据是值的拷贝
//导出语法
module.exports = { A , B , C }
//或
exports.A = A;//等价于给该导出添加属性方法
//导入语法
let {A} = require('./file1')
2.AMD
适用于浏览器环境,requireJS遵循该规范,异步加载,依赖必须前置!提前执行
define里的模块名和依赖选项可选,模块名驼峰命名,无扩展名
//定义AA.js及导出
define('moduleName',['A','B'],function(arg){ //"AA"前置
function fn1(){}
return { fn1 }
})
//导入及使用
require(['moduleName'],function(fn){fn.fn1()})
3.CMD
适用于浏览器环境,seajs遵循该规范,异步加载,采用就近规则,可动态引入模块,延迟执行
define(function(require,exports,module){
let fn1 = require('./file1') //动态引入
...
module.exports = function(){} //导出
//或 exports.fn2 = funtion(){}
})
4.ES6
适用于浏览器环境,编译时执行( import 不可动态引入),不重复引用模块,导出的是值的引用 ,只读,源数据改变时,引用的数据也跟着改变
注: import() 基于Promise,可动态加载模块,也可用 all() 方法指定等待所有模块加载完毕再执行
//导入
import {a, b, c} from './file1';
//导出
export {a, b, c}
//import()
let a1 = 1,a2 = 2;
if(a2){
import('./file1').then(({f1})=>{
console.log(f1)
})
}
Promise.all([
import('./file1'),
import('./file2')
]).then(([{a},{b}])=>{
console.log(a,b)
})