@accesslint/core

中文文档
0.21.0发布于 2026/08/11MITTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 7.3万

纯可访问性规则引擎 — WCAG 审计, 零浏览器依赖性

中文使用文档
文档目录20 节
  1. 目录
  2. 为什么 @ accesslint/ core
  3. 安装
  4. 快开始
  5. Vitest + 反应测试库
  6. 剧作家
  7. 齐压
  8. API 密码
  9. runAudit(doc: Document, options?: AuditOptions): AuditResult
  10. version: string
  11. createChunkedAudit(doc: Document, options?: AuditOptions): …
  12. rules
  13. getActiveRules(options?: AuditOptions): Rule[]
  14. getRuleById(id, options?: { locale?: string; additionalRule…
  15. attachReactFiberSource(violations): Promise<void>
  16. 公用事业
  17. 规则
  18. 兼容性
  19. 发展
  20. 许可证

@ accesslint/ 核心

npm version license

纯无障碍规则引擎,零浏览器依赖性. 包括具有最佳做法规则的WCAG 2.2 A级和AA级.

与AI编码代理? @accesslint/mcp 将此引擎包成模式背景协议服务器。 这个 Claude 代码插件 安装在一步.

找CI吗? 访问提示 对每个拉动请求进行无障碍检查,并直接在您的 GitHub PRs 上发布评论.

目录

为什么 @ accesslint/ core

  • 同步 API —— 说 runAudit() 立即返回结果,不需要同步/等待
  • 与快乐的境界合作 ——全力支持快乐度,jsdom,以及没有多填或工作环的正版浏览器,包括虚拟 DOMs 中的色彩对比检查
  • 轻巧 - 46 KB gzipped(IIFE),零运行时间依赖性
  • 中断审计 ——按时间编制预算的处理方式 createChunkedAudit 以避免主线条上的长任务
  • 源头映射( 反应) ——选入 attachReactFiberSource 行走 React DevTools 纤维并解决被捆绑的通克 URL 通过其源图,因此违规指向真实源文件(src/Card.tsx:42:7) 而不是不透明的选择器
  • 无害环境管理、CJS和IIFE – 树可摇动的 ES 模块,用于节点的 CommonJS 和用于脚本注入任意一页的单文件 IIFE

安装

npm install @accesslint/core

快开始

Vitest + 反应测试库

审计您现有测试套件中已实现的组件 :

import { render } from "@testing-library/react";
import { runAudit } from "@accesslint/core";
import { LoginForm } from "./LoginForm";

test("LoginForm has no accessibility violations", () => {
  const { container } = render(<LoginForm />);
  const { violations } = runAudit(container.ownerDocument);
  expect(violations).toEqual([]);
});

剧作家

将库输入页面并审计实时 DOM :

// a11y.spec.ts
import { test, expect } from "@playwright/test";

const iife = require.resolve("@accesslint/core/iife");

test("page has no accessibility violations", async ({ page }) => {
  await page.goto("https://example.com");

  await page.addScriptTag({ path: iife });

  const violations = await page.evaluate(() => {
    const { runAudit } = (window as any).AccessLint;
    return runAudit(document).violations.map((v: any) => ({
      ruleId: v.ruleId,
      message: v.message,
      selector: v.selector,
      impact: v.impact,
    }));
  });

  expect(violations).toEqual([]);
});

齐压

将库输入页面并审计实时 DOM :

// cypress/e2e/a11y.cy.js
Cypress.Commands.add("audit", () => {
  return cy.readFile("node_modules/@accesslint/core/dist/index.iife.js").then((src) => {
    return cy.window().then((win) => {
      win.eval(src);
      const result = win.AccessLint.runAudit(win.document);
      return result.violations;
    });
  });
});

describe("sample.html accessibility audit", () => {
  beforeEach(() => {
    cy.visit("sample.html");
  });

  it("has no accessibility violations", () => {
    cy.audit().should("have.length", 0);
  });
});

API 密码

runAudit(doc: Document, options?: AuditOptions): AuditResult

运行所有针对文件的有效规则并返回违反 。 所有选择都是按要求进行的,不重复——没有触及全球状况.

interface AuditOptions {
  additionalRules?: Rule[];
  disabledRules?: string[];
  includeAAA?: boolean;
  componentMode?: boolean;
  locale?: string;
}
interface AuditResult {
  url: string;
  timestamp: number;
  testEngine: TestEngine;
  testEnvironment: TestEnvironment;
  violations: Violation[];
  ruleCount: number;
  skippedRules: { ruleId: string; error: string }[];
}

interface TestEngine {
  name: "accesslint";
  version: string;
}

interface TestEnvironment {
  userAgent: string;
  windowWidth: number;
  windowHeight: number;
  orientationAngle: number;
  orientationType: string;
}

testEngine.version 这是 @accesslint/core 引擎版本. testEnvironment 描述已审计文档的域;不可读值返回到 "", (中文(简体) ), 0,以及 "portrait-primary"。 。 。 .

interface Violation {
  ruleId: string;
  selector: string;
  html: string;
  impact: "critical" | "serious" | "moderate" | "minor";
  message: string;
  context?: string;
  element?: Element;
  /** Source-code locations for the violating element, when populated by `attachReactFiberSource`. */
  source?: SourceLocation[];
}

interface SourceLocation {
  file: string;
  line: number;
  column?: number;
  /** Component or function name, when known (e.g. "ProductCard"). */
  symbol?: string;
  /** 0 = JSX literal that produced the element; 1+ = enclosing component(s). */
  ownerDepth: number;
}

version: string

引擎版本, 镜像 axe.version. 也作为 AccessLint.version 在独立的全球(IIFE)上.

import { version } from "@accesslint/core";

createChunkedAudit(doc: Document, options?: AuditOptions): ChunkedAudit

创建一个块式审计,在有时间框的批次中处理规则,以避免长的任务.

const audit = createChunkedAudit(document, { includeAAA: true });

function processNext() {
  const hasMore = audit.processChunk(16); // 16ms budget per frame
  if (hasMore) requestAnimationFrame(processNext);
  else console.log(audit.getViolations());
}

processNext();

rules

所有捆绑的阵列 Rule 对象.

getActiveRules(options?: AuditOptions): Rule[]

返回被给定选项过滤的捆绑规则:排除AAA级规则,除非 includeAAA 设置,在 componentMode ,不包括在 disabledRules附录 additionalRules时 locale 通过,返回带有翻译描述和指导的浅层规则.

getRuleById(id, options?: { locale?: string; additionalRules?: Rule[] }): Rule | undefined

查查身份证明 过 locale 获取翻译规则,或 additionalRules 还搜索自定义规则.

attachReactFiberSource(violations): Promise<void>

附加的页后处理器 source 每个地点 通过行走回放纤维来破坏 非反应页面上的禁用,生产建设, 或无纤维时,永不抛出。 要求联合来文X __source 转换 和 dev sourcemaps(默认在 CRA, Next dev, Vite + React 中).

当纤维携带 _debugSource 它被信任为现实; 否则 _debugStack (例如,Next.js dev)通过 块 .js.map。 。 。 .

限制 : 编辑 _debugSource 路径, dev 服务器 每个单元的序言(尤其是Vite,反应18和19)抵消所报告的 行/列——文件和组件保持正确,但行可以指向 比真源还低 这个 _debugStack 路径不受影响.

// In a Playwright test, after the audit:
const violations = await page.evaluate(async () => {
  const { runAudit, attachReactFiberSource } = (window as any).AccessLint;
  const result = runAudit(document);
  await attachReactFiberSource(result.violations);
  return result.violations;
});

console.log(violations[0].source);
// [{ file: "src/components/ProductCard.tsx", line: 42, column: 7, symbol: "ProductCard", ownerDepth: 0 }, ...]

公用事业

制定定制规则的助手:

  • getAccessibleName(el) ——计算一个元素的可访问名称
  • getComputedRole(el) 得到计算 ARIA 角色
  • getImplicitRole(el) ——获得隐含(内在)ARIA角色
  • isAriaHidden(el) ——检查元素是否通过 aria-hidden
  • isValidRole(role) ——检查字符串是否是一个有效的 ARIA 角色
  • getAccessibleTextContent(el) ——获得文本内容尊重 aria-hidden
  • getSelector(el) ——为元素生成 CSS 选择器
  • getHtmlSnippet(el) —— 获取元素的简略 HTML 片断

规则

包括WCAG 2.2 A级和AA级,外加最佳做法规则. 增加一个AAA级规则(distinguishable/color-contrast-enhanced捆绑但默认排除;通过 runAudit(doc, { includeAAA: true })。 。 。 .

规则 ID 匹配 ruleId 字段中的字段,并与 disabledRules 选项和 getRuleById()。 。 。 .

查看所有规则
规则职等西非咨询组说明
navigable/document-titleA 类2.4.2文档必须有一个 <title> 键.
navigable/bypassA 类—— 说页面必须有一个绕过重复块的机制.
navigable/page-has-heading-oneA 类—— 说页应包含一级标题.
labels-and-names/frame-titleA 类4.1.2 国家框架必须有一个可访问的名称 .
labels-and-names/frame-title-uniqueA 类4.1.2 国家框架标题应当是独一无二的.
distinguishable/meta-viewportAA 对1.4.4 (中文(简体) )Viewport 元不能禁用用户缩放 .
enough-time/meta-refreshA 类2.2.1 联合国元刷新不能自动重定向或刷新 .
enough-time/meta-refresh-no-exceptionA 类2.2.1 联合国Meta刷新不能被延迟使用(没有例外).
enough-time/blinkA 类2.2.2<blink> 不得使用.
enough-time/marqueeA 类2.2.2<marquee> 不得使用.
text-alternatives/img-altA 类1.1.1 (中文(简体) )图像必须有替代文本 .
text-alternatives/svg-img-altA 类1.1.1 (中文(简体) )SVG图像必须有一个可访问的名称.
text-alternatives/input-image-altA 类1.1.1, 4.1.2 (中文(简体) )图像输入必须有替代文本 .
text-alternatives/image-redundant-altA 类—— 说图像备选案文不应重复相邻文本.
text-alternatives/image-alt-wordsA 类—— 说备选文本不应包含"图像","相"等.
text-alternatives/area-altA 类1.1.1, 4.1.2 (中文(简体) )<area> 元素必须具有备选案文.
text-alternatives/object-altA 类1.1.1 (中文(简体) )<object> 元素必须具有备选案文.
text-alternatives/role-img-altA 类1.1.1 (中文(简体) )role="img" 元素必须有一个无障碍的名称.
keyboard-accessible/server-image-mapA 类2.1.1 国家不得使用服务器侧图像映射 .
labels-and-names/form-labelA 类4.1.2 国家形式元素必须具有标签.
labels-and-names/multiple-labelsA 类—— 说窗体字段不应有多个标签 .
labels-and-names/input-button-nameA 类4.1.2 国家输入按钮必须有可识别文本 .
adaptable/autocomplete-validAA 对1.3.5 国家自动完整属性必须使用有效值.
labels-and-names/label-content-mismatchA 类—— 说可访问名称必须包含可见文本 .
labels-and-names/label-title-onlyA 类—— 说表格不应使用标题作为唯一的标签.
keyboard-accessible/tabindexA 类—— 说选项卡索引不应大于 0.
keyboard-accessible/focus-orderA 类—— 说可重点要素必须发挥适当作用.
keyboard-accessible/nested-interactiveA 类4.1.2 国家互动控制不能被嵌入.
keyboard-accessible/scrollable-regionA 类2.1.1 国家可滚动区域必须是可用键盘.
keyboard-accessible/accesskeysA 类—— 说Accesskey 值必须是独一无二的 .
keyboard-accessible/focus-visibleAA 对2.4.7 国家重点顺序要素必须有一个明显的重点指标.
navigable/heading-orderA 类—— 说头级应增加一等.
navigable/empty-headingA 类—— 说标题必须具有明显的文字.
navigable/p-as-headingA 类—— 说段落不应被称作标题.
landmarks/landmark-mainA 类—— 说Page应该有一个主要的地标.
landmarks/no-duplicate-bannerA 类—— 说没有重复的横幅地标.
landmarks/no-duplicate-contentinfoA 类—— 说没有重复的内容info地标 .
landmarks/no-duplicate-mainA 类—— 说没有重复的主要地标.
landmarks/banner-is-top-levelA 类—— 说班纳地标应该是顶层的.
landmarks/contentinfo-is-top-levelA 类—— 说Contentinfo地标应为顶级.
landmarks/main-is-top-levelA 类—— 说主要地标应为上层.
landmarks/complementary-is-top-levelA 类—— 说边地标应该是顶层的.
landmarks/landmark-uniqueA 类—— 说同类地标应当有独特的标签.
landmarks/regionA 类—— 说所有内容都应在里程碑内.
adaptable/list-childrenA 类1.3.1 国家<ul> 财务报告和审定财务报表 <ol> 必须有有效的孩子.
adaptable/listitem-parentA 类1.3.1 国家<li> 一定是在一个 <ul>, (中文(简体) ), <ol>,或 <menu>。 。 。 .
adaptable/dl-childrenA 类1.3.1 国家<dt> 财务报告和审定财务报表 <dd> 一定是在一个 <dl>。 。 。 .
adaptable/definition-listA 类1.3.1 国家<dl> 必须有有效的孩子.
distinguishable/letter-spacingAA 对1.4.12 (中文(简体) )字母间距 !important 必须是至少0.12毫米.
distinguishable/line-heightAA 对1.4.12 (中文(简体) )线高与 !important 必须是至少1.5.
distinguishable/word-spacingAA 对1.4.12 (中文(简体) )文字间距 !important 必须是至少0.16毫米.
adaptable/orientation-lockAA 对1.3.4 国家不得限制页面取向.
aria/aria-rolesA 类4.1.2 国家ARIA角色价值必须有效.
aria/aria-valid-attrA 类4.1.2 国家ARIA属性必须有效(正确拼写).
aria/aria-valid-attr-valueA 类4.1.2 国家ARIA属性必须具有有效的值.
aria/aria-required-attrA 类4.1.2 国家需要的ARIA属性必须存在.
aria/aria-allowed-attrA 类4.1.2 国家角色必须允许ARIA属性.
aria/aria-allowed-roleA 类4.1.2 国家ARIA的作用必须适合这一要素.
adaptable/aria-required-childrenA 类1.3.1 国家ARIA的作用必须需要儿童的作用.
adaptable/aria-required-parentA 类1.3.1 国家ARIA的作用必须是必要的父母角色.
aria/aria-hidden-bodyA 类4.1.2 国家aria-hidden 绝对不能上 <body>。 。 。 .
aria/aria-hidden-focusA 类4.1.2 国家aria-hidden 各区域不得含有可突出重点的内容.
labels-and-names/aria-command-nameA 类4.1.2 国家ARIA命令必须有一个无障碍的名称.
labels-and-names/aria-input-field-nameA 类4.1.2 国家ARIA 输入字段必须有一个可访问的名称.
labels-and-names/aria-toggle-field-nameA 类4.1.2 国家ARIA 切换字段必须有一个无障碍的名称.
labels-and-names/aria-meter-nameA 类4.1.2 国家ARIA仪表必须有一个无障碍的名称.
labels-and-names/aria-progressbar-nameA 类4.1.2 国家ARIA 进步栏必须有一个无障碍的名称.
labels-and-names/aria-dialog-nameA 类4.1.2 国家ARIA 对话框必须有一个无障碍的名称 .
labels-and-names/aria-tooltip-nameA 类4.1.2 国家ARIA工具提示必须有一个无障碍的名称.
labels-and-names/aria-treeitem-nameA 类4.1.2 国家ARIA 树条必须有一个无障碍的名称.
aria/aria-prohibited-attrA 类4.1.2 国家不得禁止该角色的ARIA属性.
aria/presentation-role-conflictA 类4.1.2 国家展示角色不得与可聚焦性相冲突.
aria/presentational-children-focusableA 类4.1.2 国家介绍性儿童不得含有可关注的内容.
labels-and-names/button-nameA 类4.1.2 国家按钮必须有明显的文本.
labels-and-names/summary-nameA 类4.1.2 国家<summary> 元素必须有一个无障碍的名称.
navigable/link-nameA 类2.4.4, 4.1.2链接必须有可识别的文本.
navigable/skip-linkA 类2.4.1 国家跳过链接必须指向有效的目标 .
distinguishable/link-in-text-blockA 类1.4.1 国家文本块中的链接必须比颜色更能区分.
readable/html-has-langA 类3.1.1 国家<html> 必须有一个 lang 属性.
readable/html-lang-validA 类3.1.1 国家lang 打开 <html> 必须是有效的.
readable/valid-langAA 对3.1.2 国家lang 属性必须对所有元素具有有效的值.
readable/html-xml-lang-mismatchA 类3.1.1 国家lang 财务报告和审定财务报表 xml:lang 必须匹配.
adaptable/td-headers-attrA 类1.3.1 国家表格头引用必须有效.
adaptable/th-has-data-cellsA 类1.3.1 国家表格头应与数据单元格相连接.
adaptable/td-has-headerA 类1.3.1 国家大表格中的数据单元格应当有相联标题.
adaptable/scope-attr-validA 类1.3.1 国家scope 属性必须具有有效的值.
adaptable/empty-table-headerA 类—— 说表格头应该有可见的文本.
labels-and-names/duplicate-id-ariaA 类4.1.2 国家ARIA中使用的身份证必须是独一无二的.
time-based-media/video-captionsA 类1.2.2 国家视频必须有标题.
time-based-media/audio-transcriptA 类1.2.1 国家音频元素应有一个文本选项.
distinguishable/color-contrastAA 对1.4.3 国家文本必须有足够的颜色对比 .
input-assistance/accessible-authenticationAA 对3.3.8 国家密码输入不得屏蔽密码管理器.
distinguishable/color-contrast-enhancedAAA 亚军1.4.6 国家文本必须具有增强的颜色对比(AAA).

兼容性

在下列环境中试验:

环境支助
节点.js 18+对
快乐的境界对
日记对
颜色/边缘对
火花对
萨法里对

发展

npm install
npm test        # 1191 tests
npm run bench   # performance benchmarks
npm run build   # produces dist/index.js, dist/index.cjs, dist/index.d.ts, dist/index.iife.js

找到窃听器还是有什么建议? 打开一个问题。 。 。 .

许可证

麻省理工学院

版本与发布记录

@accesslint/core 共发布 62 个版本,首次发布于 2026/02/05;过去 12 个月发布了 62 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.21.0latest2026/08/112 个月前
0.20.12026/08/112 个月前
0.20.02026/08/112 个月前
0.19.02026/08/112 个月前
0.18.02026/08/072 个月前
0.17.02026/07/273 个月前

关于 @accesslint/core 的常见问题

@accesslint/core 是什么?

纯可访问性规则引擎 — WCAG 审计, 零浏览器依赖性

如何安装 @accesslint/core?

在项目目录运行 npm install @accesslint/core,或使用 pnpm add / yarn add / bun add。

@accesslint/core 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@accesslint/core 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@accesslint/core 可以商用吗?

@accesslint/core 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@accesslint/core 的下载量有多少?

根据 npm 官方下载统计,@accesslint/core 在 2026/10/05 – 2026/11/03 这 30 天内被下载 72,696 次,日均约 2,423 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@accesslint/core 还在维护吗?

最新版本 0.21.0 发布于 2026/08/11(2 个月前);至今共发布 62 个版本,其中过去 12 个月发布了 62 个;首次发布于 2026/02/05。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。