最近看别人写的源码时发现一个有趣的现象,
import {promises as fsPromises} from 'node:fs';
import {promisify} from 'node:util';
import {Buffer} from'node:buffer';
import path from 'node:path';
上面这些包都是node内置的
为啥引入的时候需要加个node:
呢?查资料才知道原因。
require机制
总结一下就是:
require
函数是 commonjs
实现模块化
的重要函数,首先使用node内置fs模块读取 指定路径
的模块文件 的字符串(fs.readFile
读取到的是一个字符串),然后使用内置vm模块进行运行。(vm虚拟环境
)。
require加载过程
1.导入相关模块,创建一个Require方法。
2.抽离通过Module._load方法,用于加载模块。
3.Module.resolveFilename 根据相对路径,转换成绝对路径。
4.缓存模块 Module._cache,同一个模块不要重复加载,提升性能。
5.创建模块 id: 保存的内容是 exports = {}相当于this。
6.利用tryModuleLoad(module, filename) 尝试加载模块。
7.Module._extensions使用读取文件。
8.Module.wrap: 把读取到的js包裹一个函数。
9.将拿到的字符串使用runInThisContext运行字符串。
10.让字符串执行并将this改编成exports。
然后看官网api文档Node:ModuleName
使用 node:ModuleName
会直接绕过所需的缓存,直接绕过第4步,不需要等待,直接调用内置模块,但是却无法使用缓存。