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 模組系統|菜鳥教程。