Node.js require函數(shù)是將模塊導入到當前文件的主要方式。在Node.js中有三種的模塊:核心模塊,文件模塊和外部node_modules。
當我們使用相對路徑(例如,require('./filename')或require('../foldername / filename'))調(diào)用require時,Node.js在新作用域中運行目標JavaScript文件,并返回分配給該文件中module.exports的最終值。
使用 require
函數(shù)只給你module.exports變量,你需要將結(jié)果分配給本地的變量,以便在作用域內(nèi)使用它。
var yourChoiceOfLocalName = require("./myFile");
require的行為與JavaScript中的任何其他函數(shù)相似。我們可以基于一些條件調(diào)用require(),并且只有在需要時加載模塊。
if(iReallyNeedThisModule){
var myData = require("./myData");
}
require函數(shù)阻止進一步的代碼執(zhí)行,直到模塊被加載。
require()調(diào)用之后的代碼不會被執(zhí)行,直到模塊被加載和執(zhí)行。
// Blocks execution till module is loaded
var myData = require("./myData");
// Continue execution after it is loaded
console.log("loaded myData");
myData();
第一次對特定文件進行require調(diào)用后,將緩存module.exports。
var t1 = new Date().getTime();
var myData1 = require("./myData");
console.log(new Date().getTime() - t1); // longer
var t2 = new Date().getTime();
var myData2 = require("./myData");
console.log(new Date().getTime() - t2); // shorter
模塊之間的共享狀態(tài)在各種上下文中是有用的。
This allows you to share in-memory objects between modules.
在c:/intro/shared/myData.js中我們有
module.exports = {
something: 123
};
在c:/intro/shared/app.js我們有
var myData = require("./myData");
console.log("initial something:", myData.something); // 123
// Now modify something:
myData.something = 456;
// Now load myValue:
var bas = require("./myValue");
在c:/intro/shared/myAnother.js我們有
var myData = require("./myData");
console.log("in another module:", myData.something); // 456
每次require調(diào)用在Node.js進程中解析到同一個文件時,都會返回相同的對象。要為每個require函數(shù)調(diào)用創(chuàng)建新對象,請從返回新對象的源模塊中導出函數(shù)。然后在你的目的地需要模塊,并調(diào)用這個導入的函數(shù)來創(chuàng)建一個新的對象。
在c:/intro/factory/myData.js文件
module.exports = function () {
return {
something: 123
};
};
在c:/intro/factory/app.js我們有
var myData = require("./myData");
// create a new object
var obj = myData();
// use it
console.log(obj.something); // 123
我們甚至可以一步到位
require("./myData")();
核心模塊是編譯成Node二進制的模塊。核心模塊在 require()
中具有最高優(yōu)先級。在模塊命名沖突的情況下,加載核心模塊。
例如,Node包含一個名為 http
的核心模塊。調(diào)用 require(“http")
將始終加載核心http模塊。核心模塊位于Node源代碼的lib目錄中。
要找出程序包所在的位置,請使用 require.resolve()
函數(shù)。它返回模塊的路徑。如果傳遞給resolve()的模塊名稱是核心模塊,則返回模塊的名稱。如果模塊是文件模塊,resolve()返回模塊的文件名。如果Node找不到指定的模塊,則拋出一個錯誤。
以下示例顯示了REPL環(huán)境中resolve()的用法。
require.resolve("http");
更多建議: