1.require获得的东西永远来自module.exports
虽然一开始exports和module.exports指向的对象一致,可以共同声明对象的一个属性和方法,但是如果module.exports指向一个对象,则require获取的东西始终为module.exports指向的那个对象。
2.commonjs规范
- 每个模块内部,
module
变量代表当前模块 module
变量是一个对象,module.exports
是对外的接口- 加载某个模块即加载该模块的
module.exports
属性
3.模块的加载机制
模块具有缓存机制,如多行require拿同一个模块,模块只执行一次。不会重复执行。
内置模块加载(由Node.js官方提供,如:fs、path、querystring等 )
内置模块加载优先级最高,比如内置模块和第三方模块同名,加载的为内置模块。
自定义模块的加载机制(开发者自己定义的模块,每一个js文件都可以称为一个模块)
加载自定义模块时,路径要以 ./
或 ../
开头,否则会作为内置模块或第三方模块加载。
导入自定义模块时,若省略文件扩展名,则 Node.js 会按顺序尝试加载文件:
- 按确切的文件名加载
- 补全
.js
扩展名加载 - 补全
.json
扩展名加载 - 补全
.node
扩展名加载 - 报错
第三方模块加载机制(由第三方开源出来的模块,使用前需要npm工具从npm社区下载)
如果传给require的模块标识符不是内置模块,也不是以 ./
或 ../
开头,nodejs就会就会从当前模块的父目录开始,尝试从node_modules里加载第三方模块。如果还找不到模块,则再移动到上一层进行加载,直到文件系统根目录为止。如果找不到就会报错
目录作为模块进行加载
- 在被加载的目录下查找
package.json
的文件,并寻找main
属性,作为require()
加载的入口 - 如果没有
package.json
文件,或者main
入口不存在或无法解析,则 Node.js 将会试图加载目录下的index.js
文件。 - 若失败则报错