Node.js模块化
在此之前,编写的http服务都是单文件,单文件应对单个需求问题不大,但是复杂场景存在一些问题:
-
变量命名,前面定义了名字后面无法使用。
-
代码服务性差,在当前代码封装的函数在其他代码中无法使用。
-
可维护性差,多人开发对同一个文件编辑容易发生冲突。
如何解决上述问题?模块化技术。
介绍
什么是模块化与模块?
-
将一个复杂程序文件按照一定的规则(规范)拆分成多个文件的过程称为
模块化
。 -
拆分得到
每个文件就是一个模块
。模块内部的数据是私有的,但是模块可以暴露内部数据供其他模块使用。
什么是模块化项目?
编码时是按照模块一个个编写的,这个项目就是模块化项目。
模块化的好处
- 防止各个模块之间的命名冲突
- 高复用性
- 高维护性,方便进行任务的划分
模块暴露数据
模块暴露数据的方法有两种:
exports.name = value
// 方法1:
exports.name = value
module.exports =value
// 方法2:
module.exports = value // 暴露单个数据
moddule.exports = { // 暴露多个数据
key1:value1,
key2:valule2
}
// 暴露多个数据的简写方法,此种情况默认key值为value值
moddule.exports = {
value1,
value2
}
注意:
-
不能使用exports = value形式暴露数据。
原因:
-
存在这样的隐式关系
exports = module.exports ={}
,require返回的是目标模块module.exports的值。 - 如果采用exports = value的形式赋值(
但是如果exports在底层是用const声明,那么这条语句会报错;let声明不会报错
)那么exports的内容就变成了value,而不再和module.exports指向共同的对象。 - 此时:module.exports指向的对象的内容未发生改变。
-
导入(引入)模块
要想使用模块的暴露数据,需要先导入该模块。
导入方法:在模块中使用require传入文件路径即可引入文件。
const test = require('文件路径')
require的注意事项
-
文件路径
-
导入
自己创建的模块
,导入路径要写相对路径,且不能省略./
和../
const test = requeire('./me.js')
在写项目时都是相对路径。
-
导入
内置模块
时,require括号内直接写模块的名字即可,无需写./
和../
-
-
文件路径后缀
-
js
和json
文件导入时不写后缀会自动识别,在底层补充文件后缀。 -
如果js和json重名,不写后缀会优先导入js。(不建议)
-
如果导入其他类型的文件,会以
js
文件进行处理。
-
-
如果导入路径是个文件夹:
-
首先检测该文件夹下的
package.json
文件中的mian
属性对应的文件如果存在则导入,如果文件不存在会报错
-
如果package.json不存在,或main属性
则尝试导入该文件夹下的
index.js
和index.json
,如果还没找到,就会报错。注意:这些文件是被当做模块处理的,可以使用这些文件的暴露数据。
-
require导入基本流程
这里只讨论自定义模块,不讨论内置模块。
https://www.bilibili.com/video/BV1gM411W7ex?p=72&spm_id_from=pageDriver&vd_source=dde2f4dd432156027fedf9b1734ba705
nodejs底层 面试题
CommonJS规范
-
Node.js实现了CommonJS模块化规范
module.exports
、exports
、require
,这些都是CommonJS
模块化规范的内容。 -
Node.js和ConnmonJS的关系类似于JavaScript和ECMAScript。