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属性
不断复盘,不断优秀,踏实做人,认真做事;关注三连,持续更新~~~

本文深入探讨了Node.js中的模块化开发,包括提高代码复用性、可维护性和按需加载的优势。介绍了内置模块、自定义模块和第三方模块的加载方式,并详细解析了模块作用域和module.exports及exports的使用。通过实例展示了如何正确导出和共享模块成员,强调了避免混淆module.exports和exports的重要性。此外,还提到了Node.js遵循的CommonJS规范。
856

被折叠的 条评论
为什么被折叠?



