01|这一篇最好的开场,不是抽象原则,而是一张本该报废却还在工作的坏页面

前端圈经常会有一种情绪。

一遇到奇怪兼容性、宽容解析、历史包袱,就忍不住想说:

浏览器为什么不能更严格一点?

这个愿望很正常。

谁不想面对一套更干净、更统一、更容易讲清楚的语言呢?

最后一篇其实是在回答一个很俗、但很硬的问题:

平台到底是要面子,还是要活着。

问题是,HTML 最终没走向这条路。

它没有把现实世界里写得乱七八糟的页面大规模赶出平台。

它没有变成一门越来越像“正规语言”的东西。

它也没有选择那种:

“你写错了就别想跑。”

的硬纪律。

如果只看表面,这像失败。

可如果把前面整套历史连起来看,你会发现事情刚好相反。

HTML 最终没有追求完美,而是追求不坏,这不是偶然失手,而是开放 Web 自己做出的生存选择。

因为 Web 真正害怕的,从来不只是“代码不够优雅”。

它更害怕:

一大批已经在现实里活着的内容,突然断电。


02|这条原则最刺眼的反例,其实正好来自 XHTML:纪律是对的,但一出错用户就先陪葬

前面第三篇讲过,XHTML 最迷人的地方在于它像一场纪律革命。

结构更清楚。

语法更严格。

错误更明确。

这套理想一点都不低级。

可它一旦认真按 XML 世界的脾气落到页面上,问题就出现了。

因为 XML 世界对错误的态度不是“我帮你尽量修一修”。

而是:

你写错了,页面可能直接失败。

这时候,平台必须回答一个非常残酷的问题:

你到底是想把作者教育得更文明。

还是先别让用户因为作者手抖一个标签,就整页什么都看不到。

这就是为什么我一直觉得,HTML 后来最大的责任,已经不是“教作者怎么写对”。

而是:

别让用户因为作者写错,就什么都看不到。

它听起来不够浪漫。

可这才是浏览器后来真正背上的责任。


03|HTML 后来的很多“毛病”,其实都是连续性责任的账单

今天大家抱怨 HTML,经常会集中在这些地方:

  • 解析规则复杂
  • 宽容得有点过头
  • 历史遗留总也清不干净
  • 规范看起来像一边追求干净、一边又不敢动太多旧东西

这些抱怨都不空。

但如果你只把它们看成设计缺陷,就会漏掉真正关键的东西:

这些“毛病”很多不是无意义的混乱,而是连续性责任的成本。

为什么解析规则这么细?

因为现实世界有太多不规范内容,浏览器不能假装它们不存在。

为什么很多旧写法很难彻底死掉?

因为一旦全网大量内容依赖过,平台就很难轻率切断。

为什么 HTML 看起来总像一门不够“绝对现代”的语言?

因为它不能像一个从零开始的新项目那样轻易宣布:

“旧世界作废。”

所以 HTML 身上的很多别扭,不只是技术问题。

它们本质上都是同一个选择的外化结果:

先保整个平台持续运转,再谈怎样让规则更漂亮。


04|HTML5 parser 这条线最能说明问题:浏览器不是在纵容错误,而是在制度化地接住错误

第五篇里其实已经给出一个特别具体的现场。

在 HTML5 之前,浏览器最荒唐的工作之一,是互相猜别人怎么吞错。

后来 parser 规则被写出来,WebKit 可以照着 draft 修 bug,Opera 可以照着规范减少解析互猜,Firefox 新 parser、html5lib、Validator.nu 一起往前推进。

这意味着什么?

意味着 HTML 后来真正追求的,不是“模糊地宽容”。

而是:

可预测、可实现、可测试、可互通的宽容。

这差别特别大。

模糊的宽容只是:

“浏览器大概会救。”

制度化的宽容则是:

“浏览器必须按什么规则救,而且大家最好救出差不多的结果。”

所以 HTML 后来不是在向坏代码投降。

它是在承认:

现实世界的坏页面已经构成平台的一部分,而平台必须把这件事公共化、制度化,而不是继续靠大厂私房经验维持。


05|把整套系列再压成一条线,你会发现 HTML 最终守的是连续性,不是纯度

如果把前面的几篇再压成一条线,其实会特别清楚。

XHTML 输,不是因为它不对,而是它要现实先改

因为它太相信:

只要纪律足够正确,现实最终会愿意跟上。

WHATWG 赢,是因为它先承认现实已经在跑

因为它更早承认:

现实已经在那里跑了,标准必须先接住现实。

parser、error handling 和既有内容一起入法,才是 HTML5 的真正转向

因为开放 Web 想继续活,不能只描绘理想世界,还得接管脏现实。

你会发现,三件事背后其实指向同一条判断:

Web 平台的核心问题,不是怎样最优雅地设计下一代语言,而是怎样在不炸掉旧世界的前提下继续演进。

这就是 HTML 后来为什么越来越像一门“现实制度语言”,而不是一门“纯设计语言”。

它要处理的不只是语义。

还包括:

  • 历史
  • 部署
  • 用户
  • 厂商
  • 兼容
  • 迁移成本

所以 HTML 最后没有变成更纯的语言,不是因为没人想过纯。

而是因为这套平台最终承认:

纯洁很贵,贵到整个 Web 可能付不起。


06|这也是为什么 HTML 留给后人的最大遗产,不是标签表,而是一套平台哲学

如果你只把 HTML 当成基础语法表,它后来的很多故事看上去都会像历史花边。

可如果你把它理解成开放 Web 的底层制度之一,你就会发现它留给后人的遗产特别深。

比如今天很多平台和前端讨论里,反复出现的这些问题:

  • 兼容性到底值不值得如此高优先级
  • 新能力应不应该先考虑旧内容影响
  • 语义和实际部署之间谁更重要
  • 标准应该是静态版本,还是持续维护
  • 实现者和标准组织之间谁更能代表现实

这些问题,都不是 HTML 之外的问题。

它们恰恰是 HTML 多年历史一路压下来的平台哲学。

所以 HTML 真正教给后人的,不只是:

  • section 怎么用
  • article 怎么写
  • DOM 怎么长

它更深的遗产是:

在开放平台上,连续性本身就是一条核心价值。

这条价值很难看,也常常很烦。

但没有它,开放 Web 这种东西很可能根本撑不到今天。


07|所以“HTML 为什么看起来不够完美”,答案恰恰是:它一直在努力不让整个 Web 坏掉

到这里,整套系列最后一句判断其实已经很清楚了。

为什么 HTML 没有变成一门更严格、更干净、更像正规语言的东西?

不是因为没人想过。

不是因为标准组织天生懒。

也不是因为浏览器厂商只会纵容作者。

更接近事实的答案是:

HTML 后来承担的是一整个平台的连续性责任,而不是一门语言的纯度责任。

一旦责任结构变成这样,很多决定就会自动改写:

  • 你更怕断站,而不是怕规则不够漂亮
  • 你更怕平台割裂,而不是怕表达不够整齐
  • 你更怕用户被作者错误拖下水,而不是怕作者被规范骂得不够狠

所以 HTML 最终追求的,并不是“完美”。

它追求的是:

别坏得太厉害,别断得太突然,别让旧世界在新规则面前立刻报废。

这听上去像保守主义。

某种程度上也确实是。

但在开放 Web 这种平台上,这种保守主义本身,就是系统得以继续开放的前提之一。


08|HTML 守到最后,守住的是开放 Web 的连续性

如果你把 HTML 只看成一门写标签的语言,那它当然显得有点老、有点松、有点不够讲究。

可如果你把它看成开放 Web 用来维持连续性的一套底层制度,它很多看上去“不够完美”的地方,就会突然变得可以理解。

因为它真正努力守住的,从来不只是语法。

它守住的,是:

  • 老内容还能活
  • 新浏览器还能接
  • 不同实现还能慢慢对齐
  • 用户不会因为作者写错几行标记就被整个系统抛下

所以写到最后,我觉得对 HTML 最准确的一句评价也许不是“它不够先进”。

而是:

它太清楚开放 Web 不是一张白纸,因此它宁愿不那么完美,也要尽量不把已经活着的世界弄坏。

这就是 HTML 最终留下来的气质。

也是它最深、最不浪漫、却最真实的胜利。


编者注(事实核对):本篇对“严格 XML 失败体验”和“HTML 宽容解析”之间张力的概括,建立在前文对 XHTML 路线和 HTML5 parser 路线的事实基础上;关于 Opera 在实现规范化 parser 后消除大量 web compatibility bugs、以及 HTML parser specification 与实现/测试协同演进的描述,则与 htmlparser.info 和 Anne van Kesteren 的历史回顾一致。


关键人物速览

  • Tim Berners-Lee:整套 HTML 江湖 的起点人物。第七篇回头看时,你会更清楚:他当年开启的那张网,后来为什么必须优先保证不断电。
  • Ian Hickson:把现实网页处理规则一路往标准正文里压进去的重要人物之一。第七篇里“平台连续性责任”那层判断,和他推动的工作高度相关。
  • Anne van Kesteren:HTML parser 历史的重要记录者与参与者。理解“宽容解析不是低标准,而是制度化连续性”的最好入口之一,就是他这条线。
  • Henri Sivonen:实现侧关键人物之一。第七篇里那些“规范真正落成实现、兼容 bug 真被消掉”的部分,绕不开他。

参考与延伸阅读

  1. HTML Design Principles
    https://www.w3.org/TR/html-design-principles/

  2. WHATWG HTML Standard Introduction
    https://html.spec.whatwg.org/multipage/introduction.html

  3. Idiosyncrasies of the HTML parser / Preface
    https://htmlparser.info/preface/