首頁  >  文章  >  web前端  >  Nodejs極簡入門教學(一):模組機制_node.js

Nodejs極簡入門教學(一):模組機制_node.js

WBOY
WBOY原創
2016-05-16 16:32:521081瀏覽

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 指令會將目前目錄下的包移除掉。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn