對於前端開發者來講 CommonJS 和 AMD 是常常遇到的概念,那麼 CommonJS 和 AMD 究竟是什麼呢?javascript
CommonJS is a project with the goal of specifying an ecosystem for JavaScript outside the browser (for example, on the server or for native desktop applications).
維基百科說,CommonJS 是一個致力於規範化瀏覽器以外的 JavaScript 生態系統的項目(例如,在服務器端或者是原生的桌面應用程序)。html
簡單來說,它是一個規範。根據這個規範,每一個文件就是一個模塊,有本身的做用域。在一個文件裏面定義的變量、函數、類,都是私有的,對其餘文件不可見。CommonJS 規範規定,每一個模塊內部,module變量表明當前模塊。這個變量是一個對象,它的exports屬性(即module.exports)是對外的接口。加載某個模塊,實際上是加載該模塊的module.exports屬性。前端
CommonJS 加載模塊是同步的,因此只有加載完成才能執行後面的操做。像Node.js主要用於服務器的編程,加載的模塊文件通常都已經存在本地硬盤,因此加載起來比較快,不用考慮異步加載的方式,因此CommonJS規範比較適用。但若是是瀏覽器環境,要從服務器加載模塊,這是就必須採用異步模式。因此就有了 AMD,CMD 解決方案。java
CommonJS是主要爲了js在後端的表現制定的,是不適合前端的,爲何這麼說呢?這須要分析一下瀏覽器端的js和服務器端js都主要作了哪些事,有什麼不一樣了:node
因而乎,AMD(異步模塊定義)出現了,它就主要爲前端JS的表現制定規範。
AMD就只有一個接口:git
define(id?,dependencies?,factory)
它要在聲明模塊的時候制定全部的依賴(dependencies),而且還要當作形參傳到factory中,像這樣:github
define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好 a.doSomething() // 此處略去 100 行 b.doSomething() ... })