nodejs内置API——模块化
模块化
1. 概念
- 提高了代码的复用性
- 提高了代码的可维护性
- 可以实现按需加载
2. node.js中的模块化
2.1 nodejs中的模块分类
- 内置模块(由node.js官方提供的,如fs、path、http)
- 自定义模块(用户自己写的js文件)
- 第三方模块(由第三方开发的使用前需下载的模块)
2.2 加载模块
使用require()
方法加载需要的模块:
2.3 模块作用域
在模块内部定义的变量方法等成员只能在当前模块内使用,而不能被外界访问。
2.4 共享模块作用域中的成员
- module对象
可以看到存在exports
对象,该对象向外共享。 - module.exports对象
该对象向外共享,所以说当require(某js文件)
时导入的是该js文件中的module.exports指向的对象。
module.exports == exports 最终向外共享的结果以module.exports为准。
与之前的相比,当使用exports暴露时在其他文件中导入时会导入exports暴露出的成员。
2.5 Node.js的模块化规范
3. 模块的加载机制
- 优先从缓存中加载
模块在第一次加载后会被缓存,也意味着多次调用require()
不会导致模块的代码被多次执行。 - 内置模块的加载机制
内置模块是由node官方提供的模块,因此加载优先级是最高的。 - 自定义模块的加载机制
使用require()
加载自定义模块时,必须指定以./
或../
开头的路径标识符,否则node会把它当成内置模块或第三方模块加载。
同时,在使用require()导入自定义模块时如果省略了文件扩展名,则Node.js会按顺序分别尝试加载以下文件:
① 按照确切文件名进行加载。
② 补全.js
扩展名进行加载。
③ 补全.json
扩展名进行加载。
④ 补全.node
扩展名进行加载。
⑤ 加载失败,报错。 - 第三方模块的加载机制
如果传递给require()
的模块标识符不是一个内置模块,也没有以./
或../
开头,则Node.js会从当前模块的父目录开始,尝试从/node_modules
文件夹中加载第三方模块。
如果没有找到对应的第三方模块,则移动到上一层父目录中,直到文件系统的根目录。 - 目录作为模板
当把目录作为模板时有三种加载方式:
① 在被加载的目录下查找package.json文件,并寻找main属性作为require()加载的入口
② 如果目录里没有package.json文件,或者main入口不存在或无法解析,则Node.js将会试图加载目录下的index.js文件。
③如果以上两布都失败则报错。