JavaScript模塊化規範主要遵循CommonJS和AMD規範。html
CommonJS規範-服務器端JavaScript規範node
Node.js是一個服務器端JavaScript項目,採用了CommonJS標準實現其模塊系統。npm
CommonJS中採用一個全局require方法來加載模塊,主要由原生模塊module來實現和完成,該模塊在啓動時已經被加載。json
模塊主要分爲兩類:原生模塊,文件模塊。api
1.原生模塊數組
原生模塊也是Node.js中最核心的模塊。原生模塊在Node.js源代碼編譯的時候編譯進了二進制執行文件,加載的速度最快。瀏覽器
Node.js中存在許多原生模塊,例如:http,net,os,path,fs, module等等,其引用方式爲var fs = require('fs');緩存
2.文件模塊服務器
文件模塊是動態加載的,加載速度比原生模塊慢。可是Node.js對原生模塊和文件模塊都進行了緩存,在第二次require該模塊時,是不會有重複開銷。網絡
文件模塊可細分爲3類。這三類文件模塊以文件後綴來區分,Node.js會根據後綴名來決定加載方法。
.js。經過fs模塊同步讀取js文件並編譯執行。
.node。一般爲npm安裝的第三方模塊。
.json。讀取文件,調用JSON.parse解析加載。
雖然Node.js使用require方法引入模塊的方式看似簡單,但內部的加載卻並不簡單,且其中的優先級也不同。
AMD規範-瀏覽器端JavaScript規範
CommonJS中模塊存放在本地,使用同步方式加載模塊,其加載時間基本至關於磁盤IO時間,這不會存在問題,可是若是環境是瀏覽器,則文件的加載受制於網絡因素,若是網絡加載比較慢,則可致使瀏覽器處於假死狀態,所以瀏覽器端只能採用異步加載模塊的方式。
AMD:Asynchronous Module Definition(異步模塊定義)。它採用異步方式加載模塊,模塊的加載不影響它後面語句的運行。全部依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成以後,這個回調函數纔會運行。
AMD也採用require()語句加載模塊,可是不一樣於CommonJS,它要求兩個參數:require([module], callback);
第一個參數[module],是一個數組,裏面的成員就是要加載的模塊;第二個參數callback,則是加載成功以後的回調函數。目前,主要有兩個Javascript庫實現了AMD規範:require.js和curl.js。
require.js採用AMD規範實現模塊加載,其採用define函數來定義。define函數接受兩個參數,第一個參數爲依賴數組,第二個參數爲待定義的模塊函數。若是沒有依賴模塊,則第一個參數也能夠省略。
參考:
http://www.infoq.com/cn/articles/nodejs-module-mechanism
http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html
http://nodejs.org/api/modules.html