# 模塊化規范
分為兩種Common.js和AMD
## Common.js
2009年,美國程序員[`Ryan Dahle`](https://cloud.tencent.com/developer/article/1407904) `nodejs`項目。這標志 `JavaScript模塊化編程`正式誕生,當時在瀏覽器環境下,沒有模塊也不是特別大的問題,畢竟網頁程序的復雜性有限;
但是在服務器端,一定要有模塊,與操作系統和其他應用程序互動,否則根本沒法編程。 `node.js`的模塊系統,就是參照 `CommonJS`規范實現的。
在 `CommonJS require`.用于加載模塊假定有一個數學模塊 math js,就可以像下面這樣加載
```
var math = require(math);
math.add(2, 3): //5
```
## AMD
有了服務器端模塊以后,很自然地,大家就想要客戶端模塊而且最好兩者能夠兼容,一個模塊不用修改,在服務器和瀏覽器都可以運行但是,由于一個重大的局限,使得 CommonJS規范不適用于瀏覽器環境執行。
解釋:
```
var math = require(math)
math.add(2, 3):
```
第二行math.add(2.3)在第一行requiremath math jst加載完成。也就是說,如果加載時間很長,整個應用就會停在那里等
這對服務器端不是一個問題,因為所有的模塊都存放在本地硬盤可以同步加載完成等待時間就是硬盤的讀取時間。但是,對于瀏覽器這卻是個大問題因為模塊都放在服務器端,等待時間取決于網速的快慢可能要等很長時間瀏覽器處于假死狀態
因此,瀏覽器端的模塊,不能采用同步加載`synchronous`只能采用異步加載(`asynchronous`)這就是AMD規范證生的背景
`AMD`是 `Asynchronous Module Definition`的縮寫意思就是異步模塊定義。
## ES6模塊化
在 `ES6`之前,社區制定了一些模塊加載方案,最主要的有 `CommonJS`和 `AMD`兩種。前者用于服務器,后者用于瀏覽器。`ES6`在語言標準的層面上,實現了模塊功能,而且實現得相當簡單,完全可以取代 `CommonJS`和 `AMD`規范,成為瀏覽器和服務器通用的模塊解決方案。
ES6 模塊的設計思想是盡量的靜態化,使得編譯時就能確定模塊的依賴關系,以及輸入和輸出的變量。`CommonJS`和 `AMD`模塊,都只能在運行時確定這些東西。比如,`CommonJS`模塊就是對象,輸入時必須查找對象屬性。
[http://es6.ruanyifeng.com/#docs/module](http://es6.ruanyifeng.com/#docs/module)