模块化CommonJS、AMD、CMD、ES6
参考链接:https://juejin.cn/post/6844903576309858318
一、 commonjs(node实现、缓存值(浅拷贝),同步,运行时加载)
同步加载模块
- module.export
- require
// 定义模块math.js
var basicNum = 0;
function add(a, b) {return a + b;
}
module.exports = { //在这里写上需要向外暴露的函数、变量add: add,basicNum: basicNum
}// 引用自定义的模块时,参数包含路径,可省略.js
var math = require('./math');
math.add(2, 5);// 引用核心模块时,不需要带路径
var http = require('http');
http.createService(...).listen(3000);
二、AMD(requireJS、异步、回调执行,可依赖其他模块、依赖前置、提前执行)
异步加载,允许指定回调函数所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
- require.config()指定引用路径等
- define()定义模块
- require()加载模块。
/** 网页中引入require.js及main.js **/
<script src="js/require.js" data-main="js/main"></script>/** main.js 入口文件/主模块 **/
// 首先用config()指定各模块路径和引用名
require.config({baseUrl: "js/lib",paths: {"jquery": "jquery.min", //实际路径为js/lib/jquery.min.js"underscore": "underscore.min",}
});
// 执行基本操作
require(["jquery","underscore"],function($,_){// some code here
});
如果我们定义的模块本身也依赖其他模块,那就需要将它们放在[]中作为define()的第一参数。
// 定义math.js模块
define(function () {var basicNum = 0;var add = function (x, y) {return x + y;};return {add: add,basicNum :basicNum};
});
// 定义一个依赖underscore.js的模块
define(['underscore'],function(_){var classify = function(list){_.countBy(list,function(num){return num > 30 ? 'old' : 'young';})};return {classify :classify};
})// 引用模块,将模块放在[]内
require(['jquery', 'math'],function($, math){var sum = math.add(10,20);$("#sum").html(sum);
});
三、CMD(seajs、异步执行,依赖就近,延迟执行)
它与AMD很类似,不同点在于:AMD 推崇依赖前置、提前执行,CMD推崇依赖就近、延迟执行
/** AMD写法 **/
define(["a", "b", "c", "d", "e", "f"], function(a, b, c, d, e, f) { // 等于在最前面声明并初始化了要用到的所有模块a.doSomething();if (false) {// 即便没用到某个模块 b,但 b 还是提前执行了b.doSomething()}
});/** CMD写法 **/
define(function(require, exports, module) {var a = require('./a'); //在需要时申明a.doSomething();if (false) {var b = require('./b');b.doSomething();}
});/** sea.js **/
// 定义模块 math.js
define(function(require, exports, module) {var $ = require('jquery.js');var add = function(a,b){return a+b;}exports.add = add;
});
// 加载模块
seajs.use(['math.js'], function(math){var sum = math.add(1+2);
});
四、es6模块加载 (异步执行,可全部、也可以单个加载,输出是值的引用,编译时加载)
异步加载
- import
- export
- export default
差异:
1. CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
2. CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
3. CommonJS加载的是整个模块,将所有的接口全部加载进来,ES6 Module可以单独加载其中的某个接口;
4. CommonJS 模块模块在首次执行后就会缓存,再次加载只返回缓存结果