Biome 与 Prettier 兼容性挑战报告深度解读:96%+ 相似度的背后
Biome 与 Prettier 兼容性挑战报告深度解读96% 相似度的背后【免费下载链接】biomeA toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.项目地址: https://gitcode.com/gh_mirrors/bi/biome导读本文基于 Biome 仓库中的 report-challenge.md 及其两份配套兼容性报告 report-es2015.md、report-es2024.md系统解读 Biome 参与 Prettier 兼容性挑战Prettier Challenge的评测口径、测试用例取舍、选项支持范围与底层测试基础设施。读完本文你将理解这两份报告里的兼容性百分比是如何计算出来的、哪些语法被排除在评测之外及其原因以及 Biome 如何借助自动化测试基础设施.prettier-snap快照对比、非严格模式标记、范围格式化占位符等持续对齐 Prettier 的输出。挑战背景为什么会有这两份报告report-challenge.md是 Biome 面向 Prettier 兼容性挑战algora.io 上发起的 Prettier Challenge提交的说明文档。该挑战要求参赛格式化工具尽可能在输出上与 Prettier 保持一致Biome 为此提供了两份口径不同的兼容性报告报告文件评测范围report-es2015.md仅统计 ES2015 语法report-es2024.md统计 ES2024 语法以及被广泛支持的实验性语法decorators、import assertions、import attributes、explicit resource management 等两份报告的核心差异在于语法覆盖范围而非格式化质量本身report-es2015刻意排除了 ES2016 的标准语法用于衡量「在纯 ES2015 代码库上」的兼容度report-es2024则面向更接近当前 JavaScript 生态的真实代码形态纳入 ES2024 及广泛使用的实验性语法。总体指标兼容性如何量化两份报告开头都给出了两个总体指标并附带了严格的数学定义平均兼容性Average compatibility$$average \frac{\sum_{file}^{files}compatibility_{file}}{files}$$即对每个测试文件计算 Prettier Similarity相似度百分比再对所有文件取算术平均。兼容行Compatible lines$$average \frac{\sum_{file}^{files}matching_lines_{file}}{max(lines_{rome}, lines_{prettier})}$$即所有文件中「匹配行数」之和除以「Biome 输出行数与 Prettier 输出行数中的较大者」。这一指标以行粒度衡量输出一致性能避免少数文件的行数差异掩盖整体水平。两报告的实际数值report-es2015.md4530 行平均兼容性 96.70兼容行 97.28report-es2024.md5490 行平均兼容性 96.75兼容行 97.32。两份报告主体均按测试文件逐条列出Prettier Similarity百分比对未达到 100% 的文件附上 unified diff直观展示 Biome 输出与 Prettier 输出的差异点。有代表性的低分用例js/assignment/issue-15534.jsSimilarity 18.18%。差异集中在计算属性访问params[redirectTo]这类成员表达式在赋值左侧的换行策略上Biome 与 Prettier 对括号位置的处理不同js/arrows/newline-before-arrow/newline-before-arrow.jsSimilarity 0.00%仅出现在 report-es2024.md 中。该文件在 ES2024 口径下被纳入评测Biome 的解析阶段对async (x) x;换行后的处理与 Prettier 出现整体性差异js/arrays/numbers-with-tricky-comments.jsSimilarity 54.55%差异围绕注释/*block*/、// line后的数字字面量分组换行策略。这些 diff 块是定位格式化差异的第一手材料也是 Biome 后续迭代修复格式化的回归测试输入。如何亲测Playground 与 Nightly 版本报告文档给出了两种直接验证方式在线 Playground将任意代码粘贴到 Biome 的在线 Playground 中格式化与 Prettier 输出逐行对比安装 nightly 版本报告撰写时对应1.3.3-nightly.ced82danpm install -D biomejs/biome1.3.3-nightly.ced82da由于这些报告记录的是特定时间点的快照若要复现当时的评测环境应使用文档标注的 nightly 版本当前仓库的格式化逻辑biome_js_formatter已经在此基础上持续演进使用最新稳定版实测结果可能与报告数值存在差异。测试用例说明忽略、非严格、不稳定与刻意差异report-challenge.md的「Test case notes」章节是理解报告口径的关键。它把 Prettier 官方测试套件中的用例分成了四类处理方式。忽略的测试用例两份报告共同忽略1. JSX 相关13 个如js/binary-expressions/inline-jsx.js、js/call/first-argument-expansion/jsx.js、js/comments/jsx.js、js/trailing-comma/jsx.js、js/unicode/nbsp-jsx.js等。报告并未解释具体原因但从源码测试入口 prettier_tests.rs 可以看到Biome 的 Prettier 测试套件本身已将.js文件按 JSX 源码类型JsFileSource::jsx()处理说明忽略这些用例并非因为无法解析 JSX而是这些用例聚焦 JSX 格式化细节与评测目标无关。2. 模板字面量中的嵌入式语言格式化13 个目录/文件js/multiparser-comments/、js/multiparser-css/、js/multiparser-graphql/、js/multiparser-html/、js/multiparser-markdown/、js/multiparser-text/、js/template-literals/css-prop.js、js/template-literals/styled-jsx.js等。Prettier 能在模板字面量内识别 CSS、GraphQL、HTML、Markdown 并递归格式化而 Biome 挑战报告聚焦 JavaScript 语法本身故排除这类跨语言场景报告文档中该列表embed.js出现两次系原文笔误不影响结论。3. 非标准与实验性语法包括 V8 内部函数js/v8_intrinsic、Babel 插件语法js/babel-plugins/、async do 表达式js/async-do-expressions/、do 表达式js/do/、export X from modjs/export-default/export-default-from/等、module id {}模块块js/module-blocks等、元组/记录语法#[]与#{}js/tuple、js/record等 8 个用例、管道运算符|js/comments-pipeline-own-line、js/partial-application、js/pipeline-operator、绑定运算符::js/arrows-bind/、js/bind-expressions/等、私有字段解构js/destructuring-private-fields/、延迟导入求值js/deferred-import-evaluation/、source phase importsjs/source-phase-imports/、import reflectionjs/import-reflection/。这些语法要么尚未标准化、要么处于 Stage 早期Biome 解析器不保证支持因此被排除在评测之外。ES2015 报告额外忽略的用例report-challenge.md 特别说明report-es2015在共同忽略列表之上还排除了以下两类广泛使用的实验性语法Decoratorsjs/decorators、js/decorator-auto-accessors/、js/decorators-export/等、js/import-assertions/、js/import-attributes/、js/explicit-resource-management。这些语法在 TypeScript/React 生态中已被大量使用但并非 ES2015 标准故从 ES2015 口径中排除却被纳入 ES2024 口径。标准 ES2016 语法完整列表见原文此处列举代表指数运算符**js/async/exponentiation.js、js/binary-expressions/exp.js、async/awaitjs/async/、js/arrows/newline-before-arrow/newline-before-arrow.js等 9 个用例、函数调用尾逗号js/trailing-comma/function-calls.js等、对象展开与剩余{ ...x }js/spread、js/destructuring/等 8 个用例、for awaitjs/for-await/、私有类字段#fieldjs/classes-private-fields等、可省略 catch 绑定try {} catch {}js/optional-catch-binding、空值合并a ?? bjs/nullish-coalescing等、可选链prop?.js/optional-chaining/等 3 个用例、BigIntjs/big-int/等、数字分隔符1_000js/literal-numeric-separator/等、逻辑赋值??/js/logical-assignment/、私有品牌检查#field injs/private-in、私有方法、类实例字段、静态块static {}js/class-static-block/、顶层awaitjs/top-level-await/、regexd/vflagjs/regex/d-flag.js、js/regex/v-flag.js、Shebang#!/usr/bin/nodejs/shebang/。非严格模式测试用例以下测试用例在非严格 JavaScript 模式sloppy mode / script mode下处理js/with/js/sloppy-mode/js/identifier/with语句、部分标识符解析仅在 sloppy 模式下合法。这一处理在测试基础设施中有直接实现prettier_tests.rs 中的is_non_strict_mode函数会检查文件路径前缀是否命中这三个目录命中则调用source_type.with_module_kind(ModuleKind::Script)切换到脚本非模块解析模式。不稳定测试用例以稳定后的输出为准报告指出Prettier 对部分用例连续格式化两次结果不同格式化不稳定。Biome 的测试基础设施会捕获这类问题CheckReformat二次格式化校验见下文源码分析Biome 选择匹配「稳定化后的版本」即对输入多次运行 Prettier 后得到的最终稳定输出文档说明实际上运行第二次即可稳定。受影响的用例共 9 个js/sequence-expression/parenthesized.jsjs/comments/tagged-template-literal.jsjs/comments/return-statement.jsjs/last-argument-expansion/embed.jsjs/for/continue-and-break-comment-without-blocks.jsjs/class-comment/misc.jsjs/range/boundary.jsjs/range/class-declaration.jsjs/range/multiple-statements2.js这意味着当 Biome 输出与 Prettier 的「第一次输出」不同、但与「第二次输出」一致时该用例仍被判定为兼容。有意的格式化差异部分差异是刻意保留的要么因为 Biome 解析阶段的严格性解析出的 AST 本身不允许 Prettier 那样的输出形态要么是 Biome 认为保持现状可读性更好。报告指向了对应的 issue 以查看这些用例的详细描述本文不再赘述但需明确报告中的兼容性百分比是「实际差异」而非「目标差异」这 9 个不稳定用例与刻意差异用例共同构成了兼容性 100% 之外的合理缺口。选项支持quoteProps 的刻意取舍报告「Option support」章节声明Biome 实现了 Prettier 提供的全部 JavaScript 格式化选项。唯一例外是quoteProps与 Prettier 不同Biome 只为quoteProps提供as-needed和preserve两个值不提供consistent这是刻意选择。这一声明在源码中得到验证context.rs 中QuoteProperties枚举只有两个变体且FromStr实现只接受as-needed与preserve两个字符串context.rs传入其他值会得到Value not supported for QuoteProperties错误。此外格式化的通用选项缩进风格、缩进宽度、行宽、行尾、尾随换行等在 biome_formatter_test 的测试基建中均会透传给真实 workspace 配置说明测试环境与用户实际 CLI/LSP 配置路径一致。源码级验证测试基础设施如何产出这些报告理解报告的生成机制有助于判断其可信度与复现方式。测试入口与用例发现prettier_tests.rs 通过tests_macros::gen_tests!宏扫描tests/specs/prettier/{js,typescript,jsx}/**/*.{js,ts,jsx,tsx}下的全部 Prettier 官方用例每个文件生成一个测试。测试中.js文件统一按 JSX 源码类型解析Prettier 测试套件常在.js中混用 JSX文件名含jsx的.ts文件按 TSX 解析命中非严格模式目录的文件切换为ModuleKind::Script另有is_restricted_typescript将三个特定 TypeScript 文件切换为StandardRestricted变体对应 Prettier 对const类型参数等语法的受限解析。快照对比与 diff 生成核心逻辑在 test_prettier_snapshot.rs占位符剥离strip_prettier_placeholders会移除 Prettier 用例中的游标占位符|与范围占位符PRETTIER_RANGE_START/PRETTIER_RANGE_ENDutils.rs因此既有用例同时覆盖了「全文格式化」与「范围格式化」两种模式prettier-ignore 桥接将prettier-ignore替换为biome-ignore format: prettier ignore输出后再替换回来实现与 Prettier 等价的局部忽略语义二次格式化校验对格式化结果再次运行CheckReformat若输出不一致则测试失败——这正是报告「不稳定测试用例」章节所述能力的实现位置test_prettier_snapshot.rs与 Prettier 输出对比get_prettier_diffutils.rs读取同目录下由 Prettier 预先生成的.prettier-snap文件若 Biome 输出与之一致则直接删除冗余快照PrettierDiff::Same否则生成 unified diff 写入.snap快照并交给DiffReport汇总——这正是报告逐文件列出Prettier Similarity与 diff 的数据来源。从仓库结构看crates/biome_js_formatter/tests/specs/prettier/下存放着与 Prettier 官方套件对应的输入文件及快照报告中的每条 diff 均可回溯到具体的.prettier-snap对比结果具备可复现性。结论与启示综合两份报告与源码实现可以得出以下要点兼容性数值ES2015 口径平均兼容性 96.70、兼容行 97.28ES2024 口径平均兼容性 96.75、兼容行 97.32。两份报告针对的是报告撰写时的特定版本快照当前仓库代码已进一步演进评测口径透明报告明确列出了被忽略的测试用例分类JSX、嵌入式语言、非标准语法、ES2016 语法并解释了三类特殊处理非严格模式、不稳定用例取稳定输出、刻意差异读者可据此判断兼容性数据的适用范围选项层面对齐Biome 实现了 Prettier 全部 JavaScript 格式化选项唯一差异是quoteProps刻意不提供consistent值相关枚举与解析逻辑见 context.rs基础设施保障通过.prettier-snap对比、占位符剥离、二次格式化校验与DiffReport汇总test_prettier_snapshot.rs、utils.rsBiome 将「与 Prettier 输出一致」固化为可回归的自动化测试使兼容性提升具有持续可度量性。对希望评估或复现 Biome 兼容性水平的开发者建议直接阅读 report-es2015.md 与 report-es2024.md 中的 diff 段落定位差异语法点再结合 prettier_tests.rs 与测试用例目录深入调试。【免费下载链接】biomeA toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.项目地址: https://gitcode.com/gh_mirrors/bi/biome创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Docz Monorepo 独立文档包实战:跨 Package 文档化与 docgen 配置全解析

Docz Monorepo 独立文档包实战:跨 Package 文档化与 docgen 配置全解析

文档静态站点开发工具 【免费下载链接】docz ✍ It has never been so easy to document your things! 项目地址: https://gitcode.com/gh_mirrors/do/docz 点击查看 免费下载 本指南以 docz 仓库中的 examples/monorepo-separate-docs 示例为核心,讲解…

2026/9/22 1:57:57 阅读更多 →
FreeUltraCode 不走官方通道,改到 TaoToken 还能一键生成 UMG 吗?

FreeUltraCode 不走官方通道,改到 TaoToken 还能一键生成 UMG 吗?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 23:53:58 阅读更多 →
把 Llama 3.2 智能体的 Base URL 改到 TaoToken 后,自定义 MCP 工具调用怎么跑

把 Llama 3.2 智能体的 Base URL 改到 TaoToken 后,自定义 MCP 工具调用怎么跑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 1:55:03 阅读更多 →

最新新闻

3分钟搞定登入成语:源码解析+移动端实战避坑指南

3分钟搞定登入成语:源码解析+移动端实战避坑指南

3分钟搞定登入成语:源码解析+移动端实战避坑指南 看着满屏红色的 StackTrace ,是不是脑子嗡嗡作响?别慌,这通常是新手在 登入成语 相关开发中遇到的典型场景,尤其是当业务逻辑与底层源码交互出错时。…

2026/9/22 2:00:04 阅读更多 →
避坑奥兹恩:从入门到精通的实战血泪史

避坑奥兹恩:从入门到精通的实战血泪史

避坑奥兹恩:从入门到精通的实战血泪史 看了一堆教程还是不会写项目,这是很多开发者卡在“奥兹恩”技术栈时的真实写照。你以为背下了文档里的 API 就万事大吉了?现实是,一上手真实业务,各种隐蔽的 Bug 和性能陷阱就接踵而至。…

2026/9/22 2:00:04 阅读更多 →
手机qq音乐避坑指南:5个必改的Bug让代码跑通

手机qq音乐避坑指南:5个必改的Bug让代码跑通

手机qq音乐避坑指南:5个必改的Bug让代码跑通 刚毕业进组,对着文档敲下的代码运行直接报错,心里慌得一批?别急,这是每个新手的必经之路。 今天不讲虚的,只聊怎么把复制来的手机QQ音乐API调用代码调通。…

2026/9/22 1:59:04 阅读更多 →
搞懂健身教练要求这3点,前端实战项目不再踩坑

搞懂健身教练要求这3点,前端实战项目不再踩坑

搞懂健身教练要求这3点,前端实战项目不再踩坑 刚入行前端,或者从其他行业转行过来,是不是经常陷入这种尴尬:语法背得滚瓜烂熟,LeetCode 刷了大半本,但一让你做一个 实战项目 ,脑子就一片空白?…

2026/9/22 1:59:04 阅读更多 →
3步搞定WMF格式解析,一文搞懂原理与实战避坑

3步搞定WMF格式解析,一文搞懂原理与实战避坑

3步搞定WMF格式解析,一文搞懂原理与实战避坑 刚入职那会儿,我接手一个老旧政府系统的文档转换需求,结果在WMF格式上卡了整整三天。 配置环境就卡半天…

2026/9/22 1:59:04 阅读更多 →
瓜帅考试避坑指南:5个面试必问底层原理

瓜帅考试避坑指南:5个面试必问底层原理

瓜帅考试避坑指南:5个面试必问底层原理 看了一堆瓜帅教程还是不会写项目?别急,这锅不全是你的。很多技术老手在复盘时发现,卡住你的往往不是语法,而是那些 面试必问…

2026/9/22 1:59:04 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →