在 NodeJS 中有一个方法是我们使用频率最高的,那就是 require 方法。NodeJs 遵循 CommonJS 规范,该规范的核心是通过 require来加载其他依赖的模块。
几个问题
- module.exports 或者 exports 是全局变量吗?
- 模块的加载是同步还是异步?
- 循环引用会不会产生性能问题或者导致错误?
什么是 CommonJS
每一个文件就是一个模块,拥有自己独立的作用域,变量,以及方法等,对其他的模块都不可见。CommonJS 规范规定,每个模块内部,module 变量代表当前模块。这个变量是一个对象,它的 exports 属性(即module.exports
)是对外的接口。
Node 模块的分类
- build-in modules —— Nodejs 中以 C++ 形式提供的模块。
- constant module —— Nodejs 中定义常量的模块。
- native module —— Nodejs 中以 javascript 形式提供的模块。
- 第三方module —— 由第三方提供的模块。
module 对象
NodeJs 内部提供一个 Module 构建函数。所有模块都是 Module 的实例。
每个模块内部,都有一个 module 对象,代表当前模块。它有以下属性。
-
module 对象的属性
module.id
模块的识别符,通常是带有绝对路径的模块文件名。module.filename
模块的文件名,带有绝对路径。module.loaded
返回一个布尔值,表示模块是否已经完成加载。module.parent
返回一个对象,表示调用该模块的模块(程序入口文件的module.parent为null)module.children
返回一个数组,表示该模块要用到的其他模块。module.exports
表示模块对外输出的值。
-
module.exports 属性
module.exports
属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports
变量。module.exports
属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports
变量。 -
exports 变量
我们有时候会这么写:
// test.js
function test(){
console.log(test);
}
export.test = test;
// result.js
const test = require("./test")
这样也可以拿到正确的结果,这是因为:exports 变量指向 module.exports。这等同在每个模块头部,有一行这样的命令。
var exports = module