从Nestjs10迁移到Nestjs11
本文提供了从 NestJS 10 迁移到 NestJS 11 的完整指南。NestJS 11 引入了许多新功能,同时包含了一些 轻微的不兼容更改,但 大多数用户不会受到影响。你可以查看完整的变更列表以获取详细信息。
NestJS 11 迁移指南
升级依赖包
你可以手动更新依赖包,但官方推荐使用 npm-check-updates (ncu) 进行自动更新,以简化升级过程。
Express v5 迁移
Express v5 于 2024 年正式发布,并在 2025 年成为稳定版本。在 NestJS 11 中,Express v5 现在是默认集成的版本。
路由匹配规则变更
Express v5 调整了路径匹配算法,主要变更包括:
- 通配符 * 必须带名称:
- 旧语法(Express v4):
/*
- 新语法(Express v5):
/*splat
或/{*splat}
(splat 只是一个变量名,可以自定义)
- ?(可选参数)不再支持:
- 旧语法:
/:file?.ext
- 新语法:
/:file{.:ext}
- 正则表达式字符不再支持。
- 部分特殊字符需要转义(如
()[]?+!
)。 - 参数名必须是合法的 JavaScript 标识符,或使用
:"paramName"
进行引用。
1 | // 旧方式(Express v4) |
⚠ 注意:
*splat
只是一个占位符名称,可以随意更改,如*wildcard
。如果你希望匹配 根路径,需要使用
/{*splat}
语法:
中间件路径调整
在 Express v5 中,如果你有适用于所有路由的中间件,需要更新路径:
1 | // 旧方式(Express v4) |
Express v5 的查询参数解析变更
适用于 Express v5
之前,Express 默认使用 qs 库解析查询参数,支持嵌套对象和数组。
现在,默认使用 简单解析器,不再支持嵌套对象和数组。
例如,以下查询字符串:
1 | ?filter[where][name]=John&filter[where][age]=30 |
在 Express v5 不会被正确解析。
如何恢复原行为:
1 | import { NestFactory } from '@nestjs/core'; |
Fastify v5 迁移
NestJS 11 现在默认支持 Fastify v5:
几乎无痛升级,大部分用户无需调整。
路径匹配规则未变,通配符 * 仍然适用。
中间件注册调整
Fastify v5 不再支持 (.*) 语法匹配所有路径,需使用 命名通配符:
1 | // 旧方式(Fastify v4) |
splat
只是一个占位符名称,可自定义。
模块解析算法优化
变更点
NestJS 10 及之前:使用 哈希计算 来标识动态模块。
NestJS 11:改为 对象引用,提升性能,减少内存占用。
⚠ 影响
以前,重复导入相同的动态模块会 自动去重。
现在,如果你希望模块 共享相同实例,需要手动管理:
1 | const myModule = DynamicModule.forRoot({}); |
生命周期钩子执行顺序调整
之前,OnModuleDestroy、OnApplicationShutdown 等 按初始化顺序执行。
现在,执行顺序反转(与初始化顺序相反)。
示例:
1 | // A 依赖 B,B 依赖 C |
模块初始化顺序:C -> B -> A
模块销毁顺序:A -> B -> C(反转)
⚠ 影响:
全局模块 被视为依赖所有模块,因此 最先初始化,最后销毁。
CacheModule 迁移
NestJS 11 的 @nestjs/cache-manager:
迁移至 Keyv,提供统一的 键值存储接口。
Redis 配置方式变更:
旧方式(NestJS 10):
1 | CacheModule.registerAsync({ |
新方式(NestJS 11)
1 | CacheModule.registerAsync({ |
Node.js 版本要求
Node.js 16 已不再支持(于 2023-09-11 结束生命周期)。
Node.js 18 也被移除(安全支持将于 2025-04-30 结束)。
NestJS 11 需要 Node.js 20 或更高版本。
⚠ 建议:
始终使用 最新的 LTS 版本 以获得最佳体验。
其他
Mau 是 NestJS 官方推出的云端部署平台:
一键部署到 AWS
环境变量管理
实时应用监控
无需管理基础设施
1 | # 安装 |