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); // longervar 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");