Node.js中通过
require
来引入模块,通过module.exports
对象来暴露模块。
每个模块可以实现相应的功能,通过灵活调配各个模块,来合作完成一个项目。
1、三种模块🍰
内置模块、第三方模块、自定义模块
其中内置模块以及第三方模块可以直接引用模块名,自定义模块要写好路径
const fs = require('fs') // Node.js中内置模块
const react = require('react') // 下载安装的第三方模块
const myFile = require('./myFile.js') // 自定义模块,其中.js后缀也可省略不写
⚠️注意:用户创建的每个.js
文件都属于自定义模块,即使没有被使用,但它都是模块,内置一个默认的module
对象,存储如下信息
Module {
id: '.',
path: 'E:\\agap\\nodejs\\module',
exports: {}, //向外暴露什么对象
parent: null,
filename: 'E:\\agap\\nodejs\\module\\01test_require.js',
loaded: false,
children: [], // 引入了什么模块
paths: [
'E:\\agap\\nodejs\\module\\node_modules',
'E:\\agap\\nodejs\\node_modules',
'E:\\agap\\node_modules',
'E:\\node_modules'
]
}
2、引入与暴露
① require来引入模块📥
const m = require('module');
- 执行
file
中全部的代码 - 之后返回file文件的
module.exports
所指的对象,并赋值给m
- 注意,如果require后是有缓存的,多次引入只将被引入的代码执行一次
const m = require('module');
m = require('module');
m = require('module');
- 若内置模块与三方模块重名,则默认加载node.js内置模块
- 引入第三方模块时,会去当前文件夹下的node_modules文件夹下找,找不到再向上层文件夹的node_modules文件夹下找
- 引入自定义文件,如果不写‘./’,则被视为第三方或者内置模块来处理。
- 引入自定义文件,若给的路径是文件夹,则会去找package.json文件中main所指示的入口文件,如果没有的话,会默认认为是index.js
- 引入自定义文件,若给的文件名没有后缀,则依次查找.js .json .node
② module.exports设置暴露信息📤
模块默认暴露的是个空对象,可以设置暴露对象的具体信息
module.exports = {}
例子:
有两个文件,02.js
引入01.js
// 文件01.js
console.log('自定义模块')
module.exports = {userName: 'xiaomei'}
// 同文件夹下的文件02.js
const m01 = require('./01.js');
console.log(m01)
最终控制台输出:
自定义模块 //执行01输出
{userName: 'xiaomei'} //执行02输出
3、模块间作用域隔离📁
①作用域隔离
模块内部有单独的作用域,模块之间只有一条管道可以相互沟通,就是通过module.exports和require来传递对象。
两个模块是手牵手的关系
②作用域共享
区分于html中引入两个js文件,通常会将代码直接引入其中,将变量都挂载到window下,后面的同名变量会覆盖前面。
两个文件是贴贴的关系,共享变量与方法