Angular Components 官方文档站(docs/)开发指南:本地运行、构建、测试与场景截图工作流
【免费下载链接】componentsComponent infrastructure and Material Design components for Angular项目地址: https://gitcode.com/GitHub_Trending/co/components
本指南以仓库docs/目录为核心,系统讲解 Angular Material 与 CDK 官方文档站(material.angular.dev)在本地仓库中的工程组织、文档内容来源、开发服务器、生产构建、单元/端到端测试,以及独特的 Scenes 组件场景截图子系统。读完本文,你将能够基于 docs/README.md 给出的命令,在本地启动并构建这套文档站,并理解其背后由 Bazel + Angular CLI 驱动的构建、测试与截图流水线。
文档站是什么:docs/ 目录的定位
docs/目录是 Angular Components(Angular Material 与 CDK / src/cdk)官方文档网站的源代码仓库。该站点用于承载组件文档、指南、示例与 API 文档,并对外发布为 material.angular.dev。根据 docs/README.md,该站还维护着多个历史版本入口:v5、v6、v7、v8、v9、v10、v11,以及当前主版本(对应 v12 及以后,直接指向主站)。也就是说,同一套工程结构会被复用到不同历史版本的文档站发布中。
从工程结构看,docs/是一个双应用工程(详见 docs/angular.json):
| Angular CLI 项目 | 定位 | 说明 |
|---|---|---|
material-angular-io | 主文档站应用 | 组件文档、指南、示例、API 浏览,包含多套可切换的自定义主题 |
scenes | 场景截图应用 | 为每个组件渲染统一的展示场景,供截图流水线产出缩略图 |
两个应用共用一套 Bazel 宏封装ng_app()(定义于 docs/defs.bzl),该宏把ng build、ng serve、ng test等 Angular CLI 命令逐一映射为 Bazel target,这正是 README 中所有命令都以pnpm bazel run/pnpm bazel test形式给出的原因。
文档内容从哪里来:内容管线与资源注入
README 明确说明了文档站的内容来源:指南、示例与文档内容由一个独立的“docs content”仓库维护,内容则来源于本仓库的:
- Angular Material 与 CDK 的Guides(即仓库根目录的 guides/ 目录,如 theming.md、using-component-harnesses.md);
- Material 组件、服务与指令(src/material,如 button、datepicker、table);
- CDK 组件、服务与指令(src/cdk,如 a11y、overlay、drag-drop)。
在实际构建时,这部分内容通过依赖注入与资源拷贝进入应用。查看 docs/BUILD.bazel 中ng_app(name = "app", ...)的deps,可以看到它链接了@angular/components-examples(本地 workspace 包,即 src/components-examples 的产物);而 docs/angular.json 的assets配置进一步把node_modules/@angular/components-examples/docs-content整体拷贝到输出目录的/docs-content下,同时将src/assets映射到/assets、把src/robots.txt与src/sitemap.xml一并发布。
主应用入口 docs/src/main.ts 通过bootstrapApplication(MaterialDocsApp, ...)引导应用,启用PathLocationStrategy、provideRouter(MATERIAL_DOCS_ROUTES, withInMemoryScrolling(...))(路由定义见 docs/src/app/routes.ts),并接入AnalyticsErrorReportHandler做错误上报;启动时还会调用unregisterServiceWorkers()清理旧版文档站遗留的 Service Worker。
本地开发服务器
README 给出的开发服务器命令是:
pnpm bazel run //docs:serve启动后访问http://localhost:4200/。
其底层逻辑在 docs/BUILD.bazel 中:alias(name = "serve", actual = ":build.serve"),即serve只是build.serve的别名;而build.serve/build等 target 均由ng_app宏(docs/defs.bzl)依据 docs/angular.json 中material-angular-io项目的architect配置动态生成。开发模式下serve配置会注入一组与线上保持一致的安全响应头(见 docs/angular.json 中Content-Security-Policy的注释 “Keep in sync withfirebase.json”),用于本地预览时模拟线上 CSP 策略。
如果希望绕过 Bazel、直接用 Angular CLI 启动,docs/package.json 也提供了等价的 npm scripts:pnpm start(ng serve)、pnpm start:jit(ng serve --aot=false,关闭 AOT 便于调试)、pnpm start:prod(ng serve --configuration production)。注意该工程的engines字段要求 Node^20.11.1 || >=22.0.0,并明确提示应使用 pnpm 而非 npm 安装依赖。
生产构建
README 给出的构建命令:
pnpm bazel build //docs:build.productionng_app宏(docs/defs.bzl)会为每个应用生成两套构建 target:默认的build(对应ng build)与带productionconfiguration 的build.production(对应ng build --configuration production),并额外创建server这样的http_server测试服务器(docs/BUILD.bazel 中servertarget 以:build.production为依赖,将_main/docs/dist/browser作为附加根路径)。
生产构建的关键配置可在 docs/angular.json 中看到:
budgets:anyComponentStyle警告阈值为 6kb,超限即告警;optimization: true、outputHashing: "all"、namedChunks: false,生产包做完整压缩与哈希命名;fileReplacements:将src/environments/environment.ts替换为src/environments/environment.prod.ts;- 样式系统内置 4 套不注入、按需加载的自定义主题:
magenta-violet、rose-red、azure-blue、cyan-orange(源文件位于 docs/src/styles/custom-themes/),并启用@angular/localize与 zone.js polyfills。
此外 docs/BUILD.bazel 还暴露了//docs:build.production产物,被同文件中的 Lighthouse 审计 target(audit)与审计工具audit_tool(依赖chromium工具链、light-server、lighthouse、puppeteer-core)消费,用于对构建产物做性能与可访问性审计。
运行单元测试
README 给出的单元测试命令:
pnpm bazel test //docs/...该命令通过 Karma 执行material-angular-io应用的全部单元测试。在ng_app宏(docs/defs.bzl)内部,_architect_test会生成testtarget,并注入浏览器可执行文件环境变量:
CHROME_BIN:指向 Bazel 工具链提供的 Chromium Headless Shell;CHROMEDRIVER_BIN:指向对应的 ChromeDriver。
测试依赖(TEST_DEPS)同时注册了 Chromium 与 Firefox 两套浏览器 launcher(karma-chrome-launcher、karma-firefox-launcher)以及karma-coverage覆盖率支持。Karma 配置位于 docs/karma.conf.js 与 docs/karma-custom-launchers.js,入口测试文件为 docs/src/test.ts,测试用 tsconfig 为 docs/tsconfig.spec.json。等价的原生命令是pnpm test(ng test)。
运行端到端(e2e)测试
README 给出的 e2e 测试命令:
pnpm bazel test //docs/e2e:e2e_tests该测试基于Selenium WebDriver对文档站做真实浏览器层面的交互验证。测试配置见 docs/e2e/BUILD.bazel:webdriver_test规则以//docs:server(前面提到的http_server)作为被测服务器,测试用例位于 docs/e2e/src/(如 app.e2e-spec.ts、app.po.ts),它们依赖src/e2e-app提供的createE2eWebDriver公共测试基建。对应 npm script 为pnpm test:e2e。
Scenes 子系统:组件场景截图工作流
README 用了一半篇幅介绍//docs/scenes这一独立应用,它是文档站很具特色的部分:为每个 Material 组件生成统一规格的场景截图,这些截图正是文档站中组件卡片/列表所用的缩略图资源。
Scenes 应用的开发与构建
- 开发服务器:
pnpm bazel run //docs/scenes:build.serve,访问http://localhost:4200/; - 生产构建:
pnpm bazel build //docs/scenes:build.production; - 单元测试:
pnpm bazel test //docs/scenes/...(同样走 Karma); - 场景截图 e2e 测试:
pnpm bazel test //docs/scenes/e2e:e2e_tests。
对应 npm scripts 为pnpm start:scenes(ng serve scenes)、pnpm build:scenes(ng build scenes)、pnpm test:e2e:scenes。Scenes 应用的 Bazel 定义在 docs/scenes/BUILD.bazel,其 Angular CLI 配置在 docs/angular.json 的scenes项目下,输出目录为dist/scenes,生产构建设置了initial2mb/5mb 与anyComponentStyle6kb/10kb 的预算阈值。
截图是如何产生的
场景截图的 e2e 测试定义在 docs/scenes/e2e/src/app.e2e-spec.ts。它本质上“不做断言,只为给不同页面拍快照”:遍历autocomplete、badge、button、datepicker、dialog、menu、select、table、tabs、tree等 36 个组件,逐个导航到对应场景页,并调用screenshot(comp, wd)截取页面。
截图工具类 docs/scenes/e2e/screenshot.ts 的实现揭示了输出规范:
- 通过 Selenium 定位
<app-scene-viewer>元素并对其调用takeScreenshot(); - 输出文件命名规则:
id小写化 → 空格替换为下划线 → 剔除[^/a-z0-9_-]之外的字符 → 追加.scene.png后缀; - 输出目录固定为
docs/src/assets/screenshots/(即path.join(__dirname, '..', '..', 'src', 'assets', 'screenshots')); - 写入时对异常做了容错——在只读测试沙箱环境中无法写源码树时静默跳过,避免测试失败。
运行后产出的正是仓库中已提交的 360×200 组件缩略图,例如 button.scene.png、datepicker.scene.png、table.scene.png:
这些截图统一尺寸、统一背景、聚焦单个组件的主视觉形态,为文档站提供了低成本、可批量再生的视觉素材——修改组件视觉后,只需重跑pnpm bazel test //docs/scenes/e2e:e2e_tests即可重新生成全部组件缩略图。
常见命令速查表
| 目的 | 命令 |
|---|---|
| 文档站开发服务器 | pnpm bazel run //docs:serve |
| 文档站生产构建 | pnpm bazel build //docs:build.production |
| 文档站单元测试 | pnpm bazel test //docs/... |
| 文档站 e2e 测试 | pnpm bazel test //docs/e2e:e2e_tests |
| Scenes 开发服务器 | pnpm bazel run //docs/scenes:build.serve |
| Scenes 生产构建 | pnpm bazel build //docs/scenes:build.production |
| Scenes 单元测试 | pnpm bazel test //docs/scenes/... |
| 组件场景截图生成 | pnpm bazel test //docs/scenes/e2e:e2e_tests |
小结
docs/目录是一个典型的“文档站即工程”实践:一方面通过ng_appBazel 宏把 Angular CLI 的构建、测试能力无缝映射进 Bazel 目标图,配合http_server、WebDriver 测试规则与 Lighthouse 审计形成完整的开发—构建—测试—审计闭环;另一方面通过独立的 Scenes 应用,把组件展示与截图生成纳入自动化流水线,让文档站的视觉素材可以随组件演进持续再生成。无论你是想为文档站修复导航与布局问题、扩展指南内容,还是想复刻一套“组件文档站 + 场景截图”的工程方案,本文梳理的命令与源码路径都能作为直接入口。
【免费下载链接】componentsComponent infrastructure and Material Design components for Angular项目地址: https://gitcode.com/GitHub_Trending/co/components
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考