基于Gemini CLI的Web无障碍自动化审计与修复实践

张开发
2026/5/7 13:38:55 15 分钟阅读

分享文章

基于Gemini CLI的Web无障碍自动化审计与修复实践
1. 项目概述与核心价值最近在折腾前端项目特别是那些需要快速迭代的最头疼的就是在开发后期才发现一堆可访问性Accessibility 简称 a11y问题。手动检查费时费力还容易遗漏。用浏览器插件一个个页面点效率太低。直到我发现了这个叫web-accessibility的 Gemini CLI 扩展它直接把 a11y 审计和修复流程塞进了命令行让“无障碍开发”这件事变得像跑个单元测试一样自然。简单来说web-accessibility是一个开源的命令行工具它作为 Google Gemini CLI 的一个扩展核心目标是把专业的无障碍测试能力集成到你的日常开发流里。你不再需要离开终端去打开一个独立的测试工具或网站。它利用业界公认的axe-core引擎对你的本地运行中的 Web 应用进行自动化审计找出那些违反 WCAGWeb Content Accessibility Guidelines标准的问题比如颜色对比度不足、缺少替代文本alt text、ARIA 属性误用等。更厉害的是它不仅能生成一份问题清单还能尝试自动修复其中一部分问题直接把修改应用到你的源代码中。这玩意儿适合谁我觉得所有前端开发者、全栈开发者甚至是对代码质量有要求的团队负责人都应该了解一下。尤其是当你项目有明确的合规性要求比如要满足 ADA、Section 508 等标准。希望提升产品的用户体验覆盖更广泛的用户群体包括使用屏幕阅读器、键盘导航、有视觉障碍的用户。厌倦了在开发流程末尾进行昂贵且耗工的手动 a11y 审查。想培养团队“从开始就考虑无障碍”的开发习惯。它的价值在于将“事后检查”转变为“事中干预”把 a11y 变成了一个可自动化、可集成到 CI/CD 流水线中的质量门禁这才是现代工程实践该有的样子。2. 核心原理与工具链拆解这个扩展虽然用起来就两条命令但背后是一套精心组合的工具链在协同工作。理解这套“组合拳”能帮你更好地信任它的结果也能在出问题时知道该从哪里排查。2.1 核心引擎axe-core整个审计能力的基石是axe-core。这是由 Deque Systems 维护的开源库是目前业界最权威、最广泛使用的自动化无障碍测试引擎之一。它不是一个简单的规则检查器而是一个基于 WCAG 标准以及部分最佳实践的规则库。axe-core的工作原理是注入到浏览器页面中对 DOM 树进行静态分析和部分动态模拟检查元素属性、样式计算值、键盘焦点流等。为什么是 axe-core社区里也有其他工具但axe-core有几个关键优势让它成为首选规则质量高其规则集由无障碍专家持续维护和更新误报率相对较低且能检测到许多深层问题如复杂的 ARIA 状态管理。可访问性树Accessibility Tree感知它不仅能看 DOM还能看浏览器构建出的可访问性树这是检测某些问题如角色传播错误的关键。部分规则可修复axe-core的规则元数据中包含了“如何修复”的建议这为后续的自动修复提供了可能。web-accessibility扩展通过axe-core/playwright这个包来调用axe-core这意味着它是在一个真实的、无头headless浏览器环境中执行测试的能获取到页面完全渲染并执行了 JavaScript 后的最终状态测试结果更准确。2.2 浏览器自动化Playwright为了运行axe-core审计扩展需要控制一个浏览器来加载你的目标网页。这里它选择了Playwright。你可能更熟悉 Puppeteer 或 Selenium但 Playwright 在跨浏览器支持Chromium, Firefox, WebKit、自动等待机制和稳定性上表现更佳。选择 Playwright 的考量无头模式稳定性对于 CLI 工具无头运行的稳定性和速度至关重要。Playwright 在这方面优化得很好。内置设备模拟虽然这个扩展当前可能没用到但 Playwright 能轻松模拟移动设备、屏幕尺寸和颜色主题为未来更全面的 a11y 测试如移动端触摸目标大小留出了空间。强大的选择器引擎当扩展需要定位 DOM 元素以应用修复时Playwright 精准的选择器能确保修改被应用到正确的位置。2.3 自动修复的魔法颜色对比度与上下文理解/accessibility:fix命令是它的“黑科技”部分。它如何做到自动修复目前从官方描述和代码库看其修复能力主要集中在一些结构化、可推导的问题上。颜色对比度修复这是最典型的例子。如果审计发现文本与背景的颜色对比度达不到 WCAG AA4.5:1或 AAA7:1标准扩展会调用color-contrast-picker库。这个库不是随机选色而是基于当前颜色在色轮上寻找符合对比度要求且视觉上最接近的替代色。例如它可能会轻微调整你的#888888灰色使其与背景的对比度达标同时保持整体的设计色调。基于模式Pattern的修复对于一些常见问题如图片缺少alt属性、表单输入缺少关联的label扩展可以基于 HTML 语义和上下文进行智能填充。例如它可能通过分析图片的文件名logo.png-alt公司标志或相邻文本来生成一个合理的alt文本。对于表单它可能会检查附近的文本节点或创建关联的label。依赖 Gemini 的代码理解别忘了这是Gemini CLI的扩展。当遇到更复杂、需要理解代码逻辑才能修复的问题时比如错误的 ARIA 属性组合aria-hidden”true”但元素是可聚焦的扩展很可能会将问题上下文代码片段、审计结果发送给 Gemini 模型由模型生成修复建议然后工具再应用这个建议。这解释了为什么它需要联网以及为什么修复质量与模型的“理解能力”相关。注意自动修复并非万能。对于涉及复杂交互逻辑、视觉设计决策如布局、焦点顺序或需要人工判断语义的问题如一张复杂信息图的alt描述工具会将其标记在ACCESSIBILITY_REVIEW_TODO.md中等待开发者手动处理。这正是“人机协作”的体现机器处理繁琐、确定性的工作人处理需要创造力和深层理解的工作。2.4 通信桥梁Model Context Protocol (MCP)这是 Gemini CLI 扩展生态的底层协议。modelcontextprotocol/sdk让这个扩展能与 Gemini CLI以及背后的 Gemini 模型进行结构化通信。扩展通过 MCP 向 CLI 注册命令/accessibility:review,/accessibility:fix定义输入参数并处理执行逻辑。当命令触发时CLI 会调用扩展中对应的工具函数并可能将需要模型介入的部分数据传递给 Gemini。3. 从零开始的完整实操指南光说不练假把式我们从头到尾跑一遍看看在实际项目中如何集成和使用这个工具。假设我们有一个基于 Vite React 的简单待办事项应用。3.1 环境准备与安装首先确保你的系统满足前置条件。核心就是安装Gemini CLI。根据官方文档你需要 Node.js 环境建议 18 版本。# 使用 npm 全局安装 Gemini CLI npm install -g google/gemini-cli # 安装后验证版本确保是 v0.6.0 或更高 gemini --version如果安装成功运行gemini命令会进入一个交互式会话。先退出按 CtrlD 或输入/exit我们来安装web-accessibility扩展。# 安装扩展 gemini extensions install https://github.com/gemini-cli-extensions/web-accessibility安装过程会自动下载扩展包以及 Playwright 所需的浏览器二进制文件所以第一次安装可能会花点时间。安装成功后你可以通过gemini extensions list来确认。3.2 准备一个测试项目为了演示我们快速创建一个有典型 a11y 问题的页面。在你的工作目录下# 创建一个新的 Vite React 项目 npm create vitelatest my-a11y-demo -- --template react cd my-a11y-demo npm install # 编辑 src/App.jsx我们故意引入一些常见问题将src/App.jsx替换为以下内容import { useState } from react import ./App.css function App() { const [todos, setTodos] useState([学习 a11y, 写代码]) const [input, setInput] useState() const addTodo () { if (input.trim()) { setTodos([...todos, input]) setInput() } } return ( div classNameApp h1 style{{ color: #aaa, backgroundColor: #eee }}我的待办事项/h1 {/* 低对比度 */} div input typetext value{input} onChange{(e) setInput(e.target.value)} placeholder输入新任务 / {/* 按钮缺少可访问名称 */} button onClick{addTodo} style{{ marginLeft: 10px }}/button /div ul {todos.map((todo, index) ( // 列表项缺少唯一的 keyReact 警告非严格 a11y但常见 // 同时我们将每个待办项渲染成可点击的 div但语义和键盘交互不完整 div key{index} onClick{() alert(完成: ${todo})} style{{ cursor: pointer, padding: 5px }} {todo} /div ))} /ul {/* 一个没有 alt 文本的装饰性图片 */} img srchttps://via.placeholder.com/150 / {/* 一个关联不明确的表单标签 */} span邮箱/span input typeemail idemail-input / /div ) } export default App同时为了更明显的颜色问题修改src/App.css.App { padding: 20px; font-family: sans-serif; } /* 低对比度按钮 */ button { background-color: #cccccc; color: #eeeeee; border: none; padding: 8px 16px; border-radius: 4px; }现在启动开发服务器npm run dev服务器通常会在http://localhost:5173启动。保持终端运行。3.3 执行无障碍审计打开一个新的终端窗口导航到项目根目录 (my-a11y-demo)。现在使用扩展的审查命令/accessibility:review http://localhost:5173执行过程观察你会看到终端开始输出日志。扩展会启动一个无头的 Playwright 浏览器导航到指定 URL注入axe-core脚本运行全套规则然后分析结果。整个过程大约 10-20 秒取决于页面复杂度。结果输出命令执行完毕后你会在项目根目录下发现一个新文件ACCESSIBILITY_REVIEW_TODO.md。用编辑器打开它内容大致如下# Accessibility Review TODO Generated by Gemini CLI Web Accessibility Extension on 2024-05-15T10:30:00Z ## Summary - **Critical**: 2 - **Serious**: 3 - **Moderate**: 1 - **Minor**: 0 ## Violations to Fix ### 1. [Critical] Images must have alternate text - **Rule**: image-alt - **Impact**: 屏幕阅读器用户无法了解图像的内容。 - **Target**: img[srchttps://via.placeholder.com/150] - **Context**: img srchttps://via.placeholder.com/150 - **Fix Suggestion**: 添加 alt 属性。如果图像是装饰性的使用 alt。 ### 2. [Critical] Elements must have sufficient color contrast - **Rule**: color-contrast - **Impact**: 低视力用户可能无法阅读文本。 - **Target**: h1 - **Context**: h1 stylecolor: #aaa; background-color: #eee;我的待办事项/h1 - **Fix Suggestion**: 将文本颜色从 #aaa 修改为至少与背景 #eee 有 4.5:1 对比度的颜色。推荐颜色: #5a5a5a。 ### 3. [Serious] Form elements must have labels - **Rule**: label - **Impact**: 屏幕阅读器用户可能无法知道表单字段的用途。 - **Target**: #email-input - **Context**: input typeemail idemail-input - **Fix Suggestion**: 确保 input 有相关联的 label 元素。可以使用 aria-label 或 aria-labelledby 作为替代。 ### 4. [Serious] Buttons must have discernible text - **Rule**: button-name - **Impact**: 屏幕阅读器用户无法知道按钮的用途。 - **Target**: button - **Context**: button onclick.../button - **Fix Suggestion**: 为按钮添加可访问名称例如通过内部文本、aria-label 或 aria-labelledby 属性。 ### 5. [Serious] Interactive elements must be focusable and have keyboard interaction - **Rule**: focusable-no-name, keyboard-interaction - **Impact**: 键盘和屏幕阅读器用户无法与元素交互。 - **Target**: div (用于待办事项列表项) - **Context**: div onclick... style...学习 a11y/div - **Fix Suggestion**: 考虑使用语义化的交互元素如 button 或 a并确保它们可以通过键盘 Tab 键聚焦。 ### 6. [Moderate] Heading levels should only increase by one - **Rule**: heading-order (假设页面有其他结构问题) - **Impact**: 屏幕阅读器用户可能对文档结构感到困惑。 - **Target**: h1 - **Context**: (略) - **Fix Suggestion**: 检查标题层级结构。这个文件就是你的“无障碍缺陷工单”清晰列出了问题等级、规则、影响、目标元素和修复建议。3.4 尝试自动修复现在尝试让工具自动修复这些问题。在同一个项目根目录下运行/accessibility:fix执行过程观察工具会读取ACCESSIBILITY_REVIEW_TODO.md逐条分析。对于它能自动处理的问题如颜色对比度、简单的alt文本缺失它会直接修改你的源代码文件src/App.jsx和src/App.css。对于需要人工判断或更复杂的问题它会在终端输出说明并可能在 TODO 文件中将该条目标记为“需手动处理”。运行完成后检查你的src/App.jsx和src/App.csssrc/App.jsx可能被修改为// ... 其他部分不变 ... return ( div classNameApp {/* 颜色被自动调整 */} h1 style{{ color: #5a5a5a, backgroundColor: #eee }}我的待办事项/h1 div input ... / {/* 按钮添加了 aria-label */} button onClick{addTodo} style{{ marginLeft: 10px }} aria-label添加任务/button /div ul {todos.map((todo, index) ( // 工具可能无法安全地将 div 改为 button这里可能只是添加了 tabindex 和 role实际上更安全的做法是标记为需手动修复。 // 我们假设它添加了基础的可访问性属性 div key{index} onClick{() alert(完成: ${todo})} style{{ cursor: pointer, padding: 5px }} tabIndex0 rolebutton onKeyPress{(e) e.key Enter alert(完成: ${todo})} {todo} /div ))} /ul {/* 图片添加了空 alt标记为装饰性 */} img srchttps://via.placeholder.com/150 alt / {/* 表单标签关联被修复 */} label htmlForemail-input邮箱/label input typeemail idemail-input / /div )src/App.css中按钮的颜色可能被调整button { background-color: #757575; /* 从 #cccccc 调整 */ color: #ffffff; /* 从 #eeeeee 调整 */ /* ... 其他样式不变 ... */ }同时ACCESSIBILITY_REVIEW_TODO.md文件会被更新已修复的问题可能会被划掉或移动到“已修复”区域剩余的问题如将div改为语义化button会保留。3.5 集成到开发工作流一次性的检查很好但真正的价值在于持续集成。你可以把它加入你的package.jsonscripts 和 Git hooks 中。1. 创建便捷的 npm 脚本在package.json的scripts部分添加{ scripts: { dev: vite, build: vite build, preview: vite preview, lint:a11y: gemini /accessibility:review http://localhost:5173, fix:a11y: gemini /accessibility:fix } }这样你可以在启动服务器后用npm run lint:a11y来审计用npm run fix:a11y来尝试修复。2. 结合 Husky 做提交前检查安装 Husky 并设置 pre-commit hook确保每次提交的代码都通过基础的无障碍检查至少没有 Critical 问题。npx husky-init npm install编辑.husky/pre-commit文件#!/usr/bin/env sh . $(dirname -- $0)/_/husky.sh # 先启动一个后台开发服务器运行审计然后关闭服务器 # 注意这是一个简化示例生产环境需要更健壮的脚本管理服务器生命周期 npm run dev SERVER_PID$! sleep 5 # 等待服务器启动 npm run lint:a11y kill $SERVER_PID # 可以检查 ACCESSIBILITY_REVIEW_TODO.md 中是否还有 Critical 问题 # 如果有则阻止提交并提示开发者 if grep -q \[Critical\] ACCESSIBILITY_REVIEW_TODO.md 2/dev/null; then echo ❌ 存在 Critical 级别的无障碍问题请先修复后再提交。 echo 查看 ACCESSIBILITY_REVIEW_TODO.md 了解详情。 exit 1 fi这个钩子会在你每次git commit时自动启动一个临时服务器进行 a11y 审计如果发现严重问题则阻止提交。4. 深度使用技巧与避坑指南用了几周后我积累了一些能让这个工具发挥更大效力的心得也踩过一些坑这里分享给你。4.1 审计范围与精准定位默认情况下/accessibility:review会审计给定 URL 页面的当前状态。但对于单页应用SPA这远远不够。技巧审计关键交互状态。一个模态框Modal打开时、一个下拉菜单展开时、一个表单验证错误显示时——这些动态内容往往 a11y 问题高发。你需要手动或通过脚本导航到这些状态后再进行审计。可以写一个简单的 Playwright 或 Puppeteer 脚本在调用扩展命令前先执行一系列用户交互。# 伪代码思路1. 启动服务器 2. 用脚本打开页面点击按钮打开模态框 3. 在此状态下执行 /accessibility:review技巧处理需要认证的页面。如果你的本地开发服务器需要登录axe-core通过 Playwright 运行时可以携带 Cookie 或 LocalStorage。但 Gemini CLI 扩展目前可能没有直接暴露这个接口。一个变通方法是先手动在浏览器中登录你的本地应用然后从浏览器开发者工具中复制document.cookie或 localStorage 数据通过修改扩展代码或寻找其配置项如果未来提供来注入上下文。更直接的方法是确保你的审计命令在一个已认证的会话上下文中运行例如在已登录的测试环境中。避坑Shadow DOM 和 iframe。axe-core可以渗透到 Shadow DOM 和 iframe 内部进行测试但需要正确配置。确保你的页面中这些隔离区域的内容也能被审计到。如果发现漏测可能需要检查axe-core的配置选项是否在扩展中被正确启用。4.2 理解与处理审计结果ACCESSIBILITY_REVIEW_TODO.md文件是你的行动指南但需要正确解读。优先级排序严格按照Critical Serious Moderate Minor的等级来解决问题。Critical 问题如缺少可访问名称、键盘陷阱会完全阻断部分用户必须优先修复。“Fix Suggestion”是起点不是圣旨工具给出的修复建议是基于规则和模式的可能不完美。例如它建议给一个纯装饰性图标按钮加aria-label”搜索”但也许你的设计体系中这个图标已经通过相邻文本明确了含义此时使用aria-hidden”true”可能更合适。永远要用你的常识和真实用户场景尤其是辅助技术测试来验证修复方案。误报与规则调优axe-core有少量误报。例如某些具有特定 ARIA 角色的自定义交互组件可能会被误判为缺少键盘交互。你可以通过了解axe-core的规则 ID如button-name在团队内建立一套“可接受的例外”清单或者未来探索是否能在扩展中配置规则禁用列表如果扩展支持。4.3 自动修复的边界与复核/accessibility:fix很强大但必须谨慎使用。黄金法则始终进行代码审查Code Review。永远不要在运行fix命令后不经查看就直接提交代码。自动修改可能引入语法错误、破坏代码风格、或者产生语义上不准确的修复比如生成一个冗长或不恰当的alt文本。版本控制是你的安全网在运行fix命令前确保你的代码已提交或暂存。这样如果修复结果不理想你可以轻松地git checkout -- .回滚所有更改。聚焦“高确定性”修复颜色对比度、布尔型 ARIA 属性如aria-required”true”、添加空的装饰性图片alt属性这些修复的确定性很高可以信任。而对于“为按钮生成标签文本”、“重写复杂的 ARIA 属性关系”等需要语义理解的修复务必人工复核。测试测试再测试修复后不仅要重新运行/accessibility:review确认问题已解决更重要的是进行手动键盘导航测试和屏幕阅读器测试。用 Tab 键遍历页面用 NVDAWindows、VoiceOvermacOS或 ChromeVox 听听修复后的体验。自动工具无法覆盖所有用户体验维度。4.4 性能与规模化考量当项目很大时审计整个应用可能需要很长时间。技巧分页面审计。不要只审计首页。为关键用户流程如注册、结账、仪表盘的每个主要页面单独运行审计命令并生成各自的TODO文件。技巧集成到 CI/CD 流水线。在 CI 中你可以针对构建后的静态文件或部署预览环境如 Vercel Preview, Netlify Deploy Preview进行 a11y 审计。将审计结果如ACCESSIBILITY_REVIEW_TODO.md或 JSON 格式的报告作为 CI 流水线的一个产出物甚至可以设置质量关卡如果发现新的 Critical 或 Serious 问题则标记构建失败。# 一个简化的 GitHub Actions 工作流示例 - name: Run Accessibility Audit run: | # 假设你的应用已在 localhost:3000 运行 gemini /accessibility:review http://localhost:3000 --output-format json a11y-report.json # 使用 jq 检查是否有严重问题 if jq -e .violations[] | select(.impact critical or .impact serious) a11y-report.json /dev/null; then echo 发现严重或关键的无障碍问题构建失败。 cat a11y-report.json exit 1 fi避坑动态内容与审计时机。在 CI 中确保你的测试页面已经完全加载所有动态数据来自 API都已渲染完成再触发审计。可能需要使用playwright的page.waitForLoadState(‘networkidle’)或等待特定元素出现。5. 常见问题排查与解决方案实录在实际使用中你肯定会遇到各种报错和意外情况。下面是我遇到过的典型问题及其解决方法。5.1 安装与命令找不到问题问题现象可能原因解决方案运行gemini命令提示“未找到命令”1. Node.js 未安装或不在 PATH。2. Gemini CLI 未全局安装成功。1. 检查node --version和npm --version。2. 尝试重新安装npm install -g google/gemini-cli --force。3. 检查 npm 全局安装路径是否在系统的 PATH 环境变量中。运行/accessibility:review提示“未知命令”1.web-accessibility扩展未安装。2. Gemini CLI 版本过低低于 v0.6.0。1. 运行gemini extensions list确认扩展已安装。2. 运行gemini --version确认版本。升级 CLInpm update -g google/gemini-cli。3. 重新安装扩展gemini extensions uninstall web-accessibility gemini extensions install https://github.com/gemini-cli-extensions/web-accessibility。安装扩展时卡在“Downloading browser binaries...”网络问题导致 Playwright 浏览器下载缓慢或失败。1. 设置 Playwright 镜像PLAYWRIGHT_DOWNLOAD_HOSThttps://npmmirror.com/mirrors/playwright然后重试。2. 手动下载根据 Playwright 文档手动安装所需浏览器再尝试安装扩展。5.2 审计执行阶段问题问题现象可能原因解决方案Error: page.goto: Navigation failed提供的 URL 无法访问。开发服务器未启动或端口错误。1. 确认你的开发服务器正在运行 (npm run dev)。2. 确认 URL 和端口号正确。例如Vite 默认是http://localhost:5173Next.js 可能是http://localhost:3000。3. 尝试在浏览器中手动访问该 URL确保无误。审计结果为空或异常少1. 页面可能完全是客户端渲染 (CSR)且axe-core在页面完全加载前就执行了。2. 页面包含大量 Shadow DOM/iframe未正确配置。1. 确保审计命令在页面完全加载并完成初始渲染后执行。可以尝试在命令后添加延迟如果扩展支持参数或者确保你的应用在window.onload事件后已渲染关键内容。2. 检查axe-core配置。目前扩展可能使用默认配置对于复杂页面可能需要反馈给扩展开发者以支持自定义axe.run配置。审计过程非常慢页面非常复杂DOM 节点极多。1. 考虑对大型应用进行分块审计只审计关键路由或组件。2. 在 CI 环境中确保有足够的计算资源。3. 检查是否有无限循环的动画或请求阻塞了页面“空闲”状态判定。5.3 自动修复阶段问题问题现象可能原因解决方案fix命令运行后源代码无任何变化1.ACCESSIBILITY_REVIEW_TODO.md文件不存在或路径不对。2. 文件中的问题描述格式无法被解析。3. 所有问题都被判定为“无法自动修复”。1. 确认你在项目根目录下运行fix命令并且ACCESSIBILITY_REVIEW_TODO.md文件存在。2. 检查ACCESSIBILITY_REVIEW_TODO.md文件是否被手动修改过破坏了其 Markdown 结构。3. 查看命令输出日志通常会说明哪些问题被跳过及原因。修复后代码出现语法错误或格式混乱工具的代码修改逻辑与你的代码风格不匹配或存在边界情况 bug。1.立即回滚使用 Git 撤销更改 (git checkout -- .)。2.小范围尝试不要一次性修复所有问题。可以手动编辑ACCESSIBILITY_REVIEW_TODO.md只保留一两个简单问题如颜色对比度再运行fix观察修改是否准确。3.提交 Issue如果反复出现整理一个最小复现案例到扩展的 GitHub 仓库提交 issue。修复了视觉样式但破坏了设计自动调整的颜色不符合品牌色板。1.不要完全依赖自动修复将颜色对比度问题视为设计提示而非必须执行的命令。工具给出的颜色是符合标准的“技术解”但不一定是“设计解”。2.设计师协作将对比度不足的问题反馈给设计师由他们在品牌色系范围内提供符合标准的替代方案。网络错误导致修复失败fix命令中需要调用 Gemini API 的部分因网络问题超时或失败。1. 检查网络连接特别是能否访问 Google AI API。2. 如果问题持续可能是 API 配额或权限问题。检查你的 Gemini API 密钥设置。3. 对于不需要模型介入的修复如纯颜色计算网络问题可能不影响但对于需要语义理解的修复则会失败。5.4 与其他工具的协作你可能会问有了这个还需要 ESLint jsx-a11y 插件或 Lighthouse 吗答案是需要它们是互补的。ESLint jsx-a11y: 这是在代码编写阶段的静态检查。它能捕获像alt属性缺失、错误的role用法等语法层面的问题反馈极快在编辑器中实时提示。但它无法检测运行时样式如颜色对比度、动态生成的内容、或复杂的交互状态。Chrome Lighthouse / DevTools Audits: 这是在浏览器中对已加载页面进行的审计。它同样使用axe-core功能上与web-accessibility扩展的审计部分重叠。但 Gemini 扩展的优势在于命令行集成和自动修复潜力更适合纳入自动化流程。web-accessibilityGemini 扩展: 它填补了本地开发流程自动化的空白。它将审计和修复动作无缝嵌入到你的开发终端并能直接操作源代码。它的定位是开发者的“即时质量助手”。最佳实践是三者结合用 ESLint 守住编码规范的第一道门用web-accessibility扩展在本地提交前进行深度检查和自动修复最后在 CI 和线上用 Lighthouse 进行回归监控。

更多文章