- 前端
- 状态管理
【免费下载链接】platform
Reactive State for Angular
导读
@ngrx/router-store是 NgRx 生态中连接 Angular Router 与 Store 的核心绑定库,它通过监听路由事件并把路由状态同步进 Redux 式的 Store,让路由导航可以被 reducer、effect 统一管理。本文围绕 projects/www/src/app/pages/guide/router-store/install.md 讲解两种安装方式:推荐的一行命令ng add(会自动完成依赖安装与代码注入),以及完全手动安装的流程,并结合仓库源码揭示每一步背后的实际改动,帮助你理解安装之后项目里到底发生了什么。
方式一:使用ng add自动安装(推荐)
ng add是 Angular CLI 提供的一键集成机制。在项目根目录执行以下命令即可安装最新版的 Router Store:
ng add @ngrx/router-store@latest命令背后的逻辑定义在仓库的 ng-add 示意图(modules/router-store/schematics/ng-add/index.ts)中,并由 collection.json 注册为ng-add(别名init)示意图。示意图会依次完成三件事:
- 更新
package.json>dependencies:把@ngrx/router-store加入项目依赖。从源码看,这一步由addNgRxRouterStoreToPackageJson()函数实现,写入的版本号取自当前的platformVersion(即与 @ngrx/router-store 包自身版本一致,当前仓库版本为 22.0.1,见 package.json)。 - 运行
npm install:示意图通过NodePackageInstallTask触发实际的依赖安装,无需你手动执行。 - 默认向
app.config.ts的ApplicationConfig注入provideRouterStore():在 standalone 应用下,示意图定位项目入口文件的 bootstrap 配置,把provideRouterStore()添加进 providers 数组。snapshot 测试 index.spec.ts.snap 展示了注入后的预期结果:
import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core'; import { provideRouterStore } from '@ngrx/router-store'; export const appConfig: ApplicationConfig = { providers: [ provideBrowserGlobalErrorListeners(), provideRouterStore() ] };如果你指定了--module/--path等 flags,示意图会按 flags 定位到对应的 NgModule 或配置文件并完成更新。
可选ng addflags
| flag | description(功能说明) | value type(值类型) | default value(默认值) |
|---|---|---|---|
--path | 指定要添加StoreRouterConnectingModule导入的模块所在路径(示意图解析后的源码相对路径)。 | string | 无(默认使用当前工作目录) |
--project | angular.json中定义的项目名称,用于帮助定位要添加StoreRouterConnectingModule的模块。 | string | 无(使用默认项目) |
--module | 包含目标模块的文件名,可携带相对路径,例如src/app/app.module.ts。 | string | app |
这三个 flag 与 schema 定义一一对应:schema.json 中path使用$source: "workingDirectory"获取默认值,project有别名p,module有别名m且默认值为"app";此外 schema 还暴露了一个文档未展开的隐藏 flag--skipPackageJson(布尔值,默认false),用于跳过对package.json的自动修改。
示意图的底层处理逻辑:NgModule 与 Standalone 两条分支
从 ng-add 示意图 可以看到,示意图启动时会先判断应用是否为 standalone(通过isStandaloneApp检查入口文件),然后选择两条注入路径:
- Standalone 应用:走
addStandaloneConfig(options),如果provideRouterStore已在入口配置中调用则直接跳过(避免重复注入),否则调用addFunctionalProvidersToStandaloneBootstrap将其写入 bootstrap providers。 - NgModule 应用:走
addImportToNgModule(options),它通过 TypeScript AST 解析目标模块文件,插入import { StoreRouterConnectingModule } from '@ngrx/router-store'并把StoreRouterConnectingModule.forRoot()追加到模块的imports数组(见 index.ts)。
该逻辑有完整的单元测试覆盖,见 ng-add/index.spec.ts:测试验证了package.json会被更新、skipPackageJson: true时跳过更新、默认注入StoreRouterConnectingModule.forRoot()、指定module时可精确注入、目标模块不存在时报错,以及 standalone 应用的 snapshot 注入结果。
provideRouterStore()与StoreRouterConnectingModule的关系
无论哪种注入方式,最终落地的都是同一套 providers。StoreRouterConnectingModule.forRoot()内部只是封装了provideRouterStore(config)并把它作为 module providers 返回(见 router_store_module.ts),二者等价,因此:
// NgModule 方式 imports: [StoreRouterConnectingModule.forRoot()] // Standalone 方式 providers: [provideRouterStore()]provideRouterStore()的实现位于 provide_router_store.ts,它根据配置自动选择合适的序列化器:默认使用MinimalRouterStateSerializer(routerState为Full时改用FullRouterStateSerializer),并注册StoreRouterConnectingService在应用初始化阶段连接 Router 与 Store。一个完整的 standalone 注册示例:
bootstrapApplication(AppComponent, { providers: [ provideStore({ router: routerReducer }), provideRouterStore(), ], });方式二:手动安装
如果你的项目不便使用ng add(例如 CI 环境、自定义构建流程或希望完全掌控每个文件),也可以手动完成安装。
首先使用包管理器安装依赖,安装命令取决于项目所用工具:
# 使用 npm npm install @ngrx/router-store # 使用 Yarn yarn add @ngrx/router-store # 使用 pnpm(当前仓库使用 pnpm workspace,参见 pnpm-workspace.yaml) pnpm add @ngrx/router-store注意:@ngrx/router-store依赖@ngrx/store与 Angular Router 相关包。当前仓库 package.json 声明了 peerDependencies:@angular/common、@angular/core、@angular/router(均为^22.0.0)、@ngrx/store(22.0.1)以及rxjs ^6.5.3 || ^7.5.0,请确保你的项目满足这些版本要求。
装完依赖后,需要把路由状态接入 Store:
// NgModule 方式 import { StoreModule } from '@ngrx/store'; import { RouterModule } from '@angular/router'; import { StoreRouterConnectingModule } from '@ngrx/router-store'; @NgModule({ imports: [ StoreModule.forRoot({}), RouterModule.forRoot([ { path: '', component: SimpleCmp }, { path: 'next', component: SimpleCmp }, ]), StoreRouterConnectingModule.forRoot(), ], }) export class AppModule {}// Standalone 方式 import { provideStore } from '@ngrx/store'; import { provideRouterStore } from '@ngrx/router-store'; export const appConfig: ApplicationConfig = { providers: [ provideStore(), provideRouterStore(), ], };安装后验证
安装完成后可以检查以下位置确认集成成功:
package.json:dependencies中出现"@ngrx/router-store": "22.0.1"(版本以实际安装为准)。- 配置入口:standalone 应用检查
app.config.ts中是否出现provideRouterStore();NgModule 应用检查根模块imports中是否有StoreRouterConnectingModule.forRoot()。 - 类型层面:若项目启用了
strict模式,编译不报错即说明序列化器与 provider 类型已正确接入。
可结合仓库中的示例应用参考完整集成形态,例如 modules/router-store/src/provide_router_store.ts 中provideRouterStore的@usageNotes示例,以及 standalone-app 中的实际注册方式。
小结
| 对比维度 | ng add自动安装 | 手动安装 |
|---|---|---|
| 依赖更新 | 自动写入 package.json 并运行 npm install | 需要手动执行安装命令 |
| 代码注入 | 自动注入provideRouterStore()/forRoot() | 需要手写 provider 与模块导入 |
| 适用场景 | 新项目、快速接入 | 受控环境、CI、精细化管理 |
对于绝大多数场景,推荐使用ng add @ngrx/router-store@latest完成安装,再由示意图自动生成的provideRouterStore()将 Angular Router 与 Store 无缝连接起来。如果你需要更细粒度的路由序列化与状态同步配置,可在此基础上继续阅读 router-store 相关的 configuration 与 serializer 文档。
- 前端
- 状态管理
【免费下载链接】platform
Reactive State for Angular
相关推荐
NgRx Store Devtools 安装指南:`ng add` 自动配置与手动接入全解析
NgRx Store Devtools 安装指南: ng add 自动配置与手动接入全解析 NgRx Store Devtools 是 NgRx 官方为 Ang
前端状态管理NgRx Operators 安装指南:通过 `ng add` 与手动方式引入 `@ngrx/operators`
NgRx Operators 安装指南:通过 ng add 与手动方式引入 @ngrx/operators 本指南围绕 NgRx 生态中 @ngrx/opera
前端状态管理NgRx Store 安装指南:ng add 自动化配置与手动安装完全手册
NgRx Store 安装指南:ng add 自动化配置与手动安装完全手册 导读 本篇指南聚焦 Angular 反应式状态管理库 NgRx Store 的两种安
前端状态管理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考