首页 / 文章

Angular CLI:超越ng serve——生成器、目标配置、缓存及构建统计信息

了解可免除繁琐工作的 Angular CLI 选项:生成器标志、内置帮助、项目专用命令、ng run 目标、缓存清理以及构建统计信息。

发布者:REACTAPP.TOP阅读约 8 分钟1746 词

来源: Hidden Angular CLI Commands That Save Time

大多数 Angular 开发者一开始就会使用四个命令:ng serve、ng build、ng generate 和 ng test,之后便不再涉足其他工具。这对小型应用来说足够了,但随着项目规模扩大,手动编写样板代码、查找版本号、估算包大小以及处理损坏的缓存所耗费的时间会越来越多。CLI 已经为这些任务提供了解决方案。本指南将介绍值得养成习惯的选项,说明每个选项在何时能发挥作用,并最终给出一个可直接采用的简洁日常工作流程。

如果您仍处于创建项目环境的阶段,搭建现代 Angular 项目的指南涵盖了相关内容;以下所有内容均假设项目已经存在。

更充分地利用 ng generate

这个生成器就是大家所熟知的完整命令形式:

ng generate component user-profile

每个生成器都有简写别名,因此 generate 变为 g,component 变为 c:

ng g c user-profile

真正的优势在于各种标志选项。当某个小型展示组件无需专门的规范文件时,--skip-tests 可以防止命令行工具生成该文件:

ng g c user-profile --skip-tests

默认情况下,每个组件都会被保存在独立的文件夹中。而 --flat 选项则会让文件直接写入当前目录,这非常适合那些与父组件位于同一位置的微型组件:

ng g c user-profile --flat

这些标志选项可以组合使用,因此你可以同时要求应用多个功能:

ng g c user-profile --flat --skip-tests

这些选项同样适用于服务、指令、管道、守卫以及其他架构模板。让生成器负责创建文件,可以确保团队内的命名和布局保持一致。添加 --dry-run 可以在不实际写入任何内容的情况下预览架构模板会生成的内容。

直接询问 CLI 而非在网络上搜索

了解生成器功能的最快方法就是直接询问它。这样就能列出所有可用的架构模板:

ng generate --help

别名的工作方式也是如此:

ng g --help

在特定架构模板后添加 --help,即可显示该模板的所有选项及其简短描述:

ng g component --help

不同版本中的选项会有所变化,而论坛上的答案往往描述的是旧版本的标志;帮助信息始终与项目中安装的 CLI 版本一致。

使用 ng config 读取和修改设置

工作区配置存储在 angular.json 中,人们很容易直接编辑该文件。CLI 提供了用于读取和写入这些值的命令:

ng config

单独调用该命令会输出配置内容,以便查看当前设置的值:

ng config

你还可以传入 JSON 路径来读取某个值,或传入路径后跟值来设置该值,例如更改整个工作区的 CLI 选项。在脚本中,使用可重复的 ng config 命令比手动编辑 JSON 更可靠:既然 CLI 能管理文件,那就用 CLI 来修改它。

使用 ng 版本报告你的环境信息

当出现问题时,准确的版本信息非常重要。无需打开 package.json 逐一查找,可直接运行:

ng version

或其简写形式:

ng v

输出内容会将 Angular CLI 版本、已安装的 Angular 包、Node.js、包管理器以及操作系统集中显示在一段文字中。当你向同事或维护人员寻求帮助时,这正是他们所需要的信息。仅说明项目无法运行的报告根本无法为他们提供任何线索,而直接粘贴以下命令的输出就能提前回答他们前五个问题:

ng version

直接测量生产环境下的打包文件,而非凭猜测

这个构建标志的实际使用频率远低于其潜力:

ng build --stats-json

它会生成一个统计文件,描述每个输出块的内容。将此文件输入到打包分析工具中,即可直观地查看字节的来源分布。需要注意的是,文件格式取决于所使用的构建工具:基于webpack的旧版构建会生成webpack统计信息,而基于esbuild的新版应用构建工具则会输出esbuild元数据,因此请选择能够识别对应构建工具输出的分析工具,并查阅您所用版本的Angular官方文档。

当应用运行速度较慢时,常见的问题包括:

  • 存在某个体积过大的第三方库
  • 某些代码块的体积远超预期
  • 同一依赖被多次打包进应用中
  • 初始加载时带入了过多体积较大的组件
  • 延迟加载的功能最终体积超过了预期

仅凭源代码本身是无法看到这些信息的。通过比较依赖项升级前后的统计数据,可以低成本地发现功能退化问题。

重新安装所有内容前请清除构建缓存

CLI会维护一个持久化的磁盘缓存,以便加快重复构建的速度。ng cache命令用于管理该缓存;ng cache info则可以显示缓存的存储位置以及是否已启用:

ng cache

当构建行为出现异常时,清除该缓存往往是解决问题的方法:

ng cache clean

在依赖项变更、Angular升级,或在不同版本包的分支之间切换后,过期的缓存条目往往会出现。清除缓存只需几秒钟,因此请先尝试此方法,再考虑采用删除node_modules并重新安装的繁琐方式。

在本地及CI环境中进行代码检查

如果项目中配置了代码检查工具,可通过以下命令运行它:

ng lint

较新版本的 Angular 默认不包含代码检查工具,因此必须先添加相应的工具(通常是通过 Angular ESLint 集成),才能使用 ng lint 命令。配置完成后,它能在审阅者发现以下问题之前就将其捕获:

  • 未使用的变量和导入
  • 格式不一致问题
  • 潜在的错误
  • 不推荐的编码模式
  • 整体代码质量问题

在 CI 流水线中运行相同命令,可以确保有问题的代码在进入主分支之前就被标记出来,无需依赖人们是否记得执行该命令。

在自动化流程中一次性运行测试

在本地环境中,测试通常处于监视模式,每次保存文件时都会重新运行:

ng test

CI 任务无需使用会等待文件变化的进程。关闭监视模式后,命令只会运行一次测试套件然后立即退出:

ng test --watch=false

退出码用于反映测试是否通过,而流水线正是根据该代码将任务标记为绿色或红色。处于监控模式的流水线会一直等待直到超时。本地开发和持续集成有不同的需求,一个命令行界面无需同时满足两者。

在多项目工作区中指定单个项目

较大的 Angular 仓库通常会在一个工作区内包含多个应用程序和库。大多数命令都接受项目名称作为参数,因此你可以仅构建其中一个应用:

ng build my-app

或仅测试其中一个:

ng test my-app

在单仓库式工作区中,这类操作已变得十分常见:

ng build admin
ng build customer
ng test shared-ui

处理共享的 UI 库时无需重新构建每个应用;通过限定命令范围可以缩短反馈循环的时间。

使用 ng run 调用任意架构目标

在那些常见的命令背后,还有一个更通用的命令,但很少有开发者会直接使用它:

ng run

它会根据工作区配置中的命名架构目标来执行任务,采用 project:target 的格式,可选地还会附加一个配置名称:

ng run my-app:build

这些标准命令实际上是常见目标的快捷方式。一旦工作区定义了自定义目标,比如用于生成代码、部署预览或运行特定测试环境的工具,ng run 就会变得非常有用。可以将其理解为“精确执行该项目的这个目标”,不会自动推断其他内容。

从终端打开文档

当需要快速查看某个 API 时,CLI 可以帮您开始搜索:

ng doc

只需提供一个关键词,它就会在官方的 Angular 文档中查找相关信息:

ng doc signals

请注意,结果会在浏览器中显示而非在终端打印,因此这只是通往对应页面的快捷方式,并非离线参考资料。

让帮助功能替代死记硬背

或许最有用的习惯就是使用这条命令:

ng help

它会列出所有顶级命令。如需查看某个特定命令的选项,可添加 --help:

ng build --help

对于生成器也是如此,甚至只需查看单个示意图即可:

ng generate service --help

没人需要记住所有的标志位。高效的开发者并非那些能记住一切的人,而是那些一旦忘记就知道去哪里查找的人。

整合这些功能的日常工作流程

一个实用的常规操作可能如下所示。首先启动开发服务器:

ng serve

在开发功能时,使用相应的标志来生成所需内容:

ng g c profile --skip-tests

在提交代码之前,先进行代码检查并运行一次测试:

ng lint
ng test --watch=false

对于生产环境构建,应明确使用生产配置:

ng build --configuration production

当担心代码包大小时,生成相关统计信息:

ng build --stats-json

当构建过程出现异常时,先清除缓存:

ng cache clean

每当忘记某个选项时,直接询问命令本身:

ng <command> --help

总结

Angular CLI 是围绕整个开发流程设计的效率提升工具,其最大优势在于通过几个选项来消除重复性工作:

  • 使用标志生成代码,无需手动编写样板代码
  • 在多项目工作空间中将命令限制在单个项目中使用
  • 使用统计数据来衡量代码包性能,而非凭猜测判断
  • 在彻底重新安装之前先清除缓存
  • 在 CI 流程中运行测试时不要开启观察模式,并对每次更改进行代码检查
  • 使用 --help 命令,它总能匹配到你当前安装的版本
  • 下次在 Angular 项目中打开终端时,请记住:ng 背后还有许多更多功能:

    ng serve