AMD全稱是Asynchronous Module Definition,即異步模塊加載機制。後來由該草案的做者以RequireJS實現了AMD規範,因此通常說AMD也是指RequireJS。css
經過define來定義一個模塊,使用require能夠導入定義的模塊。vue
//a.js
//define能夠傳入三個參數,分別是字符串-模塊名、數組-依賴模塊、函數-回調函數
define(function(){
return 1;
})
複製代碼
// b.js
//數組中聲明須要加載的模塊,能夠是模塊名、js文件路徑
require(['a'], function(a){
console.log(a);// 1
});
複製代碼
RequireJS的特色 對於依賴的模塊,AMD推崇依賴前置,提早執行。也就是說,在define方法裏傳入的依賴模塊(數組),會在一開始就下載並執行。jquery
CMD是SeaJS在推廣過程當中生產的對模塊定義的規範,在Web瀏覽器端的模塊加載器中,SeaJS與RequireJS並稱,SeaJS做者爲阿里的玉伯。webpack
//a.js
/* * define 接受 factory 參數,factory 能夠是一個函數,也能夠是一個對象或字符串, * factory 爲對象、字符串時,表示模塊的接口就是該對象、字符串。 * define 也能夠接受兩個以上參數。字符串 id 表示模塊標識,數組 deps 是模塊依賴. */
define(function(require, exports, module) {
var $ = require('jquery');
exports.setColor = function() {
$('body').css('color','#333');
};
});
複製代碼
//b.js
//數組中聲明須要加載的模塊,能夠是模塊名、js文件路徑
seajs.use(['a'], function(a) {
$('#el').click(a.setColor);
});
複製代碼
對於依賴的模塊,CMD推崇依賴就近,延遲執行。也就是說,只有到require時依賴模塊才執行。git
CommonJS規範爲CommonJS小組所提出,目的是彌補JavaScript在服務器端缺乏模塊化機制,NodeJS、webpack都是基於該規範來實現的。es6
//a.js
module.exports = function () {
console.log("hello world")
}
複製代碼
//b.js
var a = require('./a');
a();//"hello world"
//或者
//a2.js
exports.num = 1;
exports.obj = {xx: 2};
//b2.js
var a2 = require('./a2');
console.log(a2);//{ num: 1, obj: { xx: 2 } }
複製代碼
ES6 Module是ES6中規定的模塊體系,相比上面提到的規範, ES6 Module有更多的優點,有望成爲瀏覽器和服務器通用的模塊解決方案。github
//a.js
var name = 'lin';
var age = 13;
var job = 'ninja';
export { name, age, job};
複製代碼
//b.js
import { name, age, job} from './a.js';
console.log(name, age, job);// lin 13 ninja
複製代碼
//或者
//a2.js
export default function () {
console.log('default ');
}
//b2.js
import customName from './a2.js';
customName(); // 'default'
複製代碼
目前瀏覽器對ES6 Module兼容還不太好,咱們平時在webpack中使用的export/import,會通過babel轉換爲CommonJS規範。web
若是你是經過commonJS來require導入的模塊,那麼,首次導入會被緩存,後續的導入都是取的第一次的緩存結果。若是你是經過es6 import導入的模塊,那麼導入的都是值的引用。因此,導入屢次是在最終打包的時候,只打了一個而並不會重複打入的狀況。。數組
參考:juejin.im/post/5db95e…瀏覽器
請多多指點其中的問題點,使用的文章不少,難的是,真正的理解其內部機制與如何實現的?從模塊做者的角度考慮問題,多思考,學習才能掌握要領。從而實現本身的工具。
碼字不易,以爲還行,給star一下,您的star,是我前進的動力哈~