通過(guò)實(shí)例了解Nodejs模塊系統(tǒng)及require機(jī)制
一、簡(jiǎn)介
Nodejs 有一個(gè)簡(jiǎn)單的模塊加載系統(tǒng)。在 Nodejs 中,文件和模塊是一一對(duì)應(yīng)的(每個(gè)文件被視為一個(gè)獨(dú)立的模塊),這個(gè)文件可能是 JavaScript 代碼,JSON 或編譯過(guò)的C/C++ 擴(kuò)展,例如:
/**
*foo.js
*將這個(gè)js文件導(dǎo)出為模塊
*/
exports.hello = function() {
console.log("hello Nodejs!");
}
/**
*main.js
*main.js和foo.js在同一目錄下
*在控制臺(tái)中將會(huì)輸出:hello Nodejs!
*/
var foo = require("./foo.js");
foo.hello();
二、如何將模塊導(dǎo)出—— module.exports 與 exports 的區(qū)別
Nodejs 中的每一個(gè)模塊都會(huì)自動(dòng)創(chuàng)建一個(gè) module 對(duì)象,同時(shí) module 對(duì)象下有一個(gè)叫 exports 的屬性,可以將某個(gè)類(lèi)的實(shí)例賦值給 module.exports,從而導(dǎo)出這個(gè)類(lèi)的實(shí)例。在模塊被執(zhí)行前,Nodejs 會(huì)將 module.exports 的值賦于全局變量 exports ,以便 module.exports.f = ... 可以更簡(jiǎn)潔的寫(xiě)成 exports.f = ... 。注意:就像所有變量一樣,如果重新給 exports 賦值,它就不再綁定到 module.exports 了,也不會(huì)導(dǎo)出指定模塊
例如:
/**
*foo.js
*導(dǎo)入方式:var foo = require("./foo.js");
*/
function Foo() {}
Foo.prototype.hello = function() {
console.log("hello Nodejs!");
}
module.exports = new Foo();
/**
*foo.js
*導(dǎo)入方式:var Foo = require("./foo.js"); var foo = new Foo();
*/
function Foo() {}
Foo.prototype.hello = function() {
console.log("hello Nodejs!");
}
module.exports = Foo;
/**
*foo.js
*導(dǎo)入方式:var foo = require("./foo.js");
*/
exports.hello = function() {
console.log("hello Nodejs!");
}
三、require的機(jī)制
假設(shè)Y是路徑,X是文件名或目錄名,當(dāng) Nodejs 遇到 require(Y+X) 時(shí),按照下面的順序處理:
1、如果 X 是核心模塊(例如:require("http"))
a.返回該模塊
b.不再繼續(xù)執(zhí)行
2、如果Y是以“./”、“/”或“../”開(kāi)頭
a.把X當(dāng)成文件,從指定路徑開(kāi)始,依次查找下面文件:X、X.js、X.json、X.node,只要其中一個(gè)存在,就返回該文件,不再繼續(xù)執(zhí)行
b.把X當(dāng)成目錄,從指定路徑開(kāi)始,依次查找下面文件:X/package.json(main字段)、X/index.js、X/index.json、X/index.node,只要其中一個(gè)存在,就返回該文件,不再繼續(xù)執(zhí)行
3.如果 X 不是核心模塊,也沒(méi)有以“./”、“/”或“../”開(kāi)頭,則Nodejs會(huì)從當(dāng)前模塊的父目錄開(kāi)始,嘗試從它的 /node_module 目錄里加載模塊,如果還是沒(méi)有找到,則移動(dòng)到再上一層父目錄,直到文件系統(tǒng)的根目錄
4.拋出“not found”
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解node服務(wù)器中打開(kāi)html文件的兩種方法
本篇文章主要介紹了詳解node服務(wù)器中打開(kāi)html文件的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
詳解在Node.js中發(fā)起HTTP請(qǐng)求的5種方法
這篇文章主要介紹了詳解在Node.js中發(fā)起HTTP請(qǐng)求的5種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Node.js connect ECONNREFUSED錯(cuò)誤解決辦法
這篇文章主要介紹了Node.js connect ECONNREFUSED錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-09-09
NodeJS學(xué)習(xí)筆記之網(wǎng)絡(luò)編程
Node.js采用了Google Chrome瀏覽器的V8引擎,性能很好,同時(shí)還提供了很多系統(tǒng)級(jí)的API,如文件操作、網(wǎng)絡(luò)編程等。Node.js則是一個(gè)全面的后臺(tái)運(yùn)行時(shí),為Javascript提供了其他語(yǔ)言能夠?qū)崿F(xiàn)的許多功能。今天我們來(lái)看下Nodejs的網(wǎng)絡(luò)編程2014-08-08
Nodejs實(shí)現(xiàn)的操作MongoDB數(shù)據(jù)庫(kù)功能完整示例
這篇文章主要介紹了Nodejs實(shí)現(xiàn)的操作MongoDB數(shù)據(jù)庫(kù)功能,結(jié)合完整實(shí)例形式分析了nodejs針對(duì)MongoDB數(shù)據(jù)庫(kù)的連接及增刪改查基本操作技巧,需要的朋友可以參考下2019-02-02

