首页/新闻资讯/正文详情

NgRx v14 升级指南:ng update 迁移、router-store 序列化器重构与 @ngrx/component 行为变更

发布时间:2026/9/26 3:09:19 来源:云帆数科 栏目:资讯中心
NgRx v14 升级指南:ng update 迁移、router-store 序列化器重构与 @ngrx/component 行为变更
前端状态管理【免费下载链接】platformReactive State for Angular项目地址https://gitcode.com/gh_mirrors/pl/platform点击查看免费下载本篇指南以 NgRx 官方 V14 Update Guide 为核心系统梳理从 v13 升级到 v14 的完整路径如何使用 Angular CLIng update自动迁移、确认版本依赖要求、逐项适配 router-store 序列化器重命名、component 包在无 zone 模式与LetDirective/PushPipe上的行为变化以及用LetModule/PushModule替换已弃用的ReactiveComponentModule。读完你可以直接照单执行升级并理解每处破坏性变更背后的源码实现与迁移原理。Angular CLI update一条命令完成依赖升级NgRx 支持通过 Angular CLI 的ng update命令升级依赖。升级过程中会自动执行对应的迁移 schematicsMigration Schematics这些 schematics 会替你修复一部分破坏性变更让升级过程更平滑。将包升级到 v14 最新发布版本只需在项目根目录执行ng update ngrx/store14执行后Angular CLI 会读取 NgRx 各包ngrx/store、ngrx/router-store、ngrx/effects、ngrx/component、ngrx/schematics等携带的迁移 schematic并逐一应用到你的工作区中。以 router-store 的序列化器重命名为例仓库中modules/router-store/migrations/14_0_0/index.ts正是这条迁移链的实现它通过visitTSSourceFiles遍历工程内所有 TypeScript 源文件凡是 import 声明中包含ngrx/router-store的文件都会执行renameSerializers()——先将DefaultRouterStateSerializer统一替换为FullRouterStateSerializer再对 import 声明、属性赋值如initializer、属性访问表达式以及变量声明的类型标注进行文本级替换最终通过commitChanges写回文件。因此升级后无需手工搜索替换代码中的旧序列化器名称会被自动纠正。Dependenciesv14 的最低版本要求升级前请确认项目满足以下最低版本要求Angular 版本14.xAngular CLI 版本14.xTypeScript 版本4.6.xRxJS 版本^6.5.3 || ^7.5.0也就是说NgRx v14 同时兼容 RxJS 66.5.3与 RxJS 77.5.0你可以在保持现有 RxJS 版本不变的前提下完成 NgRx 升级。TypeScript 4.6.x 与 Angular 14.x 是对应配套版本若项目仍停留在更早版本请先升级 Angular 与 TypeScript。Breaking changes破坏性变更逐项适配ngrx/router-store默认序列化器与序列化器命名调整router-store 在 v14 中调整了序列化器的默认值与命名直接影响你在StoreRouterConnectingModule.forRoot(...)中配置的serializer与routerState选项原DefaultRouterStateSerializer更名为FullRouterStateSerializer用于配合RouterState.FullMinimalRouterStateSerializer成为默认序列化器用于配合RouterState.Minimal。NgRx 提供了专门迁移自动将DefaultRouterStateSerializer重命名为FullRouterStateSerializer仓库中的实现位于 router-store 14_0_0 迁移其renames映射即为{ DefaultRouterStateSerializer: FullRouterStateSerializer }。从源码看两者定位差异非常清晰FullRouterStateSerializer 输出SerializedRouterStateSnapshot它会递归序列化整棵路由快照树保留routeConfig.component、paramMap、queryParamMap、component、root、parent、pathFromRoot等完整结构因此体积大、信息全适合需要完整路由上下文的场景MinimalRouterStateSerializer 输出MinimalRouterStateSnapshot只保留routeConfig.path/pathMatch/redirectTo/outlet/title、url、params、queryParams、fragment、data、outlet、title、firstChild与children等最小字段剔除了component、paramMap等重对象避免把组件引用存入 store从而显著减小状态体积。两者都继承自 RouterStateSerializer 抽象基类该基类约束自定义序列化器至少输出含url的状态并统一serialize(routerState: RouterStateSnapshot): T签名。如果你此前直接new DefaultRouterStateSerializer()并显式传入RouterState.Full升级后应改名为FullRouterStateSerializer如果之前未显式指定序列化器升级后默认行为即切换到MinimalRouterStateSerializerstore 中保存的 router 状态会自动变瘦。ngrx/component无 zone 模式下改用全局渲染策略ngrx/component在无 zonezone-less模式下将原先的本地渲染策略替换为全局渲染策略以获得更好的性能。变更前BEFORE在无 zone 模式下变更检测通过changeDetectorRef.detectChanges触发即只针对当前视图做局部检测。变更后AFTER在无 zone 模式下变更检测改为通过ɵmarkDirty触发即标记组件及其祖先为脏交由全局变更检测调度。这一变更的底层实现在 RenderScheduler它以Injectable()形式在组件/指令层级提供内部注入ChangeDetectorRef与TickSchedulerschedule()方法会将组件及其祖先标记为 dirty并在无 zone 模式下调度新一轮变更检测。LetDirective在Directive装饰器中直接providers: [RenderScheduler]见 let.directive.tsPushPipe也通过createRenderScheduler()走同一套机制见 push.pipe.ts。因此升级后无需改动模板与组件代码zone-less 场景下渲染路径会自动从detectChanges切到markForCheck/ɵmarkDirty的全局策略。ngrx/componentLetDirective上下文中的$error变为错误值LetDirective视图上下文中的$error属性其含义从是否出错的布尔标志改为具体的错误对象或undefined。BEFOREp *ngrxLetobs$; $error as e{{ e }}/p当obs$发出 error 事件时e为true当obs$发出 next/complete 事件时e为false。AFTERp *ngrxLetobs$; $error as e{{ e }}/p当obs$发出 error 事件时e为被抛出的错误对象当obs$发出 next/complete 事件时e为undefined。模板写法完全不变只是$error携带的信息从有没有错升级为错是什么。从当前源码看LetViewContext 除$implicit、ngrxLet外还暴露了error与complete上下文error直接保存错误对象complete为布尔标志并借助RenderScheduler在同步事件与非同步事件之间智能调度渲染。如果你的模板此前用$error做真假判断如*ngIf$error直接判断有错误升级后逻辑依然成立错误对象为真、undefined为假但若依赖$error true/false的严格比较需要改为判断是否为undefined。ngrx/component支持传入非 Observable 值v14 进一步放宽并收紧了对输入值的类型处理分为两点1. 传入null/undefined时上下文获得强类型BEFOREp *ngrxLetnull as n{{ n }}/p p *ngrxLetundefined as u{{ u }}/pn的类型为anyu的类型为any。AFTERp *ngrxLetnull as n{{ n }}/p p *ngrxLetundefined as u{{ u }}/pn的类型为nullu的类型为undefined。现在LetDirective的类型守卫ngTemplateContextGuard会基于输入值推导上下文类型模板中对别名变量的访问能得到准确的类型提示与编译期检查。2. 数组、可迭代对象、生成器函数与可读流不再被当作 observable 处理在 v13 中LetDirective/PushPipe会把这些类 observable输入自动当作可订阅源处理v14 起不再如此。若要保留原行为请先用rxjs的from函数将其转换为 observable再传给LetDirective/PushPipe。BEFOREComponent({ template: p *ngrxLetnumbers as n{{ n }}/p p{{ numbers | ngrxPush }}/p , }) export class NumbersComponent { numbers [1, 2, 3]; }AFTERComponent({ template: p *ngrxLetnumbers$ as n{{ n }}/p p{{ numbers$ | ngrxPush }}/p , }) export class NumbersComponent { numbers$ from([1, 2, 3]); }注意 AFTER 示例中需要先从rxjs导入from。这一收紧让输入语义更清晰ngrxLet/ngrxPush只负责要么渲染普通值要么订阅真正的 Observable可订阅源与非可订阅值之间的边界由类型系统严格约束对应实现见 potential-observable 相关逻辑 与 PushPipe。ngrx/schematics移除defaultCollectionngrx/schematics移除了defaultCollection选项改用 Angular 官方的schematicCollections。变更前通过angular.json中的cli.defaultCollection指定ngrx/schematics为默认集合变更后安装 schematics 时ngrx/schematics会被自动添加到angular.json文件的cli.schematicCollections数组中。NgRx 提供了专门迁移将ngrx/schematics自动加入schematicCollections。也就是说升级后无需手工编辑angular.json。迁移完成后你在 CLI 中直接执行ng generate例如ng g feature、ng g action时Angular CLI 会从schematicCollections中解析出ngrx/schematics提供的集合行为与旧的defaultCollection一致。若迁移未自动执行也可手动将ngrx/schematics补入cli.schematicCollections数组。Deprecations弃用项与替换方案ngrx/componentReactiveComponentModule弃用ReactiveComponentModule已弃用取而代之的是按需拆分的LetModule与PushModule。前者继续提供*ngrxLet指令后者提供ngrxPush管道。三种使用场景的迁移方式如下。场景一只用了*ngrxLet指令BEFOREimport { ReactiveComponentModule } from ngrx/component; NgModule({ imports: [ // ... other imports ReactiveComponentModule, ], }) export class MyFeatureModule {}AFTERimport { LetModule } from ngrx/component; NgModule({ imports: [ // ... other imports LetModule, ], }) export class MyFeatureModule {}场景二只用了ngrxPush管道BEFOREimport { ReactiveComponentModule } from ngrx/component; NgModule({ imports: [ // ... other imports ReactiveComponentModule, ], }) export class MyFeatureModule {}AFTERimport { PushModule } from ngrx/component; NgModule({ imports: [ // ... other imports PushModule, ], }) export class MyFeatureModule {}场景三同时使用*ngrxLet与ngrxPushimport { LetModule, PushModule } from ngrx/component; NgModule({ imports: [ // ... other imports LetModule, PushModule, ], }) export class MyFeatureModule {}从仓库证据看这条替换链路是有自动化支撑的虽然 v14 文档中该模块被标记为弃用仓库的 component 15_0_0-beta 迁移 提供了一份专门的迁移 schematic它会把ngrx/component导入中的ReactiveComponentModule替换为LetModule, PushModulereactiveComponentModuleReplacement LetModule, PushModule并同时处理NgModule.imports、NgModule.exports与 standaloneComponent.imports中的使用位置。对应的 迁移测试 也验证了在 NgModule 中替换与在 standalone 组件中替换两条路径输出均为import { LetModule, PushModule } from ngrx/component。升级检查清单完成 v14 升级后建议按以下清单逐项核对依赖版本Angular 14.x、Angular CLI 14.x、TypeScript 4.6.x、RxJS^6.5.3 || ^7.5.0执行迁移运行ng update ngrx/store14确认 router-store 序列化器重命名与 schematics 集合迁移均已应用DefaultRouterStateSerializer全部变为FullRouterStateSerializerangular.json中出现schematicCollections检查 router-store 配置确认StoreRouterConnectingModule使用的RouterState枚举与序列化器匹配Minimal对应默认序列化器Full对应FullRouterStateSerializer检查 component 用法将依赖$error布尔语义的模板改为判断错误对象/undefined把传入LetDirective/PushPipe的数组、可迭代对象、生成器函数、可读流用from()显式转成 observable将ReactiveComponentModule替换为LetModule与/或PushModule回归验证 zone-less 应用确认无 zone 模式下组件渲染正常渲染路径已切换到全局策略。以上要点对应文档原文位于 projects/www/src/app/pages/guide/migration/v14.md各迁移与实现的源码证据可分别在 router-store 迁移、serializers 目录 与 component 迁移 中查看。赞分享前端状态管理【免费下载链接】platformReactive State for Angular项目地址https://gitcode.com/gh_mirrors/pl/platform点击查看免费下载相关推荐读懂 NgRx Platform 的 CHANGELOG版本演进、破坏性变更与迁移路径v14 至 v22读懂 NgRx Platform 的 CHANGELOG版本演进、破坏性变更与迁移路径v14 至 v22 本文以仓库根目录的 CHANGELOG.md h前端状态管理如何成为python-fitparse维护者从用户到核心贡献者的完整路径指南如何成为python fitparse维护者从用户到核心贡献者的完整路径指南 想要为开源项目贡献力量但不知从何开始python fitparse作为一款专业物联网FreeJ2ME让经典Java手机游戏在现代设备上重生的完整指南FreeJ2ME让经典Java手机游戏在现代设备上重生的完整指南 还记得那些在诺基亚、索尼爱立信等老式手机上玩过的Java游戏吗《贪吃蛇》、《空间大战》、《上一篇NEP 52 深度解读NumPy 2.0 的 Python API 清理与命名空间重构下一篇Visual Studio 卸载工具从零到一开源方案彻底清除顽固残留创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Fienup相位恢复算法:HIO与ER混合策略实战指南
Fienup相位恢复算法:HIO与ER混合策略实战指南

简介:本资源是面向计算机科学、电子信息技术及应用数学等专业高年级本科生与研究生的相位恢复算法实践材料,聚焦Fienup型HIO-ER混合优化方法的工程实现,解决光学成像、计算成像等领域中实空间约束下复振幅相位重建的核心问题。压缩包共17个文… · 2026/9/26 3:09:13

Flink 增量检查点深度解析:从全量快照痛点到 RocksDB 状态后端实战
Flink 增量检查点深度解析:从全量快照痛点到 RocksDB 状态后端实战

Flink 的增量检查点,我刚接触那会儿其实挺不以为然的,觉得不就是"存个变更"嘛,能有多大名堂。直到线上有一次状态量到了几十 GB,全量快照动不动就把备份存储撑爆、恢复慢得让人抓狂,我才真正意识到增量检查点… · 2026/9/26 3:09:13

VSCode自动打开窗口关闭指南:从restoreWindows到欢迎页一次搞定
VSCode自动打开窗口关闭指南:从restoreWindows到欢迎页一次搞定

如果你搜的是“Vscode 自動打開窗口如何關閉”,大概率正被某个莫名其妙冒出来的窗口气得不行。这个问题的本质,远不是按一下关闭按钮那么简单——因为“自动打开窗口”在VSCode里至少有五六种完全不同的表现,每一种背后的设置项都不一样。我在… · 2026/9/26 3:09:07

Vue.js渐进式框架实战:从入门到工程化与面试考点全解析
Vue.js渐进式框架实战:从入门到工程化与面试考点全解析

做过几年前端之后回看,我对Vue.js最服气的一点,恰恰是“渐进式框架”这个定位。它不是那种逼你全量拥抱的“全家桶式”框架,而是允许你从一个页面、一个按钮、一个组件开始,一点一点把整个前端工程带起来。这个设计哲学&#xff0… · 2026/9/26 4:45:39

分布式电源接入配电网潮流计算程序定制全解析
分布式电源接入配电网潮流计算程序定制全解析

我最早接触“分布式电源接入配电网潮流计算”这个需求,是因为一条10kV馈线末端接入几个兆瓦的光伏电站后,用传统的手算简化公式校核电压偏差,结果和实测数据差了将近两个百分点。从那之后我就明白,分布式电源接入后的配电网&#… · 2026/9/26 4:45:39

Windows 10 1803安全基线实战:策略导入、参数设置与故障避坑
Windows 10 1803安全基线实战:策略导入、参数设置与故障避坑

简介:针对Windows 10 1803版本的安全基线配置与核查工具包,适用对象为系统管理员、安全运维人员及合规审计人员,可用于政企桌面终端安全管控与等保合规建设,帮助快速落地企业级安全基线标准。压缩包为zip格式,共72个文… · 2026/9/26 4:45:33

知识竞赛系统开发实战:从题型建模到WebSocket实时同步
知识竞赛系统开发实战:从题型建模到WebSocket实时同步

简介:知识竞赛系统是一套基于C/MFC开发的可运行在线答题平台,面向高校学生、竞赛组织者及需要快速搭建答题场景的开发者,覆盖试题维护、参赛者管理、限时答题和自动排名等核心需求。压缩包共61个文件,约7.68MB,文件类型… · 2026/9/26 4:45:33

CSS英文换行终极指南:word-break与overflow-wrap实战解析
CSS英文换行终极指南:word-break与overflow-wrap实战解析

做前端的,谁没被一行超长英文爆过框?一个URL、一串订单号、一段没有空格的base64,直接像根棍子一样把卡片、按钮、flex布局顶穿,页面瞬间稀碎。更气人的是,网上搜了一圈,答案就俩词:word-break、… · 2026/9/26 4:45:33

基于Node.js+PHP+Vue的社区捐赠管理系统全栈开发实战
基于Node.js+PHP+Vue的社区捐赠管理系统全栈开发实战

之前帮好几个朋友看过类似的“全栈毕设项目”,这是地方社区最常见的场景:居民有闲置物品愿意捐出来,社区需要一套系统登记、展示、发放,操作的人又多半不是技术人员。所以我从一开始就确定了这个技术组合:nodejs php … · 2026/9/26 4:45:33

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码