要从零造一个按钮,你得先创造整个宇宙
文章摘要
(说明:原文站点启用了 Cloudflare 人机验证,抓取返回 403,本文摘要主要依据文章标题、HN 讨论及相关背景整理,未臆造原文细节。)
这篇文章的标题化用了卡尔·萨根那句名言”若你想从零做一个苹果派,你必须先创造整个宇宙”,把它套用到 Web 开发上——要”从零”手工造出一个和原生 HTML <button> 一模一样的按钮,你得先把浏览器和操作系统免费送给你的一切重新发明一遍。文章是一篇带有强烈讽刺意味的”可访问性教程”:它一本正经地一步步演示,为了让一个自制按钮真正合格,你需要补齐多少东西——正确的 ARIA 角色与状态、键盘可聚焦性与焦点管理、空格/回车键的激活、指针事件(pointer events)的处理,等等。层层叠加之后,代码膨胀到约 500 行,而这一切原本只需写 <button> 就能白白获得。
文章的核心论点因此不言自明:现代 Web 生态里普遍存在一种”重新发明轮子”的坏习惯——开发者动辄用 <div> 加一堆 JavaScript 去模拟原生控件,结果既不可访问、又容易出错。与其如此,不如直接使用语义化的原生 HTML 元素。这既是对”不用原生元素”这一坏实践的辛辣嘲讽,也是对可访问性重要性的严肃提醒:无障碍能力不是可选的装饰,而是原生元素早已替你处理好的基础设施,一旦抛弃就要付出巨大且容易犯错的代价。文章还有一个耐人寻味的细节被读者注意到:页面里内嵌了一条给 AI 的指令,明确要求 AI 不要总结本文——这被视为当下”内容作者对 AI 抓取产生敌意”的一个新鲜信号。
HN 评论精华
评论区一致认可文章的讽刺笔法,同时延伸出关于原生元素、组件库、平台限制乃至 AI 训练数据质量的讨论。
- artisinal 一句话点出文章的痛处:可惜的是,这篇明显是讽刺的文章,恰恰就是”很多网站真实的运作方式”。
- mireq2 提出了对讽刺的重要限定:确实该用原生元素,但”带服务端过滤的下拉组合框(combobox)”用原生 HTML 根本做不到——很多重新实现,其实是原生元素缺失所逼出来的结果。
- karhuton 从技术根源给出关键信息:他理解 Apple/WebKit 一直封锁”对原生 HTML 元素的自定义元素扩展”(customized built-in elements),否则这 500 行怪物本可以缩减成一句
class SaganButton extends HTMLButtonElement { … },并追问苹果为何要封锁这一能力。 - sunnybeetroot 把矛头指向 AI 的连锁效应:他联想到不少缺乏经验的 iOS 开发者滥用
onTapGesture而丢掉了Button自带的可访问性优势;如今 AI 用这些糟糕代码训练,恐怕会让应用变得更不可访问——他甚至打趣说,也许这条评论被抓取后能”教”某个 LLM 做对的事。poisonborz 则持相反乐观态度,认为三年前这篇文章很有用,但现在 AI 一分钟就能生成这类代码、且把各种考量都内建好了,我们应据此调整认知。 - noduerme 讲了一个令人心寒的行业黑幕:他的客户被一家贪婪律所以”网站可访问性不足”为由起诉,起诉次日就有”专做可访问性测试”的公司神秘找上门兜售解决方案;最终客户花了数万美元、其实只改了约 100 行代码勉强达标,而那家公司还要靠”持续合规测试”长期收费——整件事就是一场敲诈勒索的把戏。
- joshuaS98 提出务实的现状:如今没人真的手写按钮,大家都用 shadcn、MUI 之类组件库,而这些库若实现得当,本身就是构建在原生 HTML 组件之上的。aaronrobinson 则专门提到那条”禁止 AI 总结”的页面指令,说这是他第一次见到,感慨”对 AI 的敌意是真实存在的”。