Node.js 教程

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

新闻动态 联系方式 广告合作 招聘英才 安科实验室 帮助与反馈 About Us

Copyright © 2013 - 2019 Ancii.com All Rights Reserved京ICP备18063983号-5 京公网安备11010802014868号