在 node 中,模块分为 核心模块 和 其他模块(也可以叫自定义模块,用户写的,或者从npm上下载下来的模块)
-
核心模块指的就是 node 提供的模块,如 fs、http 等模块。
- 核心模块是直接通过node源码直接编译成二进制文件
- 在node进程启动时,部分核心模块就直接加载在内存中了,比如
console
,是不需要引入的 - 核心模块加载速度是最快的
-
自定义模块就是用户自己写的或者加载第三方的模块
在使用commonJS规范的node模块中,每个模块中都自带了5个属性。
分别是 module,exports,require,__filename,__dirname 这5个。
// app.js
console.log(module); // 输出 module 对象
console.log(exports); // 输出 exports 对象
console.log(require); // 这是一个函数
console.log(__filename); // 当前模块所在路径 + 当前模块
console.log(__dirname); // 当前模块所在的路径
node app.js # 通过 node 运行 app.js
module对象的属性
# console.log(module); 的输出
Module {
id: '.', # 当前模块id
exports: {}, # 表示当前模块暴露给外部的对象
parent: null, # 表示调用当前模块的模块
filename: 'F:\common\app.js', # 当前模块的绝对路径
loaded: false, # 布尔值,表示当前模块是否被完全加载
children: [], # 表示当前模块调用的模块
paths: [ 'F:\common\node_modules', 'F:\node_modules' ]
}
module的加载过程
- 通过计算获取模块的绝对路径
- 判断是否存在缓存,如果有,加载缓存
- 判断是否是核心模块
- 生成模块的实例,存进缓存
- 加载模块
- 输出模块的exports属性
参考: 《深入浅出Node.js》作者:朴灵 第二章 模块机制