通過實例了解Nodejs模塊系統(tǒng)及require機制
一、簡介
Nodejs 有一個簡單的模塊加載系統(tǒng)。在 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 的區(qū)別
Nodejs 中的每一個模塊都會自動創(chuàng)建一個 module 對象,同時 module 對象下有一個叫 exports 的屬性,可以將某個類的實例賦值給 module.exports,從而導出這個類的實例。在模塊被執(zhí)行前,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.不再繼續(xù)執(zhí)行
2、如果Y是以“./”、“/”或“../”開頭
a.把X當成文件,從指定路徑開始,依次查找下面文件:X、X.js、X.json、X.node,只要其中一個存在,就返回該文件,不再繼續(xù)執(zhí)行
b.把X當成目錄,從指定路徑開始,依次查找下面文件:X/package.json(main字段)、X/index.js、X/index.json、X/index.node,只要其中一個存在,就返回該文件,不再繼續(xù)執(zhí)行
3.如果 X 不是核心模塊,也沒有以“./”、“/”或“../”開頭,則Nodejs會從當前模塊的父目錄開始,嘗試從它的 /node_module 目錄里加載模塊,如果還是沒有找到,則移動到再上一層父目錄,直到文件系統(tǒng)的根目錄
4.拋出“not found”
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Node.js connect ECONNREFUSED錯誤解決辦法
這篇文章主要介紹了Node.js connect ECONNREFUSED錯誤解決辦法的相關資料,需要的朋友可以參考下2016-09-09Nodejs實現(xiàn)的操作MongoDB數(shù)據(jù)庫功能完整示例
這篇文章主要介紹了Nodejs實現(xiàn)的操作MongoDB數(shù)據(jù)庫功能,結(jié)合完整實例形式分析了nodejs針對MongoDB數(shù)據(jù)庫的連接及增刪改查基本操作技巧,需要的朋友可以參考下2019-02-02