Node.js require模块

2018-01-15 23:24 更新

Node.js require函数

Node.js require函数是将模块导入到当前文件的主要方式。在Node.js中有三种的模块:核心模块,文件模块和外部node_modules。

当我们使用相对路径(例如,require('./filename')或require('../foldername / filename'))调用require时,Node.js在新作用域中运行目标JavaScript文件,并返回分配给该文件中module.exports的最终值。

使用 require 函数只给你module.exports变量,你需要将结果分配给本地的变量,以便在作用域内使用它。

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

有条件地加载模块

require的行为与JavaScript中的任何其他函数相似。我们可以基于一些条件调用require(),并且只有在需要时加载模块。

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

阻塞

require函数阻止进一步的代码执行,直到模块被加载。

require()调用之后的代码不会被执行,直到模块被加载和执行。

// Blocks execution till module is loaded 
var myData = require("./myData"); 

// Continue execution after it is loaded 
console.log("loaded myData"); 
myData(); 

缓存

第一次对特定文件进行require调用后,将缓存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

共享状态

模块之间的共享状态在各种上下文中是有用的。

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调用在Node.js进程中解析到同一个文件时,都会返回相同的对象。要为每个require函数调用创建新对象,请从返回新对象的源模块中导出函数。然后在你的目的地需要模块,并调用这个导入的函数来创建一个新的对象。

在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()中具有最高优先级。在模块命名冲突的情况下,加载核心模块。

例如,Node包含一个名为 http 的核心模块。调用 require(“http")将始终加载核心http模块。核心模块位于Node源代码的lib目录中。

解析模块位置

要找出程序包所在的位置,请使用 require.resolve()函数。它返回模块的路径。如果传递给resolve()的模块名称是核心模块,则返回模块的名称。如果模块是文件模块,resolve()返回模块的文件名。如果Node找不到指定的模块,则抛出一个错误。

以下示例显示了REPL环境中resolve()的用法。

require.resolve("http");
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号