尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Yarn 4.x Plug‘n‘Play 兼容性集成测试:Angular Material / CDK 的 yarn-pnp-compat 项目解读

Yarn 4.x Plug‘n‘Play 兼容性集成测试:Angular Material / CDK 的 yarn-pnp-compat 项目解读 Yarn 4.x PlugnPlay 兼容性集成测试Angular Material / CDK 的 yarn-pnp-compat 项目解读【免费下载链接】componentsComponent infrastructure and Material Design components for Angular项目地址: https://gitcode.com/GitHub_Trending/co/components本指南围绕本仓库 integration/yarn-pnp-compat/README.md 及其所属的integration/yarn-pnp-compat集成测试项目展开讲解 Angular Material 与 Angular CDK 组件库如何在 Yarn BerryYarn 4.x的 PlugnPlayPnP安装模式下完成安装、构建与单元测试。读完本文你将掌握该集成项目的目录结构、配置要点以及ng serve、ng build、ng test等 Angular CLI 命令在该 PnP 场景下的实际用途并能对照仓库源码理解其兼容性验证逻辑。项目定位为什么要做 Yarn PnP 兼容性测试传统 npm/Yarn 1.x 通过node_modules目录平铺安装依赖而 Yarn Berry2.x 及以后默认启用的 PlugnPlayPnP模式不再生成node_modules目录而是通过.pnp.cjs等解析器映射文件完成依赖查找。这一差异会直接影响打包器、Angular CLI 乃至组件库内部的模块解析行为。integration/yarn-pnp-compat正是 Angular Material 仓库中用于验证这一场景的集成测试项目。从 integration/yarn-pnp-compat/package.json 可以看到决定性证据{ name: yarn-pnp-compat, version: 0.0.0, packageManager: yarn4.7.0, private: true, dependencies: { angular/cdk: next, angular/common: 22.0.0-next.9, angular/compiler: 22.0.0-next.9, angular/core: 22.0.0-next.9, angular/material: next, angular/router: 22.0.0-next.9, rxjs: ^7.5.5, tslib: ^2.3.0, zone.js: ~0.15.0 } }要点解读packageManager: yarn4.7.0声明了项目强制使用 Yarn 4.7.0Berry 系列与仓库根目录 pnpm-workspace.yaml 主导的包管理方案形成对照——这是一个独立、专用的 PnP 验证环境angular/material与angular/cdk固定为next版本意味着该测试始终针对组件库的最新开发版本运行用于在发布前发现 PnP 环境下的解析问题依赖中还包含tslib、rxjs、zone.js等 Angular 应用的标准运行时依赖。此外项目根目录存在 integration/yarn-pnp-compat/yarn.lock它是 Yarn Berry 格式的 lockfile其中包含yarn-pnp-compatworkspace:.的 workspace 自引用条目进一步印证了项目以独立 workspace 形式参与 Yarn 解析。集成测试如何驱动BUILD.bazel 中的真实执行命令该集成项目在仓库的 Bazel 构建体系中承担自动化验证职责。integration/yarn-pnp-compat/BUILD.bazel 完整定义了测试的执行方式load(//tools:integration.bzl, LOCAL_NPM_PACKAGES, integration_test) integration_test( name test, srcs glob([**/*]), commands [ node .yarn/releases/yarn-4.7.0.cjs install --no-immutable, node .yarn/releases/yarn-4.7.0.cjs build, ], environment { # Set CI to silence yarn berry and make the output readable. CI: true, }, npm_packages LOCAL_NPM_PACKAGES, tags [ # This test relies on yarn so there needs to be internet access. requires-network, ], )从这段 Bazel 定义可以确认测试通过node .yarn/releases/yarn-4.7.0.cjs直接调用随项目携带的 Yarn 4.7.0 可执行文件先执行install --no-immutable安装依赖再执行build触发 package.json 中的build: ng build脚本--no-immutable允许依赖解析结果与 lockfile 不一致时仍然安装适配next版本号频繁变动的情况LOCAL_NPM_PACKAGES表明测试会注入仓库本地构建出的angular/material与angular/cdk包而非仅依赖远端发布版本requires-network标签注明该测试依赖网络以拉取 Yarn 发行版与第三方依赖。这也解释了原 README 中各项 Angular CLI 命令在该项目中的真实使用场景它们不仅是通用脚手架说明更是这条 PnP 兼容性验证链路上的实际步骤。应用骨架用真实 Material 组件验证解析链路示例应用本身足够简单却精准命中验证目标。integration/yarn-pnp-compat/src/app/app.component.ts 展示了组件库在 PnP 环境下的真实导入方式import {Component} from angular/core; import {MatButtonModule} from angular/material/button; Component({ selector: app-root, templateUrl: ./app.component.html, styleUrls: [./app.component.scss], imports: [MatButtonModule], }) export class AppComponent { title yarn-pnp-compat; }对应的模板 integration/yarn-pnp-compat/src/app/app.component.html 仅有一行button matButtonClick here/button尽管代码量极少但angular/material/button的深度导入路径而非angular/material顶层恰好是 PnP 解析最容易出问题的部分——在无node_modules的环境下MatButtonModule及其内部样式、模板都必须能通过 PnP 解析器正确定位。能在该环境下编译、运行即证明了组件库对 Yarn PnP 的兼容性。同时integration/yarn-pnp-compat/angular.json 的构建配置将angular/material/prebuilt-themes/azure-blue.css预构建主题与src/styles.scss一同引入styles: [angular/material/prebuilt-themes/azure-blue.css, src/styles.scss]这要求 PnP 模式下的打包器不仅能解析 TypeScript 模块还必须能解析 Material 预构建主题 CSS 这类资源依赖。开发服务器ng serve原 README 指出运行ng serve可启动开发服务器访问http://localhost:4200/修改源码后应用会自动热重载。在 PnP 环境下这条命令由 package.json 的start: ng serve脚本承接其 Bazel 集成测试对应的完整调用是node .yarn/releases/yarn-4.7.0.cjs start开发服务器使用 angular.json 中serve目标的development配置默认配置对应build:development构建方案其中关闭了buildOptimizer与optimization、开启sourceMap与namedChunks便于调试验证 PnP 兼容性时可观察 dev-server 阶段是否出现模块解析报错。代码脚手架ng generate原 README 说明可用ng generate component component-name生成新组件或使用ng generate directive|pipe|service|class|guard|interface|enum|module生成对应类型的代码。在本项目中脚手架行为受到 angular.json 中 schematics 配置的约束schematics: { schematics/angular:component: { style: scss }, schematics/angular:application: { strict: true } }即新生成的组件默认使用 SCSS 样式与app.component.scss一致应用以严格模式初始化。若需要在该集成项目中扩展 Material 组件的验证范围可借助脚手架快速新增使用其他组件的模块再通过ng serve与ng test确认新组件在 PnP 下同样可解析。构建ng build原 README 说明运行ng build即可构建项目产物输出到dist/目录。本项目的实际输出路径在 angular.json 中定义为dist/yarn-pnp-compat。生产构建默认配置包含budgets体积预算初始包超过500kb告警、超过1mb报错fileReplacements构建时以 src/environments/environment.prod.ts 替换 src/environments/environment.tsoutputHashing: all对全部产物文件做哈希命名。构建由 package.json 的build: ng build脚本暴露同时也支持watch: ng build --watch --configuration development的开发监听模式。PnP 兼容性验证的核心环节就在这里TypeScript 编译与打包阶段能否在无node_modules的依赖布局下完成angular/material/button等深层导入的解析。值得注意的另一个关键配置在 integration/yarn-pnp-compat/tsconfig.jsoncompilerOptions: { moduleResolution: bundler, strict: true, noImplicitOverride: true, experimentalDecorators: true, target: es2017, module: es2020 }moduleResolution: bundler与 Yarn PnP 的解析模型高度契合——PnP 环境下不存在物理node_modules包名需要按 package.json 的exports字段解析这正是 bundler 策略的行为。这组配置同时开启了strict、noImplicitOverride、noImplicitReturns等严格检查确保集成测试同时覆盖类型层面的兼容性。单元测试ng test原 README 说明运行ng test通过 Karma 执行单元测试。该项目的测试目标在 angular.json 的test目标中指定入口为src/test.tsKarma 配置文件为 integration/yarn-pnp-compat/karma.conf.js覆盖率输出到./coverage/yarn-pnp-compat并沿用angular/material/prebuilt-themes/azure-blue.css与src/styles.scss作为测试环境样式。实际测试用例位于 integration/yarn-pnp-compat/src/app/app.component.spec.ts包含三个断言should create the app通过TestBed.createComponent实例化组件并断言其存在should have as title yarn-pnp-compat断言组件title属性值should render title渲染后断言 DOM 文本包含yarn-pnp-compat app is running!。这些用例虽然朴素却在 PnP 环境下完整覆盖了 Angular 测试框架的组件编译、依赖注入与 DOM 渲染链路任何一环节的模块解析失败都会导致测试红。测试相关依赖jasmine-core、karma、karma-chrome-launcher、karma-jasmine、karma-jasmine-html-reporter、karma-coverage、types/jasmine均已声明在 package.json 的devDependencies中同样通过 Yarn PnP 安装因而测试运行过程本身就是对 PnP 兼容性的持续检验。端到端测试ng e2e原 README 说明ng e2e用于执行端到端测试但需要先自行添加实现 E2E 能力的包如 Cypress、Playwright 等因为该命令本身不捆绑任何具体实现。当前项目的 package.json 并未声明任何 E2E 框架依赖脚本列表中也未定义e2e脚本因此该命令在本项目中属于可选扩展项——若需要为 PnP 场景补充端到端验证可以自行引入 E2E 工具并在浏览器级验证 Material 组件的交互行为。进一步帮助ng help原 README 建议使用ng help获取 Angular CLI 命令帮助或查阅 Angular CLI Overview and Command Reference。在本地环境中直接执行ng help即可列出全部可用命令与选项对于本仓库中的集成项目最实用的排查手段是结合 tsconfig.app.json它继承了根tsconfig.json并将编译产物定向到./out-tsc/app、类型为空数组与 tsconfig.spec.json 检查编译期配置是否与 PnP 解析模型一致。小结一份 README 背后的兼容性验证链路integration/yarn-pnp-compat/README.md表面上是一份标准的 Angular CLI 项目说明但其所属项目在 Angular Material 仓库中的真实使命是在 Yarn 4.x PlugnPlay 模式下用最贴近真实用户的方式yarn install→ng build→ng test验证angular/material与angular/cdk最新开发版本的安装、解析、编译与运行兼容性。整个验证链路由 BUILD.bazel 的integration_test规则驱动由 package.json 的packageManager字段锁定 Yarn 版本由 app.component.ts 的 Material 组件导入与 app.component.spec.ts 的测试用例负责最终验收。理解这一链路后你既可以在本地按原 README 的命令复现整套流程也能在迁移自身项目到 Yarn PnP 时参考这套配置规避模块解析相关的坑。【免费下载链接】componentsComponent infrastructure and Material Design components for Angular项目地址: https://gitcode.com/GitHub_Trending/co/components创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表