JavaScript 規範(ECMAScript)沒有定義一套完善的能適用於大多數程序的標準庫。 CommonJS 提供了一套JavaScript 標準庫規範。 Node 實現了CommonJS 規範。
模塊基礎
在Node 中,模塊和文件是一一對應的。我們定義一個模塊:
複製代碼代碼如下:
// circle.js
var PI = Math.PI;
// 導出函數area
exports.area = function(r) {
return PI * r * r;
}
// 導出函數circumference
exports.circumference = function(r) {
return 2 * PI * r;
};
這裡將需要導出的函數加入到exports 對象。模塊的局部變量外部無法訪問(例如,上例中的PI 變量)。調用require 載入模塊circle.js:
複製代碼代碼如下:
var circle = require('./circle.js');
console.log('The area of a circle of radius 4 is '
+ circle.area(4));
附帶提及一下的是,模塊中,存在一個module 對象,表示模塊本身,exports 則為module 的屬性。
模塊的加載
Node 會對加載過的模塊進行緩衝,避免再次加載的開銷:
複製代碼代碼如下:
// test.js
console.log("I'm here");
多次加載模塊test.js
複製代碼代碼如下:
// 僅僅輸出一次"I'm here"
require('./test');
require('./test');
當加載文件沒有後綴時,Node 會嘗試添加後綴並加載:
1..js(JavaScript 源文件)
2..node(C/C++ 擴展模塊)
3..json(JSON 文件)
模塊主要有幾類:
1.核心模塊。核心模塊已經被編譯到了Node 中,我們在其源碼中的lib 目錄可以找到這些核心模塊。常見的核心模塊:net、http、fs 模塊等
2.文件模塊。文件模塊通過一個相對或者絕對路徑加載,例如我們上面看到的circle.js
3.自定義模塊。自定義模塊位於node_modules 目錄中,我們通過npm 安裝的各種模塊就放置在node_modules 目錄中
核心模塊總是優先被加載,假如有一個自定義模塊http,那麼加載時仍然會加載核心模塊http 而非自定義模塊http。在加載自定義模塊時,首先查找當前目錄下的node_modules 目錄,而後查找父目錄下的node_modules 目錄,以此類推,直到根目錄。
require 加載的模塊不是一個文件,而是一個目錄時,這樣的目錄被叫做包(package)。包中存在一個名為package.json 的文件(包描述文件),例如:
複製代碼代碼如下:
{ "name" : "some-library",
"main" : "./lib/some-library.js" }
其中main 指出需要被加載的模塊。如果包中不存在package.json 或者package.json 中未指定main 模塊,那麼Node 將會嘗試加載index.js、index.node、index.json。
在加載JavaScript 模塊時,被加載的模塊被包裹在一個函數中:
複製代碼代碼如下:
function(module, exports, __filename, __dirname, ...) {
JavaScript module
}
每個JavaScript 模塊訪問到的module、exports、__filename、__dirname 等實際上是通過函數參數傳遞進來的。由於這種包裹,才使得模塊的局部變量外部無法訪問。但有時候也會出現讓人難以理解的問題,例如:
test1.js
複製代碼代碼如下:
exports = {
name: 'Name5566',
}
test2.js
複製代碼代碼如下:
module.exports = {
name: 'Name5566',
}
加載這兩個模塊:
複製代碼代碼如下:
var test1 = require('./test1.js');
console.log(test1.name); // undefined
var test2 = require('./test2.js');
console.log(test2.name); // Name5566
exports 作為參數傳遞給模塊,我們通過exports.x 自然可以給exports 對象添加屬性(或方法),但直接給exports 賦值(例如,exports = x)僅僅是改變了形參而非實參的值,因此:
1.為exports 添加屬性時,使用exports
2.為exports 賦值時,使用module.exports
包
按CommonJS 的規範,一個完整的包應該包含有:
1.package.json 包描述文件
2.bin 二進製文件目錄
3.lib JavaScript 代碼目錄
4.doc 文檔目錄
5.test 測試代碼目錄
NPM 是一個Node 的一個包管理工具。常見用法:
查看命令的文檔:
複製代碼代碼如下:
npm help install
查看命令install 的文檔。
安裝一個包:
複製代碼代碼如下:
npm install redis
安裝redis 這個包。 install 命令會將包安裝在當前目錄下的node_modules 目錄中。
移除一個包:
複製代碼代碼如下:
npm remove redis
移除redis 這個包。 remove 命令會將當前目錄下的包移除掉。