CommonJS就是爲JS的表現來制定規範,由於js沒有模塊的功能因此CommonJS應運而生,它但願js能夠在任何地方運行,不僅是瀏覽器中。
CommonJS定義的模塊分:
{模塊引用(require)},require()用來引入外部模塊;
{模塊定義(exports)},exports對象用於導出當前模塊的方法或變量,惟一的導出口;
{模塊標識(module)},module對象就表明模塊自己。
咱們能夠在wiki上看到對commonjs的詳細介紹:en.wikipedia.org/wiki/Common…
在CommonJs規範中:前端
一個文件就是一個模塊,擁有單獨的做用域;
普通方式定義的變量、函數、對象都屬於該模塊內;
經過require來加載模塊;
經過exports和modul.exports來暴露模塊中的內容;
複製代碼
若是require的是絕對路徑文件,查找不會去遍歷每一個node_modules目錄,其速度最快node
1).從module.paths數組中(由當前執行文件目錄到磁盤根目錄)取出第一個目錄做爲查找基準json
2).直接從目錄中查找該文件,若是存在則結束查找,若是不存在則進行下一條查找後端
3).嘗試添加.js、.node、.json後綴以後查找,若是存在文件則結束查找,若是不存在則進行下一條查找數組
4).嘗試將require的參數做爲一個包來進行查找,讀取目錄下的package.json文件,取得Main參數指定的文件瀏覽器
5).嘗試查找該文件,若是存在則結束查找,若是不存在則進行第3條查找服務器
6).若是繼續失敗,則取出module.paths數組中的下一目錄做爲基準查找,循環第1-5個步驟異步
7).若是繼續失敗,循環第1-6個步驟,直到module.paths中的最後一個值async
8).若是繼續失敗,則拋出異常函數
CommonJS規範不適用於瀏覽器環境,由於require 是同步的。這對服務器端不是一個問題,由於全部的模塊都存放在本地硬盤,能夠同步加載完成,等待時間就是硬盤的讀取時間。可是,對於瀏覽器,這倒是一個大問題,由於模塊都放在服務器端,等待時間取決於網速的快慢,可能要等很長時間,瀏覽器處於"假死"狀態。所以,瀏覽器端的模塊,不能採用"同步加載"(synchronous),只能採用"異步加載"(asynchronous)。這就是AMD規範誕生的背景。CommonJS是主要爲了JS在後端的表現制定的,他是不適合前端的,AMD(異步模塊定義)出現了,它就主要爲前端JS的表現制定規範。
AMD是"Asynchronous Module Definition"的縮寫,意思就是"異步模塊定義"。它採用異步方式加載模塊,模塊的加載不影響它後面語句的運行。全部依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成以後,這個回調函數纔會運行。
AMD也採用require()語句加載模塊,可是不一樣於CommonJS,它要求兩個參數:require([module], callback);第一個參數[module],是一個數組,裏面的成員就是要加載的模塊;第二個參數callback,則是加載成功以後的回調函數。RequireJS是AMD規範的實現。