模块化的基本概念
什么是模块化
模块化是指解决一个复杂问题时, 自顶向下逐层把系统划分为若干模块的过程, 对于整个系统来说, 模块是可组合,分解和更换的单元
编程领域的模块化
就是遵守固定的规则, 把一个大文件拆成独立并相互依赖的多个小模块
代码模块化拆分的好处:
- 提高了代码的复用性
- 提高了代码的可维护性
- 可以实现按需加载
模块化规范
模块化规范就是对代码进行模块化拆分与组合时, 需要遵守的那些规则。
例如:
- 使用什么样的语法格式来引用模块
- 在模块中使用什么样的语法格式向外暴露成员
模块化规范的好处:: 大家都遵守同样的模块化规范写代码, 降低了沟通的成本, 极大方便了各个模块之间的互相调用, 利人利己。
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指向的对象为准。
exports和module.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规定:
- 每个模块内部,
module变量代表当前模块。 module变量是一个对象, 它的exports属性(即module.exports)是对外的接口。- 加载某个模块, 是加载该模块的
module.exports属性。require方法用于加载模块。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情