本文已参与[新人创作礼]活动, 一起开启掘金创作之路。
前言
什么是模块化
从百度百科中我们可以了解到:模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部特性。
而在编程领域,模块化就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。
好处:
- 提高了代码的复用性
- 提高了代码的可维护性
- 可以实现按需加载
正文
Node中的模块化
从模块来源的不同,可以将模块分为如下三类:
- 内置模块(内置模块是由
Node.js官方提供的,例如fs、path、http等) - 自定义模块(用户创建的每个 .js 文件,都是自定义模块)
- 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载
内置模块
在之前的学习中,我们已经接触到了内置模块,例如fs、path、http
这些模块的导入非常方便,使用在官网查阅相关文档即可
// 导入node内置模块
const fs = require('fs')
const path = require('path')
const fs = require('fs')
自定义模块(简单演示)
在早期,还没有完好的es6语法的时候,node.js为了规范 遵循CommonJS
因为历史问题,即使es6再好,我们最好还是继续使用CommonJS,毕竟兼容老版本
CommonJS 了解
- 每个模块内部,
module变量代表当前模块。 module变量是一个对象,它的exports属性(即module.exports)是对外的接口。- 加载某个模块,其实是加载该模块的
module.exports属性。 require()方法用于加载模块
简单演示
如上图,我们创建两个文件
一个作为自定义模块(自定义模块.JS)
const name = "kk"
const f1 = function () {
console.log('111')
}
console.log("这是我的第一个自定义模块")
一个作为运行入口(run.js),来导入自己的模块
const myModule = require('./自定义模块.JS')
console.log(myModule)
运行后可以发现:
-
导入自定义模块的时候,node会自动运行该自定义模块内的内容
-
在没有
export的情况下,尝试打印这个模块,发现是个空对象 -
在没有
export的情况下,模块内自定义的变量和方法皆无法访问
自定义模块(正确开箱)
我们导入模块可以用require
那么导出模块也有相应的关键词 exports,module.export
接下来 演示一个自定义时间模块
// 定义获取日期的方法
getTime = function () {
const mydate = new Date();
// 年
const year = mydate.getFullYear();
// 月(月在js中是从0开始,所以要+1)
const months = mydate.getMonth() + 1;
// 日
const day = mydate.getDate();
// 时
const hours = mydate.getHours();
// 分
const minutes = mydate.getMinutes();
// 秒
const seconds = mydate.getSeconds();
var temp = `${year}-${months}-${day} ${hours}:${minutes}:${seconds}`
console.log(temp)
}
// 示例变量
const aaa = '调用getTime方法就可以获得类似 2022-9-4 16:0:53 的数据'
// 模块导出
module.exports = {
getTime,
aaa
}
再创建一个js,用于导入自己写好的模块
// 导入自定义的模块
const diyDate = require('./自定义时间模块')
// 打印模块对象内容
console.log(diyDate)
// 使用自定义模块
diyDate.getTime()
console.log(diyDate.aaa)
运行结果:
非常漂亮,非常标准的一个自定义模块化。
详解exports 和 module.exports
exports和module.exports都可以进行导出模块
她两都是指向一个对象
学过JS 我们知道,添加对象内容 可以直接通过 对象名.变量名进行添加
简单演示
// 导出
exports.name = 'kk'
module.exports.age = '17'
// 导入自定义的模块
const diy = require('./模块导出测试')
// 打印模块对象内容
console.log(diy)
注意点
- 时刻谨记,require() 模块时,得到的永远是 module.exports 指向的对象:
因为,我们可以直接
module.exports = {//新对象}
这时,导出的模块就指向了一个新的对象了,原本的exports.xxx,module.exports.xxx·····这些追加的内容都不被指向了,require只认你最新的module.export={}对象
*建议
- 只用
module.exports - 并且最好 一次性以一个对象的形式导出
- 即
module.exports = {}
第三方模块
第三方模块涉及npm与包,将在下一篇具体教学。