Node.js require模块
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");