模块化

112 阅读3分钟

模块化的基本概念

什么是模块化

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

编程领域的模块化

就是遵守固定的规则, 把一个大文件拆成独立并相互依赖的多个小模块

代码模块化拆分的好处:

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

模块化规范

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

例如:

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

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

Node.js中的模块化

Node.js中的模块分类

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

加载模块

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

// 加载内置的fs模块
const fs = require('fs')

// 加载用户自定义模块
const custom = require('./custom.js')

// 加载第三方模块
const moment = require('moment')

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

Node.js中的模块作用域

什么是模块作用域

函数作用域类似,可以自定义模块中定义的变量方法等成员, 只能在当前模块内被访问, 这种模块级别的访问限制, 叫做模块作用域

模块作用域的好处

防止了全局变量污染的问题

向外共享模块作用域中的成员

module对象

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

Module {
  id: '<repl>',
  path: '.',
  exports: {},
  parent: undefined,
  filename: null,
  loaded: false,
  children: [],
  paths: [
    '/Users/xiamin/Documents/project/fsg/bm-gas-report/repl/node_modules',
    '/Users/xiamin/Documents/project/fsg/bm-gas-report/node_modules',
    '/Users/xiamin/Documents/project/fsg/node_modules',
    '/Users/xiamin/Documents/project/node_modules',
    '/Users/xiamin/Documents/node_modules',
    '/Users/xiamin/node_modules',
    '/Users/node_modules',
    '/node_modules',
    '/Users/xiamin/.node_modules',
    '/Users/xiamin/.node_libraries',
    '/usr/local/lib/node'
  ]
}

module.exports对象

module.exports对象,将模块内的成员共享出去, 供外界使用。

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

共享成员时的注意点

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

向外共享模块作用域中的成员

exports对象

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

exportsmodule.exports的使用误区

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

示例1:

 exports.userName = 'john'
 module.exports = {
     gender: '男',
     age: 22
 }
 
 // {gender: '男', age: 22}

示例2:

    module.exports.userName = 'john'
    exports = {
        gender: '男', 
        age: 22
      }
    
    // {userName: 'john'}

示例3:

    exports.userName = 'john'
    module.exports.gender = '男'
    
    // {userName: 'john', gender : '男'}

示例4:

    exports = {
        userName = 'john',
        gender: '男'
    }
    module.exports = exports
    module.exports.age = 22
    
    // {userName: 'john', gender: '男', age: '22'}
    

Node.js中的模块化规范

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

CommonJS规定:

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

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情