#优质博文 #前端 #CSS #浏览器 #标准
质量很高的文章,推荐阅读。
HTML is Dead, Long Live HTML
author Steven Wittens
质量很高的文章,推荐阅读。
HTML is Dead, Long Live HTML
AI 摘要:作者系统性批判当代 Web 前端栈:DOM 与 HTML 停滞且臃肿、CSS 默认“自内向外”的布局心智与现代应用需求脱节,SVG 与 CSS 相互羡慕却难以统一;“HTML in Canvas”方向治标不治本。作者主张打开更低层的布局、文本与渲染原语,重构视图树与渲染树,以更小更清晰的数据模型拥抱多线程、多来源与异步的新时代,WebGPU 等新基建可成为更简洁的 UI 基元。
1. DOM/HTML 的困境与技术债
• DOM 膨胀失控:仅 Chrome 的 document.body 就有 350+ 键,style 内还有 660 个 CSS 属性;属性/方法边界模糊,部分 getter 触发布局抖动,遗留 onevent 成堆。
• 字符串类型负担:源自 SGML/XML 的“stringly typed”设计让 Web Components 等原生组件 API 笨重,Shadow DOM 引入额外嵌套/作用域,生态接受度低。
• 语义 HTML 的失约:十多年无实质演进,ARIA 兜底本应由语义标签承担的职责;常见结构(如 thread/comment)缺位,WHATWG 更多是边角“本轮加一圈”而非愿景驱动。
• 可编辑性鸡肋:contentEditable 实用化困难重重,富文本编辑器团队“血泪史”常谈。
• 应用现实的“拼装学”:为了做应用 UI,团队被迫以 HTML/CSS/SVG 套娃,承担滚动吸底、虚拟化列表/表格、右键菜单、查找等重复造轮子;UI 与“流式内容”的早期融合如今反成负担。
2. CSS 的本质:自外向内 vs 自内向外
• 正确心智模型:CSS 本质是“两次约束传播”——先自外向内分配可用空间,再自内向外回收实际尺寸;默认是文档导向的“自内向外”,需要手动从 body{height: 100%} 开始把约束往下传,所以“垂直对齐难”并非错觉。
• Flex 的代价与补药:Flex 通过测“自然尺寸”再伸缩,导致递归式“猜测布局”;深度嵌套和未知内容可能引发不可预期放大。可用 contain: size、明确 flex-basis、will-change 等打断全局约束,避免连锁反应。
• API 设计反思:理想的布局系统应把“容器行为”(自外向内)与“放置模型”(自内向外)作为可组合的正交维度提供,而非在单一语法下不断加“抑制/隔离”开关。
3. “好部分”与跨模型错配
• 可用但不优雅:Flexbox、Grid 在理解边界条件后“够用”,但语法“很 CSS”;若从零设计,不会做成今天这种减法式 API。
• 两种系统被硬绑:CSS 同时承担“文本样式的继承系统”和“盒模型布局系统”,前者需继承(如字体),后者主要是包含关系,级联语义不一致,合在一起是历史事故。
• 单位与像素:相对 em 的早期理念已式微,逻辑像素 vs 设备像素更符合用户预期。
• 与 SVG 的“互相羡慕”:SVG 既非 CSS 子集也非超集,变换模型等细节不同;CSS 想要曲线、遮罩、渐变、滤镜,却远不如 SVG 强;开发者在 HTML/CSS 与 SVG 间反复取舍。
• 三个“卡点范例”:
• 文本省略号 text-ellipsis 仅能裁单行不换行文本,段落裁切/检测截断与文本测量 API 皆孱弱。
• 粘性定位 position: sticky 想实现“无条件吸附”需多层荒诞嵌套,本应易如反掌。
• z-index 战争:绝对层级导致“+1/-1 拼数值”,缺少相对 Z 定位的语义。
4. “HTML in Canvas”的误区
• 设计目标错位:为“可编程渲染”而把 HTML 绘进 canvas,结果依旧被 DOM 裹挟(需作为 <canvas> 子树参与布局/样式/无障碍),离真正的可编程 UI 还很远。
• 交互负担转嫁:为了自定义外观,被迫全权接管命中测试 (hit-testing) 与事件,且仅有 2D 命中测试;在已有 CSS 3D 变换环境下显得荒诞。
• Reactivity 风险:让 canvas 回写/观察同一文档树,带来循环依赖与观察者复杂度。
• 文本与字体的“原罪”:Canvas 缺少系统字体、文本布局 API、Unicode 分词/换行等基础能力——真正的难题没有开放正确的底层原语。
• 本质诉求:不是“把 DOM 截图画出来”,而是要打开文本测量、命中测试、可编程布局、统一滤镜/着色器等低层 API;用 DOM 当黑盒无法解决 1990 年代 UI 水平的缺口。
5. 向下开口:重塑视图树与渲染树
• 方向样例:Use.GPU 的“类 HTML 渲染器”在 WebGPU 上实现 X/Y Flex,垂直居中与定位直观,无语义 HTML 或级联,仅“一级公民”的布局;给“div”挂着色器,90% DOM 功能以少量清晰原语重做可达。
• 核心问题重问:视图树应长什么样?如何降解成渲染树?当下是如何被“历史包袱”强行降解的?
• 新引擎机会:Servo、Ladybird 等新浏览器实现轻装上阵,更适合提出新提案;大厂亦可为之,但“品味与自小做起”的工程哲学重要。
• 进程/线程与安全现实:因 Spectre 等 CPU 攻击,SharedArrayBuffer 与 Web Worker 的多线程之路受阻;DOM 若重塑,可与多进程、跨来源隔离、结构化并发、所有权语义、函数式效果 (FP effects) 等现代模型同频共振。
• 最小第一步:以更小更干净的数据模型替换当前“每节点 350+ 属性”的怪物;别误以为问题不可解,关键在于抽丝剥茧、回到正确的内核抽象。
AI 摘要仅供参考和导读和索引,其中可能有失实部分,推荐自行阅读原文。
author Steven Wittens