目录
1 模块化
2 加载模块
3 模块作用域
4 module对象
4.1 初识module对象
4.2 module.exports
4.2.1 module.exports与require()
4.2.2 添加变量与方法
5 exports对象
5.1 初识exports对象
5.2 添加变量与方法
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的理解