node模块化
# Node模块化
- 模块化的基本概念
Node.js
中模块的分类npm
与包- 模块的加载机制
模块化是指解决一个复杂问题时,自顶向下逐层划分为若干模块的过程。对整个模块系统来说,模块是可组合、分解和更换的单元
编程领域的模块化
编程领域中的模块化,就是遵守固定的规则,把一个大文件拆分成独立并相互依赖的多个小模块
- 提高了代码的复用性
- 提高了代码的可维护性
- 可以实现按需加载
模块化规范
模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的那些规则
- 使用什么样的语法格式来引用模块
- 在模块中使用什么 样的语法格式向外暴漏成员
# 基本概念
Node.js
中根据模块来源的不同,将模块分为了 3 大类
- 内置模块(由官方提供,列如fs、path、http等)
- 自定义模块(自己写的 js 文件)
- 第三方模块
# 加载模块
require()
方法可以加载需要的内置模块、自定义模块、第三方模块
const fs = require('fs')
const custom = require('./custom.js')//也能省略后缀名
const moment = require('moment')
1
2
3
2
3
注意
require()
方法加载其它模块时,会执行被加载模块中的代码
# 模块作用域
和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域
# 向外共享模块作用域中的成员
在每个 .js
自定义模块中都有一个 module
对象 ,它里面存储了和当前模块有关的信息
示例
Module {
id: '.',
path: 'H:\\code-demo\\learn-m\\heima76\\11.node.js\\02.path',
exports: {},
filename: 'H:\\code-demo\\learn-m\\heima76\\11.node.js\\02.path\\m2.js',
loaded: false,
children: [
Module {
id: 'H:\\code-demo\\learn-m\\heima76\\11.node.js\\02.path\\m1.js',
path: 'H:\\code-demo\\learn-m\\heima76\\11.node.js\\02.path',
exports: {},
filename: 'H:\\code-demo\\learn-m\\heima76\\11.node.js\\02.path\\m1.js',
loaded: true,
children: [],
paths: [Array]
}
],
paths: [
'H:\\code-demo\\learn-m\\heima76\\11.node.js\\02.path\\node_modules',
'H:\\code-demo\\learn-m\\heima76\\11.node.js\\node_modules',
'H:\\code-demo\\learn-m\\heima76\\node_modules',
'H:\\code-demo\\learn-m\\node_modules',
'H:\\code-demo\\node_modules',
'H:\\node_modules'
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# module.exports
对象
在自定义模块中,可以使用 module.exports
对象,将模块内的成员共享出去
默认情况下是一个空对象 {}
如果要向外共享成员,需要对exports对象挂载
module.exports.username = 'yuadh'
module.exports.password = '123'
module.exports.login = function(){
console.log('loging');
}
1
2
3
4
5
2
3
4
5
此时打印出的不再是一个空对象
注意
require方法导入模块是,导入的结果,永远以 module.exports
对象为准,如果对象被覆盖就是覆盖的内容
# exports对象
module.exports
对象和 exports
对象指向同一个内容 (exports指向module.exports对象)
最终指向以 module.exports
对象 挂载内容为最终结果
# 误区案例
- case 1
exports.username = 'y'
module.exports = {
gander : 'man',
age : 22
}
//最终结果为 {gander:'man',age:22}
1
2
3
4
5
6
2
3
4
5
6
- case 2
module.exports.username = 'y'
exports = {
gander: 'man',
age:22
}
//最终结果为 {username:'y'}
1
2
3
4
5
6
2
3
4
5
6
- case 3
exports.username = 'y'
module.exports.gander = 'man'
//最终结果 {username:'y',gander:'man'}
1
2
3
2
3
- case 4
exports = {
gander: 'man',
age:22
}
module.exports.username = 'y'
//最终结果为{username:'y',gander:'man',age:22}
1
2
3
4
5
6
2
3
4
5
6
# 模块化规范
Node.js
遵循了 CommonJS
模块化规范,CommonJs
规定了模块的特性与各模块之间如何互相依赖
- 每个模块内容,module 变量代表当前模块
- module 变量是一个对象,它的 exports 属性 是对外的接口
- 加载某个模块,其实是加载改模块的
module.exports
属性 ,require()用于加载模块
编辑 (opens new window)
上次更新: 2023/02/07, 14:51:48