Node.js require模塊

2018-01-15 23:24 更新

Node.js require函數(shù)

Node.js require函數(shù)是將模塊導(dǎo)入到當(dāng)前文件的主要方式。在Node.js中有三種的模塊:核心模塊,文件模塊和外部node_modules。

當(dāng)我們使用相對路徑(例如,require('./filename')或require('../foldername / filename'))調(diào)用require時(shí),Node.js在新作用域中運(yùn)行目標(biāo)JavaScript文件,并返回分配給該文件中module.exports的最終值。

使用 require 函數(shù)只給你module.exports變量,你需要將結(jié)果分配給本地的變量,以便在作用域內(nèi)使用它。

var yourChoiceOfLocalName = require("./myFile"); 

有條件地加載模塊

require的行為與JavaScript中的任何其他函數(shù)相似。我們可以基于一些條件調(diào)用require(),并且只有在需要時(shí)加載模塊。

if(iReallyNeedThisModule){ 
    var myData = require("./myData"); 
} 

阻塞

require函數(shù)阻止進(jìn)一步的代碼執(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(); 

緩存

第一次對特定文件進(jìn)行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)

模塊之間的共享狀態(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進(jìn)程中解析到同一個(gè)文件時(shí),都會返回相同的對象。要為每個(gè)require函數(shù)調(diào)用創(chuàng)建新對象,請從返回新對象的源模塊中導(dǎo)出函數(shù)。然后在你的目的地需要模塊,并調(diào)用這個(gè)導(dǎo)入的函數(shù)來創(chuàng)建一個(gè)新的對象。

在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二進(jìn)制的模塊。核心模塊在 require()中具有最高優(yōu)先級。在模塊命名沖突的情況下,加載核心模塊。

例如,Node包含一個(gè)名為 http 的核心模塊。調(diào)用 require(“http")將始終加載核心http模塊。核心模塊位于Node源代碼的lib目錄中。

解析模塊位置

要找出程序包所在的位置,請使用 require.resolve()函數(shù)。它返回模塊的路徑。如果傳遞給resolve()的模塊名稱是核心模塊,則返回模塊的名稱。如果模塊是文件模塊,resolve()返回模塊的文件名。如果Node找不到指定的模塊,則拋出一個(gè)錯(cuò)誤。

以下示例顯示了REPL環(huán)境中resolve()的用法。

require.resolve("http");
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號