nestjs使用ESM模块化

nestjs使用ESM模块化

引言

  • 在去年2023年我就有想过为什么不改造成ESM模块化呢?这样可以避免大量CJS引入ESM包的错误,当我改造完毕后node服务可以正常运行,但jest单元测试始终有问题
  • 今年nest支持swc、vitest后,我觉得可以再次尝试,swc将代码转为ESM模块化产物,vitest + swc运行ESM模块化产物,以此证明我的猜想

结论

  • vitest + swc下,node服务在ESM下正常运行,vitest ESM正常运行
  • 适用场景:验证自己的猜想、对构建工具的掌握、对纯node ESM的极端主义

🚨注意:永远不要将非官方支持的内容带入到生产环境!所以,这里只是借鉴一种思路,不保证tsconfig-path等各种nest扩展(swagger cli、graphQL能正常)
🚀原因:由于nestjs目前未有迁移到ESM的打算,尽量使用CJS正常开发业务,目前nodejs推出了--experimental-require-module机制(CJS/ESM允许互导包的特性,🤔忘了v22.4+还是多少可用),未来可能nestjs团队过度更慢,所以更加推荐CJS使用nestjs项目

项目

测试

bash 复制代码
pnpm i
npm i
​
# 测试 vitest + swc的测试用例
pnpm test
pnpm test:e2e
​
# 运行,访问http://localhost:8888,会返回hello world!,在控制台会看到got的请求返回值
pnpm dev
​
# 规范测试
pnpm lint
pnpm format

实现ESM核心步骤

  1. package.json的"type"设置为"module"(不理解的可以参考:gist.github.com/sindresorhu...
json 复制代码
{
  ...
  "type": "module",
  ...
}
  1. 定义swc配置文件,查看.swcrc文件
bash 复制代码
{
  "$schema": "https://swc.rs/schema.json",
  "jsc": {
    "target": "esnext"
  },
  "module": {
    "type": "es6"
  },
  "minify": false
}
  1. swc与tsconfig.json的兼容性,查看为了迁移到SWC的配置项注释后的额外配置(swc迁移文档:swc.rs/docs/migrat...
json 复制代码
// 为了迁移到SWC的配置项
"isolatedModules": true,
"importsNotUsedAsValues": "error",
"esModuleInterop": true
  1. ESM后 eslint v9-都不支持,所以改名为.eslintrc.cjs使用CJS模块化运行
java 复制代码
module.exports = {
  // ...
  env: {
    // ...
  },
  ignorePatterns: ['.eslintrc.cjs'], // 忽略
  rules: {
    // ...
  },
};
​
  1. prettier 不受影响不用管
  2. 配置nest-cli.json让其支持swc并读取swc配置
perl 复制代码
{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "builder": {
      "type": "swc",
      "options": {
        "swcrcPath": ".swcrc"
      }
    }
  }
}
​

got这个http请求依赖包最新版是纯ESM,可以通过查看dist目录内的源码,根据导入语句可以分辨是否已转成ESM

相关推荐
ZC跨境爬虫13 小时前
3D 地球卫星轨道可视化平台开发 Day10(交互升级与接口溯源)
前端·javascript·3d·自动化·交互
恋猫de小郭14 小时前
WasmGC 是什么?为什么它对 Dart 和 Kotlin 在 Web 领域很重要?
android·前端·flutter
新酱爱学习14 小时前
从一次 OpenClaw 请求抓包,聊聊 Skill 的运行原理
前端·人工智能·mcp
慕斯fuafua14 小时前
CSS——弹性盒子
前端·css
M ? A14 小时前
Vue Transition 组件转 React:VuReact 怎么处理?
前端·javascript·vue.js·经验分享·react.js·面试·vureact
小江的记录本14 小时前
【分布式】分布式一致性协议:2PC/3PC、Paxos、Raft、ZAB 核心原理、区别(2026必考Raft)
java·前端·分布式·后端·安全·面试·系统架构
huangql52014 小时前
CSS布局 (三):浮动——从文字环绕到多列布局
前端·javascript·css
LaughingZhu14 小时前
Product Hunt 每日热榜 | 2026-04-20
前端·数据库·人工智能·经验分享·神经网络
开开心心就好14 小时前
这款PPT计时工具支持远程控制功能
前端·科技·游戏·edge·pdf·全文检索·powerpoint
BangD14 小时前
前端elementUI el-form个别字段增加校验
前端·vue.js·elementui