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变量,你需要将结果分配给本地的变量,以便在作用域内使用它。

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

有条件地加载模块

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

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

阻塞

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

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

  1. // Blocks execution till module is loaded
  2. var myData = require("./myData");
  3. // Continue execution after it is loaded
  4. console.log("loaded myData");
  5. myData();

缓存

第一次对特定文件进行require调用后,将缓存module.exports。

  1. var t1 = new Date().getTime();
  2. var myData1 = require("./myData");
  3. console.log(new Date().getTime() - t1); // longer
  4. var t2 = new Date().getTime();
  5. var myData2 = require("./myData");
  6. console.log(new Date().getTime() - t2); // shorter

共享状态

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

  1. This allows you to share in-memory objects between modules.

在c:/intro/shared/myData.js中我们有

  1. module.exports = {
  2. something: 123
  3. };

在c:/intro/shared/app.js我们有

  1. var myData = require("./myData");
  2. console.log("initial something:", myData.something); // 123
  3. // Now modify something:
  4. myData.something = 456;
  5. // Now load myValue:
  6. var bas = require("./myValue");

在c:/intro/shared/myAnother.js我们有

  1. var myData = require("./myData");
  2. console.log("in another module:", myData.something); // 456

对象工厂

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

在c:/intro/factory/myData.js文件

  1. module.exports = function () {
  2. return {
  3. something: 123
  4. };
  5. };

在c:/intro/factory/app.js我们有

  1. var myData = require("./myData");
  2. // create a new object
  3. var obj = myData();
  4. // use it
  5. console.log(obj.something); // 123

我们甚至可以一步到位

  1. require("./myData")();

核心模块

核心模块是编译成Node二进制的模块。核心模块在 require()中具有最高优先级。在模块命名冲突的情况下,加载核心模块。

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

解析模块位置

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

以下示例显示了REPL环境中resolve()的用法。 require.resolve("http");