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

相关推荐
计算机魔术师8 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing988 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan8 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡8 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理
IT_陈寒9 小时前
Redis的Set操作居然能把我的服务整挂了?
前端·人工智能·后端
计算机魔术师9 小时前
Suno 发布 v6 音乐模型,推出 v6、v6-wild、v6-mini 三个版本
前端
whyweplay10 小时前
elpis : DSL动态组件学习
前端
用户9210802628610 小时前
前端 Vue 专栏 06:异步更新机制、任务队列与 nextTick
前端
晴天1610 小时前
Chrome DevTools 深度调试指南
前端·chrome·chrome devtools
林冠宏_指尖下的幽灵10 小时前
AI发展下的后编程时代思考
前端·人工智能·后端