Node 模块化【详细】

Node模块化

为什么要模块化开发呢? 聊聊它的好处

  1. 提高了代码的复用性
  2. 提高了代码的可维护性
  3. 可以实现按需加载

那么什么是模块化开发呢:
编程领域中的模块化指的就是,遵守固定的原则,把一个大文件拆分成独立并互相依赖的小模块

Node中的模块分类:

Node中根据来源不同,可以把模块分为三大类:

  1. 内置模块也就是我们之前说到的:(Node模块是由Node官方提供的,例如:fspathhttp
  2. 自定义模块(就是我们自己创建的.js文件
  3. 第三方模块(也就是不是官方提供的模块,这类模块我们想使用就必须先下载)

我们是如何加载这三种模块的呢:

// 加载内置模块方法:
const fs = require('fs');
// 加载自定义模块方法:
const custom = require('./custom.js');    
// 加载第三方面模块:
const moment = require('moment');

tips:

  1. 使用require()加载模块的同时,不仅仅是加载了这个模块同时还把加载的这个模块执行了一遍;
  2. 使用自定义加载模块的时候,可以省略文件的后缀名

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规定:

  1. 每个模块内部,module变量代表当前模块;
  2. module变量是一个对象,它的exports属性(也就是:module.exports是对外的接口
  3. 使用require()加载某个模块其实就时加载该模块的module.exports属性

不断复盘,不断优秀,踏实做人,认真做事;关注三连,持续更新~~~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/egg_er/article/details/122859417