关于 ionic-angular
ionic-angular 是为 Ionic 与 Angular 项目提供开发指导的技能,面向构建和维护此类应用的开发者。它会检查项目架构,并按 standalone 或 NgModule 模式提供导航、表单、生命周期、状态管理和测试方面的模式。
主要功能
- 01识别 Ionic、Angular 版本与项目架构
- 02覆盖 standalone 和 NgModule 模式
- 03提供路由与导航模式
- 04指导生命周期、表单和状态管理
- 05涵盖性能优化与测试
适用场景
- 01为现有项目选择匹配的组件导入方式
- 02配置页面路由与延迟加载
- 03构建表单并处理页面生命周期
- 04为服务、导航和守卫编写测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ capawesome-team/ skills --skill ionic-angular安装后在 Claude Code 中输入/ionic-angular确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/forms.mdlifecycle.mdnavigation.mdperformance.mdproject-structure.mdservices-and-state.mdstandalone-vs-ngmodules.mdtesting.md详细介绍
Ionic Angular
使用 Angular 进行 Ionic 开发——项目结构、Angular 专属组件、导航、惰性加载、表单和生命周期集成。
前置条件
- Ionic Framework 7 或 8,并使用
@ionic/angular。 - Angular 16+(推荐使用 Angular 17+,以采用独立架构)。
- 已安装 Node.js 和 npm。
- 已安装 Ionic CLI(
npm install -g @ionic/cli)。
Agent 行为
- 自动检测架构。 检查
src/main.ts中的bootstrapApplication(独立架构)或platformBrowserDynamic().bootstrapModule(NgModule)。根据检测到的架构调整所有代码示例。 - 逐步引导。 一次引导用户了解一个主题。
- 调整导入方式。 对于独立组件,从
@ionic/angular/standalone导入每个 Ionic 组件。对于 NgModule 组件,在页面模块中导入IonicModule。
操作步骤
第 1 步:分析项目
读取项目文件,自动检测以下信息——不要询问用户可以从项目文件推断出的信息:
- Ionic 版本:读取
package.json中的@ionic/angular版本。 - Angular 版本:读取
package.json中的@angular/core版本。 - 架构:检查
src/main.ts中的bootstrapApplication(独立架构)或platformBrowserDynamic().bootstrapModule(NgModule)。如果存在src/app/app.module.ts且导入了IonicModule,则确认使用 NgModule。 - Capacitor:检查
package.json中是否包含@capacitor/core。检查是否存在android/和ios/目录。 - 路由:检查是否存在
src/app/app.routes.ts(独立架构)或src/app/app-routing.module.ts(NgModule)。 - 导航模式:检查
src/app/中是否存在tabs/目录(基于标签页),或模板中是否使用了ion-menu(侧边菜单)。
第 2 步:了解项目结构
阅读 references/project-structure.md,了解标准的 Ionic Angular 目录结构。
要点:
- 独立项目包含
app.config.ts、app.routes.ts和独立页面组件。 - NgModule 项目包含
app.module.ts、app-routing.module.ts和各页面的*.module.ts文件。 - Ionic 配置位于
ionic.config.json。 - 主题变量位于
src/theme/variables.scss。 - 全局样式和 Ionic CSS 导入位于
src/global.scss。
第 3 步:了解架构差异
阅读 references/standalone-vs-ngmodules.md,了解详细差异。
摘要:
| 方面 | 独立架构 | NgModule |
|---|---|---|
| 启动 | main.ts 中的 bootstrapApplication | platformBrowserDynamic().bootstrapModule |
| Ionic 设置 | app.config.ts 中的 provideIonicAngular({}) | app.module.ts 中的 IonicModule.forRoot() |
| 组件导入 | 每个文件分别导入所需的 Ionic 组件 | IonicModule 全局提供所有组件 |
| 导入来源 | @ionic/angular/standalone | @ionic/angular |
| 惰性加载 | 路由中的 loadComponent | 路由中的 loadChildren |
| 图标注册 | 必须从 ionicons 调用 addIcons() | 自动完成 |
| Tree-shaking | 是 | 否 |
步骤 4:设置导航
阅读 references/navigation.md,了解完整的导航模式。
涵盖主题:
- 路由配置 — 为两种架构定义路由并启用惰性加载。
- 根组件布局 — 使用
<ion-app>和<ion-router-outlet>。 - 模板导航 — 使用
routerLink和routerDirection设置转场动画。 - 编程式导航 —
NavController(navigateForward、navigateBack、navigateRoot、back)。 - 路由参数 — 通过
ActivatedRoute读取参数。 - 标签导航 — 使用
<ion-tabs>,并为每个标签设置子路由。 - 侧边菜单 — 使用
<ion-menu>和<ion-menu-toggle>,并设置子路由。 - 路由守卫 — 使用
CanActivateFn的函数式守卫(Angular 15.2+)。 - 模态框 — 使用
ModalController实现带数据传递的覆盖式导航。 - 线性与非线性路由 — 了解何时使用各模式。
步骤 5:实现生命周期钩子
阅读 references/lifecycle.md,了解 Ionic 页面生命周期钩子的详细信息。
关键规则:
ngOnInit仅触发一次(首次创建时)。用于一次性设置。ionViewWillEnter在每次访问页面时触发。用于刷新数据。ionViewDidEnter在转场动画后触发。用于不会阻塞动画的繁重工作。ionViewWillLeave在离开页面前触发。用于清理、暂停订阅。- 页面从导航栈中弹出时会触发
ngOnDestroy。用于最终清理。 - 实现来自
@ionic/angular的接口ViewWillEnter、ViewDidEnter、ViewWillLeave、ViewDidLeave。
步骤 6:构建表单
阅读 references/forms.md,了解如何使用 Ionic 组件构建表单。
涵盖主题:
- 响应式表单 — 使用 Ionic 输入组件和
FormBuilder、FormGroup、Validators。 - 模板驱动表单 — 使用
FormsModule和[(ngModel)]。 - Ionic 表单组件 —
ion-input、ion-textarea、ion-select、ion-checkbox、ion-toggle、ion-radio-group、ion-range、ion-datetime。 - 验证信息显示 — 使用
errorText(Ionic 7+),或在较旧版本中手动使用<ion-note>。 - 标签位置 —
labelPlacement属性(floating、stacked、fixed)。
步骤 7:管理服务和状态
阅读 references/services-and-state.md,了解服务和状态管理模式。
涵盖主题:
- 可注入服务 —
@Injectable({ providedIn: 'root' })。 - HTTP 数据获取 — 为独立组件和 NgModule 设置
HttpClient,以及 CRUD 服务模式。 - 响应式状态 — 使用
BehaviorSubject管理共享的可观察状态。 - Angular 信号 — 使用
signal()和computed()管理响应式状态(Angular 16+)。 - 加载指示器 — 使用
LoadingController处理异步操作。 - 错误反馈 — 使用
ToastController显示面向用户的错误或成功消息。 - 环境配置 — 使用
environment.ts/environment.prod.ts配置 API URL。
步骤 8:优化性能
阅读 references/performance.md,了解性能优化技巧。
涵盖主题:
- 惰性加载 — 使用
loadComponent(独立组件)和loadChildren(NgModule)。 - trackBy / track — 使用
*ngFor和@for高效渲染列表。 - 虚拟滚动 — 使用 Angular CDK 的
cdk-virtual-scroll-viewport处理大型列表。 - OnPush 变更检测 — 减少不必要的重新渲染。
- 预加载策略 — 使用
PreloadAllModules实现后续导航即时加载。 - 骨架文本 — 使用
ion-skeleton-text,提升加载期间的感知性能。
步骤 9:编写测试
阅读 references/testing.md,了解测试模式。
涵盖主题:
- 页面单元测试 — 为独立组件页面和 NgModule 页面配置
TestBed。 - 服务测试 — 使用
HttpTestingController测试基础服务和 HTTP 服务。 - 模拟依赖项 — 使用
jasmine.createSpyObj模拟服务和控制器。 - 导航测试 — 模拟
NavController。 - 守卫测试 — 对函数式守卫使用
TestBed.runInInjectionContext。 - E2E 测试 — 配置 Cypress 和 Playwright。
错误处理
NullInjectorError: No provider for IonRouterOutlet:在独立应用中,确认已在app.config.ts中调用provideIonicAngular({})。在 NgModule 应用中,确认已在app.module.ts中导入IonicModule.forRoot()。- Ionic 组件未渲染:在独立组件中,确认已从
@ionic/angular/standalone导入每个 Ionic 组件,并将其列在imports数组中。在 NgModule 组件中,确认已在页面模块中导入IonicModule。 - 图标未显示(独立组件):确认已使用
ionicons/icons中所需的图标调用addIcons(),并已从@ionic/angular/standalone导入IonIcon。 ionViewWillEnter未触发:确认该组件通过<ion-router-outlet>直接路由。子组件不会接收 Ionic 生命周期事件。- 返回导航后页面数据未刷新:加载数据时使用
ionViewWillEnter,而非ngOnInit。Ionic 会在 DOM 中缓存页面,因此ngOnInit只会触发一次。 - 表单验证错误未显示:对于 Ionic 7+,在
<ion-input>上使用errorText。对于较早的版本,手动检查control.invalid && control.touched并显示<ion-note>。 routerLink在 Ionic 组件上不起作用:在独立组件中,在组件的imports数组中从@angular/router导入RouterLink。- 页面转场没有动画:使用来自
@ionic/angular的NavController,而非 Angular 的Router,以实现带动画的导航。或者,在routerLink元素上添加routerDirection。 - 标签页导航异常:确认
<ion-tab-button>上的tab属性与子路由的path匹配。不要以编程方式在标签页之间导航。
相关技能
capacitor-angular— Capacitor 专用的 Angular 模式(插件服务、NgZone、深层链接、平台检测)。ionic-app-development— 通用 Ionic 开发(组件、主题、CLI)。ionic-app-creation— 从头开始创建新的 Ionic 应用。ionic-app-upgrades— 将 Ionic 升级到较新版本。
评论
支持 Markdown