模块化的相关概念

什么是模块化

  1. 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元

  2. 编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块

   把代码进行模块化拆分的好处

  1. 提高了代码的复用性 
  2. 提高了代码的可维护性

    目录

    什么是模块化

       把代码进行模块化拆分的好处

     模块化相关的概念

    Node 中的模块化

    1.了解 Node 中模块的 3 个大类

    2.使用 require 方法加载模块

    3.了解模块作用域的概念以及好处

    1.什么是模块作用域

    2. 模块作用域的好处

    4. module 对象

    1.了解 module 对象

    2.了解 module.exports 对象的作用

    3.使用 module.exports 向外共享成员

    4.共享成员时的注意点

    5.exports 对象

    6.  exports 和 module.exports 的使用误区

    7. CommonJS 模块化规范


  3. 可以实现按需加载

 模块化相关的概念

  1. 模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的那些规则,例如:

    • 使用什么样的语法格式来引用模块

    • 在模块中使用什么样的语法格式向外暴露成员

  2. 模块化规范的好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用,利人利己

Node 中的模块化

1.了解 Node 中模块的 3 个大类

Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:

  1. 内置模块(内置模块是由 Node.js 官方提供的,例如 fspathhttp 等)

  2. 自定义模块(用户创建的每个 .js 文件,都是自定 义模块)

  3. 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载

2.使用 require 方法加载模块

使用强大的 require() 方法,可以加载需要的内置模块用户自定义模块第三方模块进行使用。例如:

// 1. 加载内置的 fs 模块
const fs = require('fs')
​
// 2. 加载用户的自定义模块
const custom = require('./custom.js')
​
// 3. 加载第三方模块,(使用第三方模块,下面会进行讲解)
const moment = require('moment')

注意事项 1: 使用 require() 方法加载其他模块时,会执行被加载模块中的代码

// 加载模块.js
require('./被加载的模块.js')
​
// 被加载模块.js
console.log('我会被打印')

注意事项2: 在使用 require 加载用户自定义模块期间,可以省略 .js 后缀名

// 加载模块.js
require('./被加载的模块')

3.了解模块作用域的概念以及好处

1.什么是模块作用域

和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,外部文件是访问不到的,这种模块级别的访问限制,叫做模块作用域

// 被加载的模块.js
​
const username = '张三'
​
function sayHello () {
  console.log('说话')
}
// 加载模块.js
​
const custom = require('./被加载的模块')

2. 模块作用域的好处

防止了全局变量污染、文件依赖等问题的产生

4. module 对象

1.了解 module 对象

在每个 .js 自定义模块中都有一个 module 对象,它里面存储了和当前模块有关的信息,打印如下:

2.了解 module.exports 对象的作用

  1. 在自定义模块中,可以使用 module.exports 对象,将模块内的成员共享出去,供外界使用

  2. 外界用 require() 方法导入自定义模块时,得到的就是 module.exports 所指向的对象

    // 记载模块.js
    const mo = require('./被加载的模块')
    ​
    console.log(mo) // {}
    // 被加载的模块.js
    ​
    // 当外界使用 require 导入一个自定义模块的时候,得到的成员,就是模块中,通过 module.exports 指向的那个对象
    // console.log('我会被加载')

3.使用 module.exports 向外共享成员

// 加载模块.js
const mo = require('./被加载的模块.js')

console.log(mo)


// 被加载的模块.js
​
// 向 module.exports 对象上挂载 username 属性
module.exports.username = 'zs'
​
// 向 module.exports 对象上挂载 sayHello 方法
module.exports.sayHello = function () {
  console.log('Hellp')
}

4.共享成员时的注意点

使用 require() 方法导入模块时,导入的结果,永远以 module.exports 指向的对象为准

// 加载模块.js
const mo = require('./被加载的模块.js')
​
console.log(mo) // { username: '小黑', sayHi: [Function: sayHi] }


// 被加载模块.js
​
// 当外界使用 require 导入一个自定义模块的时候,得到的成员,就是模块中,通过 module.exports 指向的那个对象
// console.log(module)
​
// 向 module.exports 对象上挂载 username 属性
module.exports.username = 'zs'
​
// 向 module.exports 对象上挂载 sayHello 方法
module.exports.sayHello = function () {
  console.log('Hellp')
}
​
// 使用 module.exports 指向一个全新的对象
module.exports = {
  username: '小黑',
  sayHi() {
    console.log('小黑')
  }
}
​

5.exports 对象

由于 module.exports 单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了 exports 对象。默认情况下,exportsmodule.exports 指向同一个对象。最终共享的结果,还是以 module.exports 指向的对象为准

console.log(exports)
​
console.log(module.exports)
​
// 默认情况下,`exports` 和 `module.exports` 指向同一个对象
console.log(exports === module.exports) // true
​
// 将私有成员共享出去
exports.username = 'zs'
​
// 直接挂载方法
exports.sayHello = function () {
  console.log('Hellp')
}

6.  exportsmodule.exports 的使用误区

  1. 时刻谨记,require() 模块时,得到的永远是 module.exports 指向的对象

  2. 注意:为了防止混乱,建议大家不要在同一个模块中同时使用 exportsmodule.exports

exports.username = 'Tom' // 不会被打印
​
module.exports = {
  gender: '男',
  age: 22
}
module.exports.username = 'Tom'
​
// 不会被执行
exports = {
  gender: '男',
  age: 22
}
​
// 两个都会执行
module.exports.username = 'Tom'
​
exports.gender = '男'
// 三个都会打印
exports = {
  gender: '男',
  age: 22
}
​
module.exports = exports
module.exports.username = 'Tom'

7. CommonJS 模块化规范

  1. Node.js 遵循了 CommonJS 模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖

  2. CommonJS 规定:

    • 每个模块内部,module 变量代表当前模块

    • module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口

    • 加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端程序员辉哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值