1. 程式人生 > >Node.js 第九章- 模組系統

Node.js 第九章- 模組系統

一,原由

為了讓Node.js檔案可以相互呼叫,Node.js提供了一個簡單的模組系統。

模組是Node.js應用程式的基本組成部分,檔案和模組是一一對應的。

換言之。一個Node.js檔案就是i 一個模組,這個檔案可能是JavaScript程式碼,JSON,或者編譯過的C/C++擴充套件。

 

二,建立模組

1.1建立一個模組很容易,檔名叫ninth1.js

Node.js提供了exports和require兩個物件,其中exports是模組公開的介面,require用於從外部獲取一個模組的介面,即所獲取模組的exports物件。

hello.js

 

 上述例子中,hello.js通過exports物件把world作為模組的訪問介面,在ninth1.js中通過require('./hello')載入這個模組,然後可以直接訪問hello.js中的exports物件的成員函數了。

有時候,我們只是想把一個物件封裝到模組中去:

格式如下:

module.exports = function() {

}

例子:

以下是呼叫該物件。

 

 

模組介面唯一的變化是使用了module.exports = Hello 代替了原來的exports.world = function() {} ,在外部引用該模組的時候,其介面物件就是要輸出的Hello物件本身,而不是原先的exports

 

三,服務端的模組放在哪裡?
var http = require('http');

...

http.createServer(...);

Node.js自帶了一個叫做http  的模組,我們在我們的程式碼中請求它,並把返回值賦給一個本地變數。

這樣我們本地的變數,就成 了一個擁有http模組提供的公共方法的物件。

Node.js存在4種模組(原生模組和3種檔案模組)。

儘管require方法極其簡單。但是內部載入卻是十分複雜,其載入優先順序也各自不同。

1.1 從檔案模組快取中載入

儘管原生模組與檔案模組的優先順序不同,但是都會優先從檔案模組的快取中載入已經存在的模組。

1.2 從原生模組載入

原生模組的優先順序僅僅次於檔案模組的優先順序。require方法在解析檔名之後,優先檢查模組是否在原生模組列表中。以http模組為例,儘管在目錄下存在一個http/http.js/http.node/http.json檔案,require('http')都不會從這些檔案中載入,而是從原生模組中載入。

原生模組也有一個快取區。同樣也是優先從快取區載入。如果快取區沒有載入過,則呼叫原生模組的載入方式進行載入和執行。

1.3 從檔案載入

當檔案模組快取中不存在,而且不是原生模組的時候,Node.js會解析require方法傳入的引數,並從檔案系統中載入實際的檔案,載入過程中的包裝和編譯細節在前一節已經介紹過,此處,我們詳細描述下查詢檔案模組的過程,其中,也有一些細節值得知曉。

1.4 require方法接收以下集中引數的傳遞:
1.1.1 http, fs ,path等 ,原生模組。

1.1.2 ./mod或 ../mod,相對路徑的檔案模組。

1.1.3 /pathtomodule/mod , 絕對路徑的檔案模組。

1.1.4 mod ,非原生模組的檔案模組

 

1.5 在路徑Y下執行require(X)語句執行順序

1. 如果X是內建模組

    a,返回內建模組

    b, 停止執行

2.如果X是以 ‘/’ 開頭

   a,設定Y為檔案根路徑

3.如果X是以 ‘./’ or '/' or '../' 開頭

   a, LOAD_AS_FILE(Y+X)

   b,LOAD_AS_DIRECTORY(Y+X)

4.LOAD_MODE_MODULES(X,dirname(Y))

5.丟擲異常 “not found”

具體參照 Node.js 模組系統|菜鳥教程。