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