node的模块化
一、简述
模块化就是对代码进行模块化的拆分与组合
例如:
- 使用什么样的语法格式来引入模块
- 在模块中使用什么样的语法格式来向外暴露模块
二、Node.js中模块的分类
node中根据模块来源不同,将模块分为3大类:
- 内置模块(由node官方提供,例如fs、path、http等)
- 自定义模块(自己创建的js文件,都是自定义模块)
- 第三方模块(第三方开发的模块,使用前需要先下载)
三、加载模块
使用require()方法,可以加载需要的内置模块、自定义模块、第三方模块进行使用。
内置模块与第三方模块直接导入,而自定义模块是按照路径导入的
// 1、加载内置 fs 模块
const fs = require('fs');
// 2、加载自定义模块
const myModel = require('./myModel.js);
// 3、加载第三方模块
const moment = require('moment');
注意:使用require()方法加载其他模块时,会执行被加载模块中的代码。
四、node中的模块作用域
模块作用域和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,。这种模块级别的访问限制叫做模块作用域
com.js
// 在模块作用域中定义变量/函数
const userName = 'bob';
const sayHello = () => {
console.log('你好!')
}
index.js
const com = require('./com.js');
console.log(com);
// 输出 {} 空对象
// index.js中无法访问到com.js模块中私有成员
模块作用域能够很好的防止全局变量污染的问题。
五、向外共享模块作用域中的成员
一般逻辑是通过一个方法抛出要共享的数据,然后其他模块直接导入
module.exports对象
- 在自定义模块中,可以使用
module.exprots对象
,将模块内的数据抛出
,达到共享,供其他模块使用。 - 外界使用
require()方法
导入自定义模块时,得到的就是module.exports
所指向的对象。 - 使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为主。
com.js
// 1、向module.exports对象上挂载要抛出的属性或者方法
module.exports.userName = 'jim';
module.exports.sayhello = () => {
console.log('hello');
};
// 2、让module.exports指向一个全新对象(重新赋值,那么导入就会指向新值)
module.exports = {
otherName: 'bob',
sayHi(){
console.log('hi');
}
}
index.js
const com require('./com.js');
console.log(com);
// 新值
exports对象
由于module.exports 单词写起来复杂,为了简化代码,node提供了exports
对象。默认情况下modele.exports和exports指向同一个对象。最终的共享结果,还是以module.exports指向的对象为准。
com.js 还可以这么写
// 1、exports对象上挂载要抛出的属性或者方法
exports.userName = 'jim';
exports.sayhello = () => {
console.log('hello');
};
注意:require() 模块时,得到的永远是module.exports指向的对象,为了防止混乱,同一个模块不要同时使用exports和module.exports。
Node.js中的模块化规范
node.js遵循来CommonJs模块化规范,CommonJs规定了模块的特性和各模块之间如何相互依赖。
CommonJs规定
- 每个模块内部,
module变量
代表当前模块 - module变量是一个对象,它的exports属性(即
module.exports)是对外的接口
- 加载某个模块,其实是加载该模块的 module,exports属性。
require()方法用于加载模块。