1. 程式人生 > 程式設計 >通過例項瞭解Nodejs模組系統及require機制

通過例項瞭解Nodejs模組系統及require機制

一、簡介

  Nodejs 有一個簡單的模組載入系統。在 Nodejs 中,檔案和模組是一一對應的(每個檔案被視為一個獨立的模組),這個檔案可能是 JavaScript 程式碼,JSON 或編譯過的C/C++ 擴充套件,例如:

/**
 *foo.js
 *將這個js檔案匯出為模組
 */
exports.hello = function() {
  console.log("hello Nodejs!");
}
/**
 *main.js
 *main.js和foo.js在同一目錄下
 *在控制檯中將會輸出:hello Nodejs!
 */
var foo = require("./foo.js");

foo.hello();

二、如何將模組匯出—— module.exports 與 exports 的區別

  Nodejs 中的每一個模組都會自動建立一個 module 物件,同時 module 物件下有一個叫 exports 的屬性,可以將某個類的例項賦值給 module.exports,從而匯出這個類的例項。在模組被執行前,Nodejs 會將 module.exports 的值賦於全域性變數 exports ,以便 module.exports.f = ... 可以更簡潔的寫成 exports.f = ... 。注意:就像所有變數一樣,如果重新給 exports 賦值,它就不再繫結到 module.exports 了,也不會匯出指定模組

例如:

/**
 *foo.js
 *匯入方式:var foo = require("./foo.js");
 */
function Foo() {}
Foo.prototype.hello = function() {
  console.log("hello Nodejs!");
}

module.exports = new Foo();
/**
 *foo.js
 *匯入方式:var Foo = require("./foo.js"); var foo = new Foo();
 */
function Foo() {}
Foo.prototype.hello = function() {
  console.log("hello Nodejs!");
}

module.exports = Foo;

/**
 *foo.js
 *匯入方式:var foo = require("./foo.js");
 */
exports.hello = function() {
  console.log("hello Nodejs!");
}

三、require的機制

  假設Y是路徑,X是檔名或目錄名,當 Nodejs 遇到 require(Y+X) 時,按照下面的順序處理:

  1、如果 X 是核心模組(例如:require("http"))

  a.返回該模組

  b.不再繼續執行

  2、如果Y是以“./”、“/”或“../”開頭

  a.把X當成檔案,從指定路徑開始,依次查詢下面檔案:X、X.js、X.json、X.node,只要其中一個存在,就返回該檔案,不再繼續執行

  b.把X當成目錄,從指定路徑開始,依次查詢下面檔案:X/package.json(main欄位)、X/index.js、X/index.json、X/index.node,只要其中一個存在,就返回該檔案,不再繼續執行

  3.如果 X 不是核心模組,也沒有以“./”、“/”或“../”開頭,則Nodejs會從當前模組的父目錄開始,嘗試從它的 /node_module 目錄里加載模組,如果還是沒有找到,則移動到再上一層父目錄,直到檔案系統的根目錄

  4.丟擲“not found”

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。