寫過前端代碼大概率聽說過amd
cmd
umd
commonjs
esm
這些名詞, 想當(dāng)初我第一次看到這些的時候, 人都麻了, 都是些啥啊. 后來我知道了, 這些都是js的模塊規(guī)范.
目前成都創(chuàng)新互聯(lián)公司已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、玉龍網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
AMD全稱是Async Module Definition
異步模塊定義
RequireJs
是AMD模塊規(guī)范的一個具體實現(xiàn).
AMD中定義一個計算器模塊calculator
, 這個模塊依賴另一個名為math
的模塊
define('calculator', ['math'], function(math) {
return {
add: function(left, right) { return math.add(left, right) },
subtract: function(left, right) { return math.subtract(left, right) }
}
})
使用剛才定義的calculator
模塊
require('calculator', function(calculator) {
console.log('1 + 1 = ' + calculator.add(1, 1));
console.log('2 - 2 = ' + calculator.subtract(2, 1));
})
CMD全稱是Common Module Definition
即通用模塊定義,. 像AMD
與RequireJs
關(guān)系一樣, 與CMD
規(guī)范綁定的是sea.js
在定義模塊方面, CMD
和AMD
一樣通過define
函數(shù)來定義模塊; 兩者的主要區(qū)別在于對依賴的加載上, CMD
中不需要在define
的參數(shù)中直接聲明需要用到的模塊
還是以聲明calculator
模塊為例
define('calculator', function(require, exports) {
var math = require('math');
exports.add = function(left, right) { return math.add(left, right) };
exports.subtract = function(left, right) { return math.subtract(left, right) };
})
可以看到calculator
模塊所的依賴的math
模塊沒有在define
函數(shù)的參數(shù)中進行聲明, 而是通過require('math')
來引入的
使用calculator
模塊
seajs.use(['calculator'], function(calculator) {
console.log('1 + 1 = ' + calculator.add(1, 1));
console.log('2 - 2 = ' + calculator.subtract(2, 1));
})
定義math
模塊
module.exports = {
add: function(left, right) {
return left + right;
},
subtract: function(left, right) {
return left - right;
}
}
使用剛才定義的math
模塊, 并再定義一個calculator
模塊
const math = require('./math.js');
module.exports = {
add: math.add
}
amd
cmd
通常只能在瀏覽器中使用, commonjs
只能在服務(wù)端(Node)環(huán)境下使用, 這樣子搞會導(dǎo)致我們基于其中某一種模塊規(guī)范寫的js模塊無法在服務(wù)端和瀏覽器端進行復(fù)用. umd解決了這個問題, 它兼容并包, 使得使用此規(guī)范寫的js模塊既可以在瀏覽器環(huán)境下使用, 也可以在Node(服務(wù)端)環(huán)境中用
(function (root, factory) {
if (typeof exports === 'object' && typeof module === 'object')
// commonjs
module.exports = factory()
else if (typeof define === 'function' && define.amd)
// amd
define([], factory)
else if (typeof exports === 'object')
// commonjs
exports['math'] = factory()
else
// 全局對象, 瀏覽器中是 window
root['math'] = factory()
})(this, function() {
return { add: function(left, right) { return left + right; } }
})
使用import
導(dǎo)入模塊, 通過export
導(dǎo)出模塊
export { add: (left, right) => left + right; }
import { add } from './math.js';
console.log('1 + 1 = ' + add(1, 1));
amd, cmd已經(jīng)成為了過去式(個人感覺), 現(xiàn)在常用的模塊規(guī)范一般就是es6模塊和commonjs(只用于node)了, node中也已經(jīng)提供了實驗性的es模塊支持.
瀏覽器對es的import
和export
的支持也已經(jīng)很不錯了(除了IE其他主流瀏覽器都支持了)
好消息是微軟將在2022-6-15停止對IE11在win10非長期支持版上的支持