1. 什么是模块化

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

2. 编程领域中的模块化

编程领域中的模块化, 就是遵守固定的规则, 把一个大文件拆成独立互相依赖的多个小模块
把代码进行模块化拆分的好处。

  • 提高了代码的复用性
  • 提高了代码的可维护型
  • 可以实现按需加载

    3. 模块化规范

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

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

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

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

4. Node.js中模块的分类

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

  • 内置模块(内置模块是由Node.js官方提供的, 例如fs,path,http等)
  • 自定义模块(用户创建的每个.JS文件, 都是自定义模块)
  • 第三方模块(由第三方开发出来的模块, 并非官方提供的内置模块, 也不是用户创建的自定义模块, 使用前需要先下载)

    5. 加载模块

    使用强大的require()方法,可以加载需要的内置模块、用户自定义模块第三方模块进行使用。
    1. //加载内置的fs模块
    2. const fs = require('fs');
    3. //加载用户的自定义模块
    4. const custom = require('./custom.js')
    5. //加载第三方模块
    6. const moment = require('moment)
    注意: 使用require()方法加载其他模块时, 会执行被加载模块中的代码。

    6. 什么时模块作用域

    函数作用域类似, 在自定义模块中定义的变量方法等成员, 只能在当前模块内被访问, 这种模块级别的访问限制叫做模块作用域
    模块作用域的好处: 防止全局变量污染的问题。

    7. module对象

    在一个自定义模块中, 默认情况下, module.exports = {}
    在外界使用require导入。
    通过module.exports对象向外共享成员。
    在外界使用require导入的自定义模块的时候, 得到的成员, 就是那个模块中,通过module.exports指向的那个对象。 ```javascript //index3.js const str = ‘哈哈, 我是index3.js’ console.log(str) module.exports = str;

//index4.js const aa = require(‘./index3’) console.log(aa)
//哈哈, 我是index3.js

  1. **共享成员时注意:**<br />使用**require()**方法导入模块时, 导入的结果, 永远以**module.exports**指向的对象为准。![clipboard.png](https://cdn.nlark.com/yuque/0/2022/png/27402074/1655295560291-f292c4d6-6f53-4c85-9ace-2cc15fc2c16d.png#clientId=uba26c2fc-4c6b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=286&id=u29dd68a9&margin=%5Bobject%20Object%5D&name=clipboard.png&originHeight=286&originWidth=1431&originalType=binary&ratio=1&rotation=0&showTitle=false&size=45605&status=done&style=none&taskId=ue530fe38-e42e-4aeb-b0f2-3debcf93234&title=&width=1431)
  2. <a name="Vg1Xu"></a>
  3. # 8. exports对象
  4. 由于**module.exports**单词拼起来比较复杂, 为了简化向外共享成员的代码,** Node**提供了**exports**对象。 默认情况下,**exportsmodule.exports指向同一个对象。** 最终共享的结果,还是以**module.exports**指向的对象为准。<br />![clipboard.png](https://cdn.nlark.com/yuque/0/2022/png/27402074/1655295595153-1de65a92-cc4b-46f5-af3f-1ac458844fb8.png#clientId=uba26c2fc-4c6b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=362&id=u6fa3bc1c&margin=%5Bobject%20Object%5D&name=clipboard.png&originHeight=362&originWidth=1184&originalType=binary&ratio=1&rotation=0&showTitle=false&size=191986&status=done&style=none&taskId=u711f943b-babc-4994-a700-2e65416ee4a&title=&width=1184)
  5. ```javascript
  6. // index3.js
  7. exports.name = 'Lisa'
  8. module.exports = {
  9. name:'Iric',
  10. age:20
  11. }
  12. //index4.js
  13. const obj = require('./index3')
  14. console.log(obj) //{ name: 'Iric', age: 20 }

9. NodeJS中的模块化规范

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

  • 每个模块内部,module变量代表当前模块
  • module变量是一个对象, 它的exports属性,即module.exports是对外的接口。
  • 加载某个模块 , 其实是加载改模块的module.exports属性, require()方法用于加载模块