Web History · Concept Critique
HTML 赢在不抛弃旧代码
1991 年 Tim Berners-Lee 在 CERN 写了几个标签想给同事分享物理论文,谁能想到 35 年后还是这玩意儿统治互联网。HTML 赢的不是技术先进——很多场合它甚至挺笨拙——是它从不抛弃旧代码。每次有人想推翻它换更"现代"的方案,XHTML、Flash、Silverlight、原生 app 优先论,都败给了同一条:1995 年写的网页今天浏览器还能打开。这条不性感,但是真的护城河。
从 CERN 几个标签走到今天的底层
六站,叙事弧很清晰 ——从一个物理实验室副产品,一路熬过来,把所有挑战者送进坟场。前四站是时间线:起源 → 浏览器大战 → XHTML 失败 → HTML5 复活。第五站是核心:这玩意儿为什么没死,反而越变越强。最后一站讲它现在的位置 ——React/SPA 时代它沉到底层,但底层就是底层,没人敢动。
起源 ——CERN 一个想分享论文的人
你说 HTML 这玩意儿一开始为啥发明出来?不是为了开互联网,不是为了做 web,就为了一个特别小的需求 ——CERN 这帮物理学家想互相分享实验数据和论文,内部文档系统又乱又散。
1989 年 3 月,Tim Berners-Lee 跟 Robert Cailliau 写了一份提案 ——Information Management: A Proposal1。他老板 Mike Sendall 当时给的批语极有名:"vague, but exciting"(写得不清楚,但有意思)2。这事儿如果当年老板说"算了不批",可能就没今天的互联网了。这就是历史上的偶然性。
1991 年 Berners-Lee 在 CERN 的 NeXT 工作站上写出了三件东西:HTML (页面表示)、URL (找东西)、HTTP (传东西)3。第一版 HTML 只有大约 18 个标签 ——<p>、<a>、<h1>-<h6>、<title>、<ul>、<li> 这些基础的。没有 CSS,没有 JS,连图片都没 (<img> 是 1993 年 Marc Andreessen 在 Mosaic 浏览器里加的)。
第一版 HTML 长什么样
真的就是几行:<TITLE>CERN Physics</TITLE> + <H1>Particle Data</H1> + <P>See <A HREF="...">table</A></P>。就这么简单。没有 div 没有 class 没有 style。但这种简单恰好是它的护城河 ——任何人 5 分钟就能学会写一个,任何浏览器 100 行 C 代码就能解析。简单到不可被替代,这条贯穿了 HTML 整个生命。🟢 high
注意一个关键点 ——HTML 当年是从 SGML 抄的。SGML 是 IBM 一个老规范,标签语法借得很彻底。但 Berners-Lee 故意把 SGML 的严格语法松绑了 ——大小写不分、不闭合标签也行、属性不加引号也行。这种"故意宽松"在 90 年代被很多人骂"不严谨",但正是这种宽松让 HTML 能容忍各种半生不熟的网页继续工作。这是后面 XHTML 想纠正、然后栽跟头的根源。
这条"严谨派输给宽松派"的规律不是 HTML 一个孤例 ——互联网生态里出现过 4 次几乎一样的对决,结局全一样:
| 严谨派 (规范派) | 宽松派 (够用派) | 大概时间 | 谁赢 |
|---|---|---|---|
| SGML | HTML | 1989-1995 | HTML |
| XML | JSON | 2000s | JSON |
| SOAP | REST | 2000s | REST |
| XHTML 2 | HTML5 | 2002-2014 | HTML5 |
看上面那张表,4:0。互联网这个生态偏爱"够用就行的宽松",讨厌"完美但难用的严谨"。这不是文化偏好,是结构性的 ——宽松派的入门门槛低 → 用户基数大 → 网络效应起来 → 严谨派再"对"也没人陪你玩。这条规律到 AI 时代还在 ——LLM 的"模糊容忍"比早期 expert system 的"严格逻辑"赢得彻底,是同一条线的延伸。
浏览器大战 ——blink 和 marquee 的故事
1995 年到 1999 年,HTML 经历了它最混乱也最有趣的一段。Netscape Navigator 跟 Internet Explorer 互相砍 ——这叫第一次浏览器大战4。两家都在拼命加自家的 HTML 标签,目的就一个:让网页只在自家浏览器上好看,把对方挤死。
两个标志性垃圾标签
Netscape 1994 年加了 <blink> ——让文字闪烁。微软 1996 年还击,在 IE 里加了 <marquee> ——让文字滚动5。两个标签在对方浏览器里完全不工作。结果是 90 年代末的网页全是"Best viewed in Netscape"/"Best viewed in Internet Explorer"的横幅,跟今天淘宝商品的"建议 Chrome 浏览器"差不多4。
| 标签 | 谁加的 | 年份 | 下场 |
|---|---|---|---|
| <blink> | Netscape | 1994 | 2013 年 Firefox 彻底移除 |
| <marquee> | Microsoft IE | 1996 | HTML5 列为 obsolete,但浏览器仍然渲染 |
| <layer> | Netscape 4 | 1997 | Netscape 4 死了它就死了 |
| <bgsound> | Microsoft IE | 1995 | HTML5 时代被 audio 取代 |
有意思的事儿 ——1996 年 2 月一次 HTML 标准会议上,Netscape 跟 Microsoft 私下达成了一笔交易:"Netscape 撤 blink,Microsoft 撤 marquee,两个都不进 HTML 标准"5。这种"两家厂商私下交易"决定标准走向,在今天看很匪夷所思,但 90 年代就这么干的。🟢 high
浏览器大战 5 年下来留下了一个深刻教训 ——"标签战争"打到最后两败俱伤。无论是 Netscape 还是 Microsoft,谁加了一堆专属标签谁就让 web 开发者头大。最后的赢家其实是共同标准——W3C (1994 年成立) 慢慢成了仲裁者。这段历史教训让所有后来想"独占某层"的尝试都没好下场:Flash、Silverlight、AMP 都犯过同样的错。
"你以为浏览器大战是 Netscape 输了。"——这是常见误解。结果上 Netscape 公司确实没了 (2003 年被 AOL 解散),但它的基因没死:Mozilla / Firefox 是 Netscape 开源后的延续,Gecko 渲染引擎到今天还在跑 Firefox。而真正的赢家既不是 Netscape 也不是 Microsoft 一家 ——是 W3C 这个标准组织。垄断浏览器市场不等于垄断 HTML 标准,这一点 Microsoft 后来吃了大亏。
XHTML 失败 ——一次伟大的错误
2000 年代初,W3C 决定 ——HTML 这玩意儿太松散了,得换个严谨版本。这就是 XHTML。再下一步要做 XHTML 2,把 HTML 跟 XML 完全统一,强制严格语法。听起来很合理,对吧?结果是一场十年的失败。
XHTML 2 错在哪
XHTML 2 最致命的设计决定 ——不向后兼容。它说"我们要做一个纯净的 HTML,不要前面那些历史包袱"6。听上去很学院派,但这意味着 ——你 1995 年到 2005 年写的几亿个网页,在 XHTML 2 浏览器里全部得重写,否则不工作。🟢 high
这就跟 ——你跟人说"我们要换一种新语言,从此以后不许说中文,所有现存中文书全得翻译" ——可能新语言确实更"科学",但没人陪你疯。
WHATWG 跳出来"造反"
2004 年,事情变得有意思。W3C 一次 workshop 上,Opera 的 Ian Hickson 提了一份提案:"扩展 HTML 让它能做 web 应用"。被 W3C 拒了 ——W3C 当时铁了心要走 XHTML 2 的路7。
Hickson 不干了。同年 6 月,他跟 Opera、Apple、Mozilla 的人成立了 WHATWG ——Web Hypertext Application Technology Working Group7。本质上是"我们不跟 W3C 玩了,自己另起一摊"。这个动作在标准组织界相当于政变。Hickson 自己接手编辑这套规范,后来这就是 HTML5。
把 XHTML 1.0 / XHTML 2 / HTML5 三个东西摆一起对比,你就能看出"宽松派"为什么必赢:
| 维度 | XHTML 1.0 | XHTML 2 | HTML5 |
|---|---|---|---|
| 时间 | 2000 推出 | 2002-2009 草案 | 2014 W3C 正式推荐 |
| 设计哲学 | HTML + XML 严格语法 | 清洁重做,完全重设计 | "don't break the web",向后兼容 |
| 向后兼容 | 有限(部分) | 无 ——旧页面全得重写 | 强制有 ——95 年页面 2026 年还能开 |
| 错语法宽容 | 不容忍 ——少一个闭合标签整页崩 | 不容忍 | 容忍 ——浏览器尽力渲染 |
| 谁主导 | W3C | W3C | WHATWG → W3C 接受 |
| 现状 | 事实废弃 | 死(2009 工作组解散) | 主流(2026 还在用) |
2006 年 10 月,Tim Berners-Lee 本人(W3C 创始人)在博客上公开认错7:"试图把 web 从 HTML 搬到 XML 这件事,就是没成"。这一表态在标准界相当于天王亲口宣布失败。2009 年 10 月,W3C 正式解散 XHTML 2 工作组,XHTML 2 彻底死亡。
本讲稿对"HTML 赢在不抛弃旧代码"这条立场的最强证据,就是 XHTML 2 这次失败 ——一群最聪明的 web 架构师 (Berners-Lee 自己领导的 W3C) 花了 8 年想推翻 HTML 重做,结果发现根本推不动。这次失败给所有后来想"清洁重写 web"的人当了警示牌:你可以做得更"对",但你做不到"还能向后兼容现有几亿个网页"。这条规律到 2026 年还成立。
为什么赢 ——三条结构性原因
讲到这儿,可以回答你那个问题了 ——HTML 凭什么 35 年没死,反而成主流?三条结构性原因,叠加在一起,基本无解。
第一条:向后兼容 ——"don't break the web"
这是 HTML 最深的护城河。W3C 自己的 HTML 设计原则里有一条明文写着 ——"Existing content should continue to work" (现有内容必须继续工作)9。这条不是审美选择,是硬规则。你提案任何新标签,如果会破坏现有页面 ——立刻被否。
这条规则的实际效果有多狠?1995 年用 Notepad 写的第一个网页,2026 年用 Safari 打开,依然渲染正常。这件事在软件世界几乎是独一份。同期的 Visual Basic 6 应用早在 Windows 7 上就跑不动了。iOS 原生 app 每两年因为 SDK 变化就得改一遍。HTML 是少数能跨越 30 年"零成本"运行的技术。10 🟢 high
第二条:错语法宽容 ——降低入门门槛到地板
HTML 故意松散这件事,被 XML 派骂了 20 年。但松散的代价换来的是 ——世界上任何人,只要会打字,5 分钟就能写出第一个网页。忘记闭合 </p> 也能渲染,大小写不分也能渲染,属性不加引号也能渲染。
这跟编程语言形成对照 ——你忘了 Java 的分号,程序直接编译失败。但 HTML 是"尽力渲染" ——浏览器收到任何半生不熟的输入,都会努力给你出个东西。这种"低入门门槛 + 故障容错"建立了世界级网络效应:90 年代末的非程序员秘书都在写 HTML,这种用户基数是其它任何文档技术都没有的。
第三条:开放标准 ——没人能撤销它
这条是 Flash / Silverlight / AMP 都失败的根本原因。Flash 是 Adobe 一家的私有技术 ——Adobe 2017 年宣布 2020 年停更,2020 年浏览器集体禁用,Flash 死了8。Silverlight 是微软的,微软 2021 年停止支持,死了。AMP 是 Google 的,Google 一边推一边自己心虚,2021 年取消 AMP 在搜索结果里的特权,基本退场。
HTML 不会有这一天 ——它没有"一家所有者"。W3C 和 WHATWG 两家都不能单独说"我要废弃 HTML"。任何想替代它的方案都得说服两个标准组织 + 四个主流浏览器厂商 (Chromium/Webkit/Gecko/独立的) + 几亿开发者 ——这个游说成本无穷大。HTML 的"主流地位"不是某次胜利换来的,是"没有任何一家能集中决策杀掉它"的结构性结果。
HTML5 复活 ——一次教科书级别的翻盘
讲完为什么赢,回到时间线。WHATWG 2004 年另起炉灶之后,接下来 4-5 年很有意思 ——他们埋头干活,W3C 还在搞 XHTML 2。到 2007 年,W3C 抗不住了 ——业内主流浏览器都跟着 WHATWG 走,你 W3C 这边没人跟6。
2007 年 4 月,W3C 妥协 ——采纳 WHATWG 的 Web Applications 1.0 规范作为 HTML5 的起点8。这是一次彻底的认输。2008 年 1 月,HTML5 第一份公开草案出炉。2014 年 10 月,W3C 把 HTML5 定为 Recommendation 标准8。
HTML5 加的东西
HTML5 带来了 ——<video> 和 <audio> 标签 (这两个直接杀死了 Flash 的视频霸权)、<canvas> (2D 绘图)、<svg> 内嵌、Web Workers、IndexedDB、WebSocket、Geolocation、本地存储... 一整套让浏览器能跑"真正应用"的东西8。🟢 high
关键一点 ——HTML5 是向后兼容的。你 2003 年写的 HTML 4 网页,在 HTML5 浏览器里照样渲染。这跟 XHTML 2 的"清洁重写"路线刚好相反。这一刀切下去,HTML5 没有任何迁移成本 ——所有人立刻能用,所有现有页面继续工作。
Living Standard ——再也不发版本号了
2012 年 W3C 和 WHATWG 又一次正式分裂 ——W3C 想做"完整版"快照式发布,WHATWG 觉得"web 一直在变,根本没'完整版'"7。WHATWG 提出 Living Standard 概念 ——HTML 不再有"5.0""5.1""6.0"这种版本号,它是一份持续 living 的文档,持续更新,有问题就改,有新需求就加。
这个设计哲学到 2019 年终于胜利 ——W3C 和 WHATWG 5 月达成协议:WHATWG 的 Living Standard 是唯一权威的 HTML 规范,W3C 停止发自己的 HTML 版本8。🟢 high
你今天打开 html.spec.whatwg.org11——你看到的不是"HTML 5.3"或者"HTML 6",就是一份持续更新的规范。规范的标题字面就叫 HTML — Living Standard。这事儿在 2014 年之前是不可想象的 ——以前所有大规范都有版本号、有 Recommendation 状态。HTML 第一次抛弃了"软件版本管理"这个工业惯例,把自己变成了"持续演化的生命体"。这个设计选择,本身就说明 HTML 已经从"一项技术"演化成"一项基础设施"——基础设施不发版本,基础设施只是持续运行。
今天的位置 ——React 之下的底层
你说 2026 年 HTML 还重要吗?表面上看 ——前端开发都用 React / Vue / Svelte 这种 SPA 框架,大家写的是 JSX 不是 HTML。但你扒到底层,所有这些框架最终都吐出 HTML。React 不是 HTML 的替代,是 HTML 的生成器。这一点很多人没看清。
React 跟 HTML 是什么关系
| 层 | 内容 | 趋势 |
|---|---|---|
| 开发者写 | JSX / TSX | 各种框架轮流主导 |
| 编译输出 | JavaScript + HTML 字符串 | 稳定 |
| 浏览器接收 | HTML + JS | 稳定 30 年 |
| 浏览器渲染 | DOM 树 (HTML 解析后) | 稳定 30 年 |
看出门道没?开发者写的东西每 5 年换一茬,但浏览器收的东西从 1995 年到 2026 年没怎么变。这就是 HTML 的厉害 ——它沉到了 web 的物理底层,变成了所有上层框架共同的输出格式12。
Web Components ——HTML 的反扑
2020 年代有一个趋势值得注意 ——Web Components。这是 HTML 标准自带的"组件化"机制 ——你可以用纯 HTML + 浏览器原生 API 写 <my-button> 这样的自定义组件,不需要 React/Vue12。
这事儿目前还没占主流,但有些场景已经开始往这边走 ——比如设计系统 (Adobe Spectrum、Microsoft Fluent),想跨 React/Vue/Angular 用一套组件,Web Components 是天然选择。Evil Martians 2024 年报道过一个真实迁移案例 ——把一个 React 应用迁到原生 Web Components,JavaScript 包减了 100 KB,功能没损失12。
HTML 当年是"几个简单标签",今天进化成"扩展机制"——你可以用 Custom Elements 定义新标签,实际上把 HTML 变成了"可扩展的呈现层 DSL"。这一进化路径,等于把"框架层做的事儿"慢慢吸收进 HTML 自己。HTML 不跟 React 直接竞争,但它在底层悄悄长出 React 的能力。30 年下来,HTML 不光没死,反而把对手的能力都吃进来了。这才是真正的"沉底基础设施"该有的样子。
HTML 经历了什么,为什么赢
把整篇压成几段直接回答你那两个问题。
HTML 经历了什么变化 ——四个阶段。1989-1995 起源 ——Tim Berners-Lee 在 CERN 为分享物理论文写了 18 个标签。1995-1999 浏览器大战 ——Netscape / IE 互相加专属标签 (blink / marquee 这种),开发者头大,最后两家私下交易共同撤回。2000-2008 XHTML 2 失败 ——W3C 想推翻 HTML 重做"严谨版",八年下来没人跟,Berners-Lee 自己 2006 年公开认错。2004 年 WHATWG 跳出来另起炉灶,2007 年 W3C 妥协采纳,2014 年 HTML5 成 Recommendation,2019 年 W3C 彻底交出 HTML 主导权给 WHATWG,HTML 进入 Living Standard 时代,不再发版本号。
为什么成为主流 ——三条结构性原因叠加。第一条 向后兼容:W3C 自己的设计原则明文写"现有内容必须继续工作",1995 年的网页 2026 年还能开 ——这条 XHTML 2 没做到,所以 XHTML 2 死了。第二条 错语法宽容:任何人 5 分钟能写第一页,忘记闭合标签也能渲染,这种地板级入门门槛建了世界级网络效应。第三条 开放标准:没有单一所有者能撤销它,Flash / Silverlight / AMP 都败在这条 ——它们各自有厂商,厂商心意一变它们就死了,HTML 是没人能集中决策杀掉的那种基础设施。
更深一层 ——HTML 的"主流地位"不是某次"打赢"换来的,是"对手一个接一个出局"的累积结果。XHTML 死于不向后兼容,Flash 死于私有产权,Silverlight 死于厂商放弃,AMP 死于 Google 自己心虚,原生 app 优先论这两年也开始降温 (PWA 的兴起证明 web 没被取代)。每一次有人想替代 HTML,失败原因都不同;但 HTML 留下的原因都一样 ——它简单、宽松、不抛弃旧代码、没主子。这四条叠加,在 2026 年的条件下仍然无解。
今天 React / Vue 这些前端框架表面上风头盖过 HTML,但它们最终都吐出 HTML ——HTML 沉到 web 的物理底层,变成所有上层框架共同的输出格式。这是一项技术从"应用层"演化到"基础设施层"的标志。基础设施不发版本,基础设施只是持续运行。HTML 已经过了那条线。
一句话收 ——HTML 赢的不是技术先进,是它从不抛弃旧代码、地板级入门门槛、没有单一所有者三条结构性安排。每次有人想替代它,失败的方式各不同;HTML 留下的原因始终如一。
这些地方我说实话也没全把握
- "30 年前网页今天还能开"的强声明。这条主流是真的,但有边界 ——某些非常早期的特性 (frame、imagemap、Java applet) 已经事实上不工作。所以严格说是"绝大多数 90 年代静态 HTML 仍能开",不是"所有"。🟡 med
- "Web Components 反扑"这条趋势的强度。我看到的证据多数是 anecdotal——某家公司迁了某个项目省了多少 KB。整个生态层面是不是真的在从 React-only 走向"框架 + Web Components 混用",目前数据不够 robust,2026 年的判断只是 informed guess。🔴 low
- "基础设施层"这个说法本身偏隐喻。HTML 沉到底层 ——这是我用来组织叙事的 framing,不是 IEEE 标准里有的术语。如果你说"HTML 也只是一种格式,跟 JSON 没差",这话也能成立。本讲稿仍倾向"基础设施"这个说法,因为它强调"没人单独能改"的政治属性 ——而 JSON 是有 Crockford 这个明确发起人的。
- "原生 app 优先论降温" 这条判断。iOS / Android 应用商店的依然主流,2026 年说 PWA 重新崛起为时尚早。这一节里我把 PWA 推得稍微太乐观。这事儿我现在还没看透。🟡 med
- WHATWG 跟 W3C 的故事细节。2004 年成立 / 2007 年采纳 / 2012 年再次分裂 / 2019 年合一 ——这些时间点我引了多个二手源对照,但每一段内幕 (谁先妥协、谁施压) 是有不同叙述的,本讲稿用的是 W3C / WHATWG 官方文档跟 Wikipedia 的版本。
Sources
- W3C — The original proposal of the WWW, HTMLized (Tim Berners-Lee 1989 March proposal 原文) — https://www.w3.org/History/1989/proposal.html
- CERN — A short history of the Web (含 Mike Sendall "vague but exciting" 的批语原话) — https://home.cern/science/computing/birth-web/short-history-web
- Wikipedia — Tim Berners-Lee (HTML/URL/HTTP 三件套 1991 年 NeXT 工作站) — https://en.wikipedia.org/wiki/Tim_Berners-Lee
- Wikipedia — Browser wars (第一次浏览器大战 1995-2001) — https://en.wikipedia.org/wiki/Browser_wars
- The History of the Web — The HTML Tags Everybody Hated (blink/marquee 故事 + 1996 年私下交易) — https://thehistoryoftheweb.com/blink-marquis-tag/
- HTML5 For Web Designers (Jeremy Keith) — Chapter 1: A Brief History of Markup — https://html5forwebdesigners.com/history/
- The History of the Web — A Tale of Two Standards (WHATWG 2004 成立、Berners-Lee 2006 认错、Living Standard 2012 分裂) — https://thehistoryoftheweb.com/when-standards-divide/
- Beebom — What is HTML5 and Why Has it Replaced Flash and Silverlight (HTML5 vs Flash 的死因) — https://beebom.com/what-is-html5/
- W3C — HTML Design Principles (含 "Existing content should continue to work" 原文) — https://www.w3.org/TR/html-design-principles/
- Furkan Baytekin — Don't Break the Web: Backward Compatibility and Web Standards — https://furkanbaytekin.dev/blogs/dont-break-the-web-backward-compatibility-and-web-standards
- WHATWG — HTML Living Standard (持续更新的官方规范) — https://html.spec.whatwg.org/multipage/
- DEV Community — The Modern 2025 Web Components Tech Stack (Web Components 的反扑) — https://dev.to/matsuuu/the-modern-2025-web-components-tech-stack-1l00