1. 程式人生 > >node.js中module模組的理解

node.js中module模組的理解

node.js中使用CommonJS規範實現模組功能,一個單獨的檔案就是一個單獨的模組。通過require方法實現模組間的依賴管理。

通過require載入模組,是同步操作。

載入流程如下:

1、找到需要載入的模組檔案。

2、判斷是否快取過,如果沒有,則讀取模組檔案的內容。

3、把讀取到的內容,封裝在一個函式裡執行。

(function (exports, require, module, __filename, __dirname) {
    //模組的程式碼實際上在這裡
});

4、返回 module.exports 需要匯出的內容。

exports 表示模組的匯出物件

require 表示require方法

module 表示當前模組物件

__filename 表示當前檔案的絕對路徑

__dirname 表示當前資料夾的絕對路徑

在模組的內部,this 指向的是 當前模組的匯出物件

console.log(this === module.exports);
console.log(this === exports);

module物件有不少屬性,可以打印出來看看。

console.log(module);

module.id 表示模組的識別符號。

module.exports 表示模組的匯出物件。

module.parent 表示當前模組的父模組,當前模組是誰載入的。

module.filename 表示模組的絕對路徑。

module.loaded 表示是否載入完成。

module.children 表示當前模組載入了哪些模組。

module.paths 表示模組的搜尋路徑,路徑的多少取決於目錄的深度。

node.js通過require方法載入檔案是同步的,為了提高效率,會快取已經載入過的檔案。

console.log(require.cache);

快取的key是模組的絕對路徑,value是module物件。

require.resolve獲取模組的絕對路徑,但並不會載入模組。

console.log(require.resolve('./01.js'));

require.main獲取入口模組

console.log(require.main);

require.extensions獲取模組支援的副檔名

node.js中模組檔案分三種:1、.js模組  2、.json檔案模組  3、.node C++擴充套件二進位制模組

console.log(require.extensions);

node.js通過require載入檔案時,比如 require('./user') 會先找 user 檔案,然後沒找到,再找 user.js,再找 user.json,再找 user.node。

 

node.js的模組分類:

1、核心模組,編譯二進位制,載入速度最快,像 fs,http,events等。

2、檔案模組,儲存在硬碟上,載入速度比較慢,通過名稱或路徑來載入。

3、第三方模組,只指定名稱則從node_modules目錄下載入,查詢的路徑包括module.paths和全域性目錄。

全域性目錄:

windows中:環境變數NODE_PATH指定的路徑。

linux中:$HOME/.node_modules和$HOME/.node_libraries目錄

 

檔案模組查詢的規則,比如 require('./user') :

1、判斷載入的檔案是否以絕對路徑載入的。

2、如果是絕對路徑,則直接載入絕對路徑的檔案。

3、如果不是,判斷檔案有沒有以 './' ,'../' 開頭,如果有則找到該相對路徑,如果沒有則通過modules.paths和全域性目錄獲取路徑。

4、嘗試在第3步中的路徑下查詢 user 檔案。

5、如果沒有找到,則嘗試加副檔名( user.js,user.json,user.node)進行查詢。

6、如果還沒有,嘗試根據包進行查詢,user 目錄下,包檔案描述 package.json 中 main 配置的檔案進行載入。

7、如果沒有 package.json,則查詢 user 目錄下, index.js 和 index.node。

8、如果還沒有,則找下一個modules.paths。

9、最後還是沒有找到,則檔案載入失敗。