與其餘高級語言相比,如Java有類文件,Python有import機制,Ruby有require,PHP有include和require,JavaScript先天就缺少的一項功能:模塊前端
Web發展中,瀏覽器中出現了不少的標準API,這些過程發生在前端,後端JavaScript的規範卻遠遠落後。主要有如下缺陷:npm
Node借鑑CommonJS的Modules規範實現了一套很是易用的模塊系統,NPM對Packages規範的無缺支持使得Node應用在開發過程當中事半功倍。json
1.模塊引用後端
var math = require('math');
使用require將模塊引入到當前上下文。瀏覽器
2.模塊定義緩存
上下文提供了exports對象用於導出當前模塊的方法或者變量,而且它是惟一導出的出口。在模塊中,還存在一個module對象,它表明模塊自身,而exports是module的屬性。在Node中,一個文件就是一個模塊。單元測試
// math.js exports.add = function(){ var sum = 0, i = 0, args = arguments, l = args.length; while(i < 1){ sum += args[i++]; } return sum; }
3.模塊標識測試
也就是require()內的參數,能夠是相對路徑、絕對路徑。能夠沒有文件後綴.js。ui
Node對CommonJS的規範作了取捨。下面來具體看下在使用require,exports和module這些規範時,Node內部的實現過程。code
在Node引入模塊,須要經歷如下3個步驟:
在Node中,模塊分爲兩類:
核心模塊在Node源代碼編譯過程當中,編譯進了二進制執行文件。在Node啓動時,部分核心模塊就直接被加載進內存。所以這部分模塊不須要文件定位+編譯過程,而且在路徑分析中優先判斷,所以加載速度最快的。
文件模塊則在運行時動態加載,須要完整的路徑分析、文件定位、編譯執行的過程。
require()方法對相同模塊的二次加載都一概採用緩存優先的方式,這是第一優先級
的。核心模塊的緩存檢查優先於文件模塊的緩存檢查。
前面提到,Node的核心模塊在編譯成可執行文件的過程當中被編譯進了二進制文件。
核心模塊分爲C/C++模塊編寫的和JavaScript編寫的兩部分。其中C/C++編寫的存放在src目錄下,JavaScript編寫的存放在lib目錄下。
包其實是一個存檔文件,即一個目錄直接打包爲.zip或tar.gz格式的文件,安裝後解壓還原爲目錄。符合CommonJS規範的目錄應該包含以下文件:
發佈包:
npm init
npm adduser
npm publish <folder>
。能夠在剛剛建立的package.json文件所在目錄下,執行npm publish .
,開始上傳包npm owner ls xxx
:列舉出擁有包權限的人npm owner add <user> <package name>
npm owner rm <user> <package name>
分析包:
npm ls
命令生成包的依賴樹。局域NPM