Node模块化
为什么要模块化开发呢? 聊聊它的好处
:
- 提高了代码的
复用性
- 提高了代码的
可维护性
- 可以实现
按需加载
那么什么是模块化开发呢:
编程领域中的模块化指的就是,遵守固定的原则
,把一个大文件拆分成独立并互相依赖的小模块
。
Node中的模块分类:
Node中根据来源不同,可以把模块分为三大类:
- 内置模块也就是我们之前说到的:(Node模块是由Node官方提供的,例如:
fs
,path
,http
) - 自定义模块(就是我们自己创建的
.js文件
) - 第三方模块(也就是不是官方提供的模块,这类模块我们想使用就必须先下载)
我们是如何加载这三种模块的呢:
// 加载内置模块方法:
const fs = require('fs');
// 加载自定义模块方法:
const custom = require('./custom.js');
// 加载第三方面模块:
const moment = require('moment');
tips:
- 使用require()加载模块的同时,不仅仅是加载了这个模块同时还把加载的这个模块执行了一遍;
- 使用自定义加载模块的时候,可以省略文件的后缀名
Node.js的作用域
这个作用域也叫模块作用域,也就是说,不同模块中的变量,方法只能被当前模块访问,别的模块想访问就必须使用一些手段才可以,并不能直接跨域访问。
此时的输出结果是: {} (输出结果是空对象,也就是说明模块有自己的作用域)
那么模块作用域的好处是什么呢:
作用:
防止了全局变量污染的问题
那么如何把模块作用域中的成员共享出去呢:
我们要用到的就是module对象
。
这个对象主要是存储当前模块下的有关信息;
我们终端打印一下:(特别要记住的就是exports属性,这个属性就是对外共享信息的接口)
那么咱们说说这个module.exports
,他其实就是我们使用require()方法
导入模块后的返回值。返回的就是module.exports
这个对象
共享成员的注意点:
使用require()方法导入模块时;导入的结果永远以module.exports为主
;
以上代码解释:
我们看上面右边代码,我们使用了: module.exports.username = 'zs';
给exports
对象附加了一个属性值,如果是此时我们查询导入模块后的结果,那肯定是username = 'zs';
但是我们看,后面我们又重新对exports
对象进行了定义,赋值,所以前面定义好的也就被覆盖住了
,因此此时的输出结果就不再有
之前的username='zs'
以及 sayHello
方法;
exports对象
我们知道,想让模块作用域中的变量方法被访问,我们使用module.exports对象来导出我们想要的数据即可,但是这样太麻烦,因为总要打一个module单词,所以Node.js提供了一个exports对象,来代替module.exports,这样就可以更加方便的开发
tips:
最终共享的结果,以module.exports指向的对象为主
;所以我们在共享的时候,尽量使用一种,要么使用
exports,要么使用
module.exports,不要混淆着用。
如果混淆的使用了怎么办:
如果混淆了,切记最终共享的结果,以module.exports指向的对象为主
;
举四个栗子:
exports.username = 'cyg';
module.exports = {
gender:'女',
age:21
}
代码结果分析
:此时导入模块以后的结果是: gender:'女' ,age:21
而不是username:'cyg'
栗子二:
module.exports.username = 'cyg';
exports = {
gender:'女',
age:21
}
代码结果分析
:username:‘cyg’,而不是 下面的gender:‘女’ ,age:21,因为:最终共享的结果,以module.exports指向的对象为主
栗子三:
exports.username = 'cyg';
module.exports.gender = '女';
代码结果分析
: 此时都是对exports这个对象进行的添加属性并赋值的操作,并没有重新对这个对象重新定义,因此两个属性的导入都成功。 输出结果为: username:'cyg',gender:'女'
栗子四:
exports = {
username: 'cyg',
gender:'女'
}
module.exports = exports; // 此时把上面的exports的结果赋值给了module.exports
module.exports.age = '21';
代码结果分析
: 由于module.exports = exports;
让上面的exports
的结果赋值给了module.exports
,最后一行代码是在module.exports
对象中再添加一个age属性,因此最终的输出结果就是:username: 'cyg', gender:'女',age:21;
tips:
为了防止混乱,避免产生这样的问题,我们在同一个模块不要同时使用exports和module.exports,使用一个即可。
Node.js遵循了CommonJS模块化规范
CommonJS规定:
- 每个模块内部,
module变量
代表当前模块; - module变量是一个对象,它的exports属性(也就是:
module.exports
)是对外的接口
- 使用require()加载某个模块其实就时加载该模块的
module.exports
属性
不断复盘,不断优秀,踏实做人,认真做事;关注三连,持续更新~~~