目录
4.2.1 module.exports与require()
1 模块化
向我们之前引入的 fs,path,http 这些都是模块,每个模块干不同的事情
模块分为内置模块,自定义模块与第三方模块。
- 内置模块,官方的模块,像fs,path,http
- 自定义模块,自己写的js文件
- 第三方模块,非官方的别人写的js文件,也叫包
Node.js遵循CommonJS模块化规范,CommonJS规定了模块的特定于各模块之前如何相互依赖
CommonJS中的一些规范
- 每个模块内部,用module变量代表当前模块
- module变量是一个对象,它的exports属性是对外的接口
- 加载某个模块实则是加载该模块的module.exports属性。require()方法用于加载模块
2 加载模块
我们用require函数加载模块,内置模块和第三方模块我们都这样加载
自定义模块我们加载一个看一下
我当前有一个需要加载的模块.js,内容为console.log(1)
然后在同级目录下创建 2.加载自定义模块.js 进行引用,其他什么都不做
发现引用的内容被执行了
使用require方法加载包也可以不写 .js
效果一样
3 模块作用域
在自定义模块中定义一个全局变量
在被引用的文件中也可以正常使用
但如果要定义一个局部变量就使用不了了,我们把关键字都用上看一下
发现 var const let 都不行
所以当你自己写模块的时候最好不要用全局变量,那样会影响别的代码
4 module对象
4.1 初识module对象
module对象是node.js中的内置对象,我们打印出来看一下
其中 path是该文件所处的路径,filename是文件所处的路径再加一个文件名
4.2 module.exports
可以通过module.exports将模块内的变量与函数共享出去
4.2.1 module.exports与require()
外界使用require()方法导入的自定义模块,实际上就是module.exports指向的对象
如果被导入的模块module.exports中没有东西
那就会返回一个空对象
如果有东西就可以看到module.exports中的内容
4.2.2 添加变量与方法
可以给自定义模块定义一些变量或方法
这样就能打印出来一些东西
导入后就可以调用了
也可以这样添加,总的来讲保证module.exports是一个对象就行
- 如果有冲突,下面的会覆盖掉上面的,像我这样重新定义了module.exports,那么重新定义的module.exports就会覆盖上面全部
同样可以使用
5 exports对象
5.1 初识exports对象
因为module.exports太长了,所以node提供了一个exports对象。功能与module.exports相同,默认情况下exports与module.exports指向相同的对象
你可以在任意的文件中打印出来看一下
可以使用 === 来判定exports与module.exports目前是否为同一个对象,true表示目前是同一个对象
5.2 添加变量与方法
与module.exports方法相似
我们用一下看看
使用require导入模块永远得到的是module.exports对象的内容,默认情况下指向的对象相同所以无所谓,现在我们更改module.exports的对象
使用的代码不变
发现myModule中只有我们刚刚定义的对象,没有后面exports定义的username与add_one
可以通过下面四个例子加深一下exports与module.exports的理解
6 模块的加载机制
6.1 优先从缓存加载
模块在第一次加载后回被缓存,多次使用require()调用相同的包不会被执行多次
无论是内置模块,自定义模块,第三方模块,都会优先从缓存中加载
6.2 内置模块优先级最高
内置模块的加载优先级最高,比如 即使你有一个自定义模块或第三方模块也叫fs,你用require()进行加载,永远加载内置的fs模块
6.3 自定义模块的寻找顺序
使用require()加载文件时会按照下面的顺序依次进行加载
- 按照确切的文件名进行加载(如果没有任何扩展名优先按具体的名字加载,比如我的文件就叫test,不叫test.js test.json test.node 这些,就会加载test这个文件)
- 补全 .js扩展名进行加载
- 补全 .json扩展名进行加载
- 补全 .node扩展名进行加载
6.4 第三方模块的寻找顺序
使用require()加载第三方模块的时候,优先会从当前路径下的 node_modules 中加载,如果没有就移动到上一层父目录中找node_modules,如果还没有就再向上,直到文件系统的根目录,做个例子
我在 D:\Node.js_demo\6.npm\ 打开终端
先找 D:\Node.js_demo\6.npm\node_modules\moment
再找 D:\Node.js_demo\node_modules\moment
再找 D:\node_modules\moment
找到D盘根目录都没有就不找了,报错
6.5 目录作为require()参数
优先找目录中的 package.json文件,加载其中的main(入口文件)
如果没找到就会加载目录中的 index.js 文件
如果都没有就报错