模块化
Nodejs 模块化规范遵循两套一 套 CommonJS 规范另一套 esm 规范
CommonJS 规范
引入模块(require)支持四种格式
- 支持引入内置模块例如 http os fs child_process 等 nodejs 内置模块
- 支持引入第三方模块 express md5 koa 等
- 支持引入自己编写的模块 ./ ../ 等
- 支持引入 addon C++扩展模块 .node 文件
js
const fs = require('node:fs'); // 导入核心模块
const express = require('express'); // 导入 node_modules 目录下的模块
const myModule = require('./myModule.js'); // 导入相对路径下的模块
const nodeModule = require('./myModule.node'); // 导入扩展模块
导出模块 exports 和 module.exports
js
module.exports = {
hello: function () {
console.log('Hello, world!');
},
};
如果不想导出对象直接导出值
js
module.exports = 'Hello, world!';
ESM 模块规范
引入模块 import
必须写在头部
注意使用 ESM 模块的时候必须开启一个选项 打开 package.json 设置 type:module
js
import fs from 'node:fs';
如果要引入 json 文件需要特殊处理 需要增加断言并且指定类型 json node 低版本不支持
js
import data from './data.json' assert { type: 'json' };
console.log(data);
加载模块的整体对象
js
import * as all from 'xxx.js';
动态导入模块
import 静态加载不支持掺杂在逻辑中如果想动态加载请使用 import 函数模式
js
if (true) {
import('./test.js').then();
}
模块导出
- 导出一个默认对象 default 只能有一个不可重复 export default
js
export default {
name: 'test',
};
- 导出变量
js
export const a = 1;
Cjs 和 ESM 的区别
- Cjs 是基于运行时的同步加载,esm 是基于编译时的异步加载
- Cjs 是可以修改值的,esm 值并且不可修改(可读的)
- Cjs 不可以 tree shaking,esm 支持 tree shaking
- commonjs 中顶层的 this 指向这个模块本身,而 ES6 中顶层 this 指向 undefined