CI/CD 与工具链开发

共 28 题
#

1. Vite 插件钩子(config/configResolved/transformIndexHtml/transform/handleHotUpdate/closeBundle)的执行时机与 enforce(pre/post)排序

A Vite 钩子分布在配置、转换、HTML、HMR 与构建结束各阶段,enforce: pre/post 调整链式钩子的执行顺序 ✓ 正确答案
B 所有 Vite 钩子都受 enforce 排序影响
C transformIndexHtml 在模块转换之后执行
D closeBundle 只在 dev 中触发
#

2. Rollup/Vite 虚拟模块的实现(resolveId 返回 \0 前缀约定、load 提供内容)与 this.resolve 的用途

A 虚拟模块必须对应真实文件
B 虚拟模块用 resolveId 拦截 id、load 提供内容,\0 前缀防止虚拟 id 泄漏进产物,this.resolve 在插件内按规则解析依赖 ✓ 正确答案
C \0 前缀会出现在产物 import 语句中
D this.resolve 只能解析相对路径
#

3. Webpack loader 的 pitch 机制与 remainingRequest 执行顺序,pitch 提前返回如何跳过后续 loader

A loader 只按从左到右执行
B loader 先从左到右跑 pitch、再从右到左跑 normal,pitch 返回值会短路跳过剩余 loader,remainingRequest 用于转交剩余管线 ✓ 正确答案
C remainingRequest 与执行顺序无关
D pitch 阶段在模块内容读取之后
#

4. Babel 插件的 visitor 与 AST 变换基本流程(path/node/scope 的操作与遍历)

A visitor 只在进入节点时执行
B Babel 插件经 visitor 在 enter/exit 两阶段遍历 AST,用 path 增删改节点、用 scope 管理绑定与名称冲突 ✓ 正确答案
C 替换节点可用字符串直接拼接
D scope 只用于类型检查
#

5. 蓝绿部署与金丝雀发布(Argo Rollouts、Spinnaker)

A 蓝绿部署是渐进放量
B 蓝绿部署全量切换回滚快但资源双倍,金丝雀渐进放量风险低但需流量分配设施,前端用版本化产物加切流与监控验证落地 ✓ 正确答案
C 金丝雀部署不需要监控指标
D 前端无法做蓝绿部署
#

6. CI 缓存(actions/cache、Turbo 远程缓存、pnpm store)在构建加速的应用

A CI 缓存分依赖安装、任务产物与中间物三层,key 需含 lockfile hash 与平台信息,并治理错误命中与缓存污染 ✓ 正确答案
B 缓存 key 用时间戳最合适
C CI 缓存只有一种形态
D 缓存命中后无需验证产物
#

7. GitHub Actions 工作流与矩阵构建

A GitHub Actions 用 strategy.matrix 并行展开多维度组合,PR 最小矩阵、发布全矩阵分层,配合 conditions、超时与复用治理成本 ✓ 正确答案
B 矩阵不支持 include/exclude
C 工作流无法跨仓库复用
D 矩阵组合越多越好
#

8. Dependabot/Renovate 在依赖自动 PR 与版本策略的工程价值

A Dependabot 与 Renovate 自动生成升级 PR,漏洞修复优先、按 schedule/group 治理噪声,升级必须过 CI 且关键依赖人工 review ✓ 正确答案
B 自动升级 PR 无需 CI 验证
C 所有升级都应自动合并
D Renovate 不支持自定义 schedule
#

9. GitHub Actions 的矩阵策略(matrix.os/node-version)

A matrix 只能有一个维度
B 矩阵组合间缓存可以共享 key
C fail-fast: false 会加速整个矩阵
D matrix 按 os、node-version 等维度展开组合并行验证,用 include/exclude 控制集合并分层(PR 精简、主干全矩阵)治理成本 ✓ 正确答案
#

10. 前端特性开关(Feature Flag)体系设计(客户端 SDK、开关评估、清理机制)与灰度发布的协作

A 特性开关上线后应长期保留
B 特性开关按类型设计并评估,客户端需默认值与防闪烁机制,功能稳定后清理,与部署灰度配合实现"部署发布解耦" ✓ 正确答案
C 客户端开关是安全的权限控制
D 开关评估只能在服务端进行
#

11. Docker 多阶段构建在前端产物(Node 编译 + Nginx 服务)

A Docker 多阶段构建用 Node 编译、Nginx 运行,最终镜像只含产物,配合层缓存分离与 SPA 回退、缓存头配置 ✓ 正确答案
B 依赖安装层与源码层合并更能利用缓存
C 容器必须 root 运行
D 前端镜像应包含完整 node 环境
#

12. 构建产物 checksum 与部署可追溯

A checksum 只用于文件传输校验
B 产物 checksum 建立内容指纹,配合清单与镜像 tag 形成"源码-构建-产物-部署"追溯链,支撑验证、回滚与审计 ✓ 正确答案
C 回滚不需要保留历史产物
D 部署记录与可追溯无关
#

13. Vercel、Netlify、Cloudflare Pages 的部署集成

A 三家平台能力完全相同
B 所有平台都要求自建构建
C Cloudflare Pages 不支持回滚
D Vercel 深度绑定 Next.js SSR 生态、Netlify JAMstack 功能全、Cloudflare Pages 边缘性能与免费额度优,按框架与边缘需求选型 ✓ 正确答案
#

14. Container Registry 与 Artifact 供应链

A 制品供应链治理覆盖构建来源、签名、扫描与访问控制,准入策略要求未签名或含高危漏洞的镜像拒绝部署 ✓ 正确答案
B registry 无需访问控制
C 镜像无需签名即可部署
D SBOM 与镜像可追溯无关
#

15. CI 构建缓存(GitHub Actions actions/cache、CircleCI cache)

A actions/cache 只支持精确 key 命中
B 缓存保存时机在两平台完全相同
C 缓存内容无需校验可信度
D GitHub actions/cache 与 CircleCI cache 都用 key/restore-keys 实现精确与降级命中,key 应含 lockfile hash 等稳定因子并治理命中率 ✓ 正确答案
#

16. GitHub Actions 的 concurrency/timeout/matrix 在 CI 成本治理的应用

A 每个 job 都应跑全矩阵
B concurrency 只影响排队不影响成本
C concurrency 取消冗余构建、timeout 兜底挂起 job、matrix 分层控制规模,三者组合治理 CI 成本 ✓ 正确答案
D 超时设置越久越好
#

17. SRI(Subresource Integrity)的原理(hash 校验)与在 CDN 第三方资源上的应用与失效场景

A SRI 校验不需要 CORS 头
B SRI 只能用于字体文件
C SRI 能防止所有 XSS
D SRI 用 integrity hash 校验资源内容防篡改,第三方 CDN 资源必须启用,资源更新时需同步重算并监控加载失败 ✓ 正确答案
#

18. 前端静态产物的版本化部署与快速回滚机制(多版本保留、HTML 指向切换、CDN 刷新)

A 回滚需要重新构建旧版本
B HTML 应使用长缓存
C 版本目录无需保留历史
D 版本化产物多版本共存,回滚即切换 HTML 入口指向旧版本目录,配合 HTML 短缓存与 CDN 刷新保证生效 ✓ 正确答案
#

19. AI 辅助代码审查(API 幻觉、安全漏洞、性能)的工程治理

A AI 审查适合模式类问题但存在 API 幻觉与语义盲区,应做第一遍粗筛、人工验证采纳、证据驱动修复 ✓ 正确答案
B AI 的 API 认知永远正确
C AI 建议应直接自动修复
D AI 审查可以替代人工判断
#

20. vitest --shard 在大测试集并行切片的工程价值

A 分片测试会重复运行相同文件
B vitest 无法并行运行
C vitest --shard 按文件分片配合多机并行线性缩短测试耗时,需治理片间负载均衡与共享资源隔离 ✓ 正确答案
D 分片与覆盖率汇总无关
#

21. Rspack 自定义 loader 的 JS 实现与 Rust(builtin-loader)实现的边界与迁移成本

A 所有 loader 都应迁移到 Rust 实现
B Rust loader 与 JS loader 的 API 完全相同
C JS loader 兼容 webpack API、builtin loader 性能最优但有 Rust 门槛,迁移应先确认瓶颈并做等价验证、渐进切换 ✓ 正确答案
D 迁移无需对比产物
#

22. raw loader(接收 Buffer)与内联资源导入(inline resource import)的应用场景

A raw loader 会把资源转为 data URL
B raw loader/asset source 以字符串导入文件内容,内联导入语法(?raw、inline 前缀)按点选择处理方式,适合嵌入构建期数据与避免运行时 IO ✓ 正确答案
C raw 导入会自动优化体积
D 所有资源都应内联进 bundle
#

23. Rollup 插件与 Vite 插件的兼容边界(Rollup 兼容钩子与 Vite 独有钩子的差异)

A Vite 复用 Rollup 兼容钩子(build 阶段一致),并增加 config、transformIndexHtml、handleHotUpdate 等独有钩子,dev/build 行为差异需用 apply 与回归测试治理 ✓ 正确答案
B renderChunk 在 Vite dev 模式生效
C Rollup 插件无需验证即可用于 Vite
D Vite 插件体系与 Rollup 完全无关
#

24. Webpack compiler/compilation 钩子的开发方式与 Tapable 同步/异步钩子的实现原理

A 所有 Tapable 钩子都是同步的
B Webpack 插件在 compiler/compilation 生命周期钩子上注册,Tapable 按 Sync/Async/Waterfall/Bail 类型决定调用语义与短路/串并行 ✓ 正确答案
C emit 钩子在构建开始前触发
D tapAsync 与 tap 完全等价
#

25. esbuild 插件(onResolve/onLoad/setup)的开发流程及其在 Vite 依赖预构建中的作用与局限

A esbuild 插件只能用于生产构建
B onLoad 只能处理文件模块
C esbuild 插件在 setup 中注册 onResolve/onLoad 定制解析与加载,可经 esbuildOptions 注入 Vite 预构建,但 API 有限且不影响生产构建 ✓ 正确答案
D filter 越宽性能越好
#

26. Playwright 在 CI 中 E2E 测试与浏览器安装链路(playwright install --with-deps)

A Playwright 会复用系统浏览器
B Playwright 按版本下载独立浏览器二进制,CI 用 install --with-deps 装系统依赖并缓存二进制,配合分片、重试与报告治理 E2E ✓ 正确答案
C 浏览器缓存 key 与版本无关
D E2E 失败无需重试与追踪
#

27. PostCSS 插件(AST walker/Declaration 处理)的开发与 Tailwind v4 @plugin 的协作

A PostCSS 插件遍历 AST(walkDecls 等)处理 Declaration 属性与值,Tailwind v4 用 @plugin 指令在 CSS 中加载插件参与处理链 ✓ 正确答案
B @plugin 只能加载 Tailwind 官方插件
C 插件可以依赖全局状态保证性能
D PostCSS 插件只能处理选择器
#

28. 工具链插件的调试手段(钩子日志、中间产物 dump)与单测策略

A 插件无需集成冒烟验证
B 插件调试只能靠打断点
C 快照测试能证明插件逻辑正确
D 工具链插件用钩子日志与中间产物 dump 定位问题,单测以 fixture 驱动、快照断言并覆盖错误路径与边界用例 ✓ 正确答案