模块化
IIFE
立即执行函数(IIFE)是以前主流的模块化方案,比如 Jquery
就使用该方案。
// 定义模块
(function (window) {
function A() {
return 'aaa'
}
function B() {
return 'bbb'
}
window.myModule = {A, B}
})(window)
// 使用模块
myModule.A()
AMD
很久以前的一种模块化方案,类似的方案还有CMD。需要额外安装 require.js
库,使用 define
定义模块,使用 require
加载模块。
现在基本不用。
CommonJS模块
和ES
模块是目前最主流的两个模块化方案。
// a.js
function getName() {
return 'Akara'
}
module.exports = getName
// b.js
const getName = require('./a')
getName() // 'Akara'
require
可以简单看作包了一层立即执行函数,该立即执行函数返回了那个模块的 module.exports
const getName = require('./a')
// 等价于
const getName = (function () {
function getName() {
return 'Akara'
}
module.exports = getName
// 返回module.exports
return module.exports
})()
模块内部有 module
和 exports
两个变量,其中 module.exports
和 exports
指向同一片内存。
又因为我们模块实际返回的是 module.exports
,所以如果直接对 exports
变量重新赋值肯定是错误的操作。
module: {
id: '.'
exports: {}
}
UMD
UMD
是上述三种模块化方案 IIFE
、AMD
、CommonJS
的结合,即用来兼容多套模块化系统。
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// 如果支持AMD模块化
define(['b'], factory);
} else if (typeof module === 'object' && module.exports) {
// 如果支持CommonJS模块化
module.exports = factory(require('b'));
} else {
// 如果以上两种都不支持,设置全局变量来保存模块内容
root.returnExports = factory(root.b);
}
}(this, function (b) {
// 模块的业务代码放在这
return {}
}));
ES模块
通常我们把.mjs
文件视为ES