兼容性与版本
发布状态
Wow 10 的包随每个 Wow 10 版本由 CI 发布,并带有 npm provenance。预发布版本发布到对应种类的 dist-tag:alpha、beta,候选版本为 next(pnpm add @ahoo-wang/wow-client@alpha);latest 指向最新的稳定版本。
Wow 服务端
Wow 10 的包与 Wow 10 的服务通信,并从 Wow 10 的 Manifest 生成。路由、请求头、等待、problem 和查询语言都与 9.x 不同,所以 9.x 的服务需要 9.x 的包,前端要与它的服务一起迁移到 10(从 9.x 迁移)。
在 10 之内,使用与前端所调用的服务同一版本的包。较新的服务会增加它的 Manifest 所增加的东西:重新生成就能看到。生成的类型没有指明的字段,仍然会出现在 JSON 中,类型会忽略它。
版本
这些包与 Kotlin 模块共用一个版本号,从同一个 tag 发布。破坏性改变只在 x.Y.0 版本中发布,并在发布说明的 “Breaking” 下列出。
- 应用中的每个 Wow 包使用同一个版本。
wow-generator、wow-react和视图引擎以~x.y.z把@ahoo-wang/wow-client作为 peer 依赖,所以它们的次版本不同时,包管理器会发出警告。 - 用同一版本的生成器生成,即与生成代码所编译依赖的
wow-client相同的版本。
版本范围
版本号跟随 Wow,而不是语义化版本:次版本(x.Y.0)可能改变 TypeScript API,只有补丁版本(x.y.Z)才保证兼容。pnpm add 和 npm install 默认保存插入符范围(^x.y.z),这会让之后的安装在没有任何人决定的情况下拿到下一个次版本。改为保存波浪号范围,它只接受同一个次版本的补丁。pnpm 从 pnpm-workspace.yaml 读取这个设置:
savePrefix: '~'npm 从项目的 .npmrc 读取:
save-prefix=~或者固定确切版本:
pnpm add --save-exact @ahoo-wang/wow-client
pnpm add -D --save-exact @ahoo-wang/wow-generator有意地迁移到下一个次版本,所有 Wow 包一起,在读过它发布说明中的 “Breaking” 部分之后。Fetcher 的 peer 依赖遵循语义化版本,所以插入符范围适合它们:打开波浪号设置时,用显式的范围添加它们(pnpm add @ahoo-wang/fetcher@^<version>)。
支持窗口
这些包遵循 Wow 其余部分的支持策略,见安全策略:修复进入最新的稳定版本线,较旧版本线的修复逐个决定。
运行时与 peer 依赖
| 要求 | 版本 | 说明 |
|---|---|---|
| Node.js | >=22.12.0 | 在每个包的 engines 中声明;生成器的 CLI 也需要它 |
| 浏览器 | 当前的常青浏览器 | 这些包使用 fetch、ReadableStream 和 TextDecoderStream |
React 和 React DOM(wow-react、视图引擎的界面) | ^19.0.0 | 不支持 React 18:构建会导入 react/compiler-runtime |
React Router(只有 wow-view-engine/react-router) | ^7.0.0 || ^8.0.0 | 可选的 peer 依赖:只有那个入口导入它 |
| TypeScript | >=6.0 | CI 以使用者的身份,在 TypeScript 6.0 和最新的 7.x 上对打包后的包做类型检查;moduleResolution 为 Bundler、NodeNext 或 Node16 |
@ahoo-wang/fetcher、fetcher-eventstream、fetcher-decorator | ^5.1.5 || ^6.0.0 | 由应用安装的 peer 依赖。CI 在最新的 6.x 上构建和测试,下限作业在 5.1.5 上重新运行测试。只有从 OpenAPI 文档生成的客户端才需要 fetcher-decorator |
@ahoo-wang/wow-client(用于其他 Wow 包) | ~x.y.z | 同一个次版本 |
pnpm 8 及以上和 npm 7 及以上会自己安装缺失的 peer 依赖;Yarn 不会,所以 Yarn 项目要自己添加每个 peer 依赖。
精确数字与投影的结果
Kotlin 的 Long、BigInteger 或 BigDecimal 类型的 Manifest 字段(schema 格式为 int64、bigint 或 decimal),在生成的类型中是 string,数字与服务写出时完全相同;线上仍然传输 JSON 数字(生成客户端)。9.x 生成的是 number。
用字面 projection.include 路径写成的查询,返回收窄到这些路径的记录;用 listQuery 或 pagedQuery 构建的查询,或只有排除项的查询,返回完整的记录。不带 zoneId 的日历过滤按 UTC 读取它的日期(读取与查询)。