如何将给定CommonJS(CJS)代码转换为ES6规范写法
CommonJS 代码转 ES6 模块(ESM)改写方案
ESM 环境下没有 CommonJS 默认提供的 __filename、__dirname、require 全局变量,需要通过标准 API 实现等价逻辑,最终可运行的改写代码如下:
// 引入依赖模块 import path from 'node:path'; import { fileURLToPath } from 'node:url'; // 导入JSON配置文件,标准ESM要求导入JSON时添加类型断言 import configAll from '../config/config.json' assert { type: 'json' }; // 模拟CJS环境的内置路径变量 const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // 原有业务逻辑完全保持一致 const basename = path.basename(__filename); const config = configAll[env];
关键差异说明
__filename实现:通过import.meta.url获取当前模块的文件URL,再用fileURLToPath转换为系统原生的文件路径,和CJS下的__filename行为完全一致__dirname实现:拿到__filename后通过path.dirname获取所在目录路径,等价于CJS的__dirname- JSON文件加载:ESM原生支持JSON导入,导入路径使用ESM标准的相对路径,相对于当前文件所在目录,和原代码中
__dirname + '/../config/config.json'指向的路径完全一致;标准规范要求导入JSON时添加assert { type: 'json' }类型断言告知运行环境加载的是JSON资源,如果你使用Vite、Webpack等构建工具,多数场景下可以省略该断言 - 配置取值逻辑:如果
env是运行时才会确定的动态值,静态导入整个JSON对象后取对应属性的写法和原来require()[env]的行为完全一致,不需要额外调整 - 依赖导入注意:如果使用Node.js 16以下的版本,导入path、url模块时可以去掉
node:前缀,写成import path from 'path'即可
内容的提问来源于stack exchange,提问作者Zombani
相关产品推荐
相关产品推荐

