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),仅供参考

相关新闻

Linux系统:IPC进程间的通信--共享内存

Linux系统:IPC进程间的通信--共享内存

一 共享内存本质上是内存预留的一块空间,就是一块物理空间,进程间的复制是虚拟的空间。内核物理内存,映射到多个不同进程的虚拟地址空间。多个进程可以直接读写这块内存,实现进程间的通信。两个进程通过唯一的key对应一个IPC对象/…

2026/9/26 3:09:23 阅读更多 →
Humanizer PrecisionDateTimeHumanizeStrategy 详解:用 precision 因子精确控制“时间距离”人文化的阈值

Humanizer PrecisionDateTimeHumanizeStrategy 详解:用 precision 因子精确控制“时间距离”人文化的阈值

开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 导读 …

2026/9/27 4:52:50 阅读更多 →
使用 @envelop/newrelic 为 GraphQL Yoga 应用接入 New Relic 监控与分布式追踪

使用 @envelop/newrelic 为 GraphQL Yoga 应用接入 New Relic 监控与分布式追踪

后端API设计 【免费下载链接】graphql-yoga 🧘 Rewrite of a fully-featured GraphQL Server with focus on easy setup, performance & great developer experience. The core of Yoga implements WHATWG Fetch API and can run/deploy on any JS environment.…

2026/9/26 3:09:23 阅读更多 →

最新新闻

全能电子地图下载器3.0:GIS数据获取与坐标转换实战指南

全能电子地图下载器3.0:GIS数据获取与坐标转换实战指南

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

2026/9/27 4:52:30 阅读更多 →
小红书客服系统:驱动级硬件伪装,平台检测维度再全也查不出

小红书客服系统:驱动级硬件伪装,平台检测维度再全也查不出

小红书客服系统:驱动级硬件伪装,平台检测维度再全也查不出 电商这行,谁的速度快谁吃肉。小红书的自动回复与客服,是店群运营中最耗人力也最容易出错的环节。 店群客服是纯人力消耗战。一个店日均50条咨询,20个店就是10…

2026/9/27 4:52:30 阅读更多 →
NT1741:面向助听器与TWS的超低功耗BLE接收增强器

NT1741:面向助听器与TWS的超低功耗BLE接收增强器

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

2026/9/27 4:52:30 阅读更多 →
北京免费建网站实战:3步搞定性能优化,告别廉价模板

北京免费建网站实战:3步搞定性能优化,告别廉价模板

北京免费建网站实战:3步搞定性能优化,告别廉价模板 你见过那种打开要等5秒,图片糊得像马赛克,配色红得刺眼的官网吗? 这就是“北京免费建网站”最典型的翻车现场。 模板网站太丑不够用 ,更致命的是,它们往往牺牲了 性能优化…

2026/9/27 4:52:30 阅读更多 →
宝塔面安装wordpress图解步骤

宝塔面安装wordpress图解步骤

宝塔面板装WordPress避坑指南图解步骤保安全 网站做好了没人访问,往往不是内容问题,而是底层环境太烂。很多老板花大价钱做站,上线后三天内就被挂马,或者后台直接进不去。别慌,这通常是因为你在 宝塔面安装wordpress…

2026/9/27 4:52:30 阅读更多 →
一条命令驾驭20+ AI代理:acpx内置代理注册表完整清单(Codex、Claude、Gemini、Cursor)

一条命令驾驭20+ AI代理:acpx内置代理注册表完整清单(Codex、Claude、Gemini、Cursor)

一条命令驾驭20 AI代理:acpx内置代理注册表完整清单(Codex、Claude、Gemini、Cursor) 【免费下载链接】acpx Headless CLI client for stateful Agent Client Protocol (ACP) sessions 项目地址: https://gitcode.com/gh_mirrors/ac/acpx …

2026/9/27 4:51:29 阅读更多 →

日新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/26 22:52:30 阅读更多 →