Node.js模块加载机制详解:内置、文件与缓存策略

作者:墨池时间:2026-10-28 11:45:41浏览:468

本文深入解析Node.js的模块加载机制,涵盖内置模块、文件模块及目录模块的加载规则。重点阐述require函数的行为、node_modules的递归搜索路径,以及模块自动缓存原理,帮助开发者避免命名冲突并优化性能。

Node.js模块加载机制详解:内置、文件与缓存策略

无论是通过NPM安装的第三方模块,还是本地模块,每个模块都会暴露一个公开的API供开发者导入使用。例如:

代码如下:

var mod = require('module_name')

执行上述语句后,Node.js内部会载入内置模块或通过NPM安装的模块。require函数返回一个对象,该对象公开的API可以是函数、对象或属性,例如函数、数组,甚至是任意类型的JavaScript对象。

接下来列举Node模块的载入及缓存机制:

1)载入内置模块(A Core Module) 2)载入文件模块(A File Module) 3)载入文件目录模块(A Folder Module) 4)载入node_modules里的模块 5)自动缓存已载入模块

一、载入内置模块

一、载入内置模块

Node的内置模块被编译为二进制形式,引用时直接使用名字而非文件路径。当第三方模块和内置模块同名时,内置模块将覆盖第三方同名模块。因此命名时需要注意不要和内置模块同名。例如获取一个http模块:

代码如下:

var http = require('http')

返回的http即是实现了HTTP功能的Node内置模块。

二、载入文件模块

二、载入文件模块

绝对路径的

代码如下:

 
var myMod = require('/home/base/my_mod')


或相对路径的

代码如下:

 
var myMod = require('./my_mod')


注意,这里忽略了扩展名“.js”,以下是对等的:

代码如下:

 
var myMod = require('./my_mod')
var myMod = require('./my_mod.js')

  

三、载入文件目录模块

三、载入文件目录模块

可以直接require一个目录,假设有一个目录名为folder,如:

代码如下:

 
var myMod = require('./folder')

此时,Node将搜索整个folder目录,Node会假设folder为一个包并试图找到包定义文件package.json。如果folder目录里没有包含package.json文件,Node会假设默认主文件为index.js,即会加载index.js。如果index.js也不存在,那么加载将失败。

假如目录结构如下

Node.js模块加载机制详解:内置、文件与缓存策略

package.json定义如下

代码如下:

{
"name": "pack",
"main": "modA.js"
}

此时 require('./folder') 将返回模块modA.js。如果package.json不存在,那么将返回模块index.js。如果index.js也不存在,那么将发生载入异常。

四、载入node_modules里的模块

四、载入node_modules里的模块

如果模块名不是路径,也不是内置模块,Node将试图去当前目录的node_modules文件夹里搜索。如果当前目录的node_modules里没有找到,Node会从父目录的node_modules里搜索,这样递归下去直到根目录。

不必担心,npm命令可让我们很方便的去安装,卸载,更新node_modules目录。

五、自动缓存已载入模块

五、自动缓存已载入模块

对于已加载的模块Node会缓存下来,而不必每次都重新搜索。下面是一个示例

modA.js

代码如下:

console.log('模块modA开始加载...')
exports = function() {
console.log('Hi')
}
console.log('模块modA加载完毕')

init.js

代码如下:

 
var mod1 = require('./modA')
var mod2 = require('./modA')
console.log(mod1 === mod2)

命令行执行:

node init.js

输入如下

Node.js模块加载机制详解:内置、文件与缓存策略

可以看到虽然require了两次,但modA.js仍然只执行了一次。mod1和mod2是相同的,即两个引用都指向了同一个模块对象。

作者最新文章