????????通常我們一個項目需要幾個人來開發(fā),會出現(xiàn)很多的函數(shù)、文件等,不易管理復用。為了復用代碼,我們需要模塊化代碼。但我們知道,目前js沒有支持模塊化(面向?qū)ο?、類等),要等到最新版?-ES6。而現(xiàn)在大家默認使用一些方法來實現(xiàn)js的模塊化編程,下面就簡單介紹一下。
一、常用模塊化方式。
模塊化就是將若干個方法、屬性包起來,可以被統(tǒng)一調(diào)用。常見的模塊化方法如下:
1.包成object法,即包成js的Object類
2.立即執(zhí)行函數(shù)法,即包成立即執(zhí)行函數(shù)
3.閉包法
二、歷史模塊加載規(guī)范
ES6以前,通用的模塊規(guī)范有兩種,commJS和AMD。在ES6 module被完全實現(xiàn)之前,還需要我們大量使用這兩個規(guī)范。
1.commonJS: ?
? ??暴露模塊:module.exports和exports
? ??引入模塊:使用require()用來引入模塊:
var math=require(‘math’); ? math.add(3,4)
require方法執(zhí)行完后,才能執(zhí)行下面的語句,是同步的,所以時間可能會延遲。
2.AMD(Asynchronous Module Definition異步模塊定義):
? ??暴露模塊:模塊必須用define()定義:define(id, dependencies,factory)。其中id和dependencies可選。
? ??引入模塊:它采用異步加載的方法加載模塊,模塊加載不影響后面語句的執(zhí)行。
AMD也是用require()方法,但是需要兩個參數(shù):require([module], callback)。其中第一個是模塊數(shù)組,第二個參數(shù)是回調(diào)函數(shù)。
require([‘math’],function(math){
math.add(3,4);
})
其中,math函數(shù)和require函數(shù)不是同步的,不會阻塞。
常見的require.js就實現(xiàn)了AMD規(guī)范。
案例解析:require.js
兩個作用:
1.異步加載,不阻塞
2.管理加載模塊之間的依賴
3.CMD(Common Module Definition)
? ??暴露模塊:define()
? ??引入模塊:require
CMD是seajs推崇的規(guī)范,對依賴是就近處理的,用的時候才require().
define(function(require, exports, module) {
var clock = require('clock');
clock.start();
});
CMD與AMD的不同:AMD提前明確需要哪些依賴,提前加載完;CMD用的時候才加載具體的模塊。都是異步加載。
三、最新的標準
ES6的module提出了一個新的標準,
? ??暴露模塊:export ?(不是exports)
? ??引入模塊:import
export語法聲明用于導出函數(shù)、對象、指定文件(或模塊)的原始值.export有命名導出和默認導出。
// "module1.js" 模塊
export functionfunc1(x) { ? ? //默認導出
return x+1;
}
const c1 = 33+42+randn(); ? //命名導出
export { c1 };
使用:
在另一個模塊中,可以這樣引入module1暴露的模塊
import { func1, c1 }from'module1';
console.log(func1(7));
console.log(c1);?