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 真被消掉”的部分,绕不开他。
参考与延伸阅读
HTML Design Principles
https://www.w3.org/TR/html-design-principles/WHATWG HTML Standard Introduction
https://html.spec.whatwg.org/multipage/introduction.htmlIdiosyncrasies of the HTML parser / Preface
https://htmlparser.info/preface/