这是过去十年里,HTML 最值得关注的一次升级。

不是新增一个标签,也不是补一个属性,而是 HTML 可能要开始接管一件原本属于 JavaScript 的事:

页面局部更新。

图片

如果这个能力真正落地,很多前端页面的写法都会变。

以前我们默认:

页面动起来 = JavaScript 接管
数据更新 = fetch 请求
局部刷新 = DOM patch

但这次不一样。

浏览器正在尝试让 HTML 自己完成局部更新:服务端直接流式输出 HTML 片段,浏览器收到后自动把内容补到页面指定位置。

不用 fetch()

不用 querySelector()

不用 innerHTML

甚至不需要额外的客户端 runtime

这就是 Chrome 正在推进的新能力:

Declarative Partial Updates

中文可以叫:声明式局部更新。

它听起来像是一个小语法提案,但背后其实是一个很大的方向变化:

HTML 不再只是首屏外壳,它开始重新参与 UI 更新。

以前更新页面,到底有多绕?

举个最常见的场景。

一个订单详情页,要更新支付状态。

图片

以前基本是这套流程:

服务端查数据库
↓
返回 JSON
↓
前端 fetch()
↓
JS 解析数据
↓
查找 DOM
↓
手动更新页面

代码大概长这样:

const res = await fetch('/api/order/status');
const data = await res.json();

document.querySelector('

#status

').innerHTML = `
  <strong>${data.status}</strong>
  <span>${data.time}</span>
`;

这段代码当然能跑。

但问题是:只是为了更新一小块 HTML,却绕了一整圈。

数据在服务端。

HTML 也可以由服务端生成。

最后却要先变成 JSON,再交给 JavaScript 拼回 HTML

这就是过去很多 Web 页面变重的原因。

不是业务本身复杂,而是页面更新链路被拉长了。

新方式:服务端直接发 HTML patch

Declarative Partial Updates 的思路很直接:

页面先返回骨架,慢数据后面再补。

比如一开始先输出一个占位区域:

<section>
  <h2>订单状态</h2>

  <?start name="order-status">
    <p>查询中...</p>
  <?end>
</section>

这里的 <?start> 和 <?end> 可以理解成一个可更新区域。

浏览器先把 查询中... 渲染出来,用户不用等所有数据准备完。

等服务端查完支付状态之后,不需要前端再发请求,而是在同一个 HTML 响应流里继续输出:

<template for="order-status">
  <p><strong>已支付</strong></p>
  <p>支付时间:10:32</p>
</template>

浏览器解析到:

<template for="order-status">

就会自动找到前面叫 order-status 的区域,然后把占位内容替换掉。

核心变化就一句话:

以前:服务端 → JSON → JavaScript → DOM
现在:服务端 → HTML patch → 浏览器自动更新

这条路径短了很多。

这也是它真正炸的地方。

它不是多发一次请求

很多人看到“服务端继续发内容”,第一反应会想到:

SSE?
WebSocket?
HTTP/2 Server Push?
轮询?

都不是。

它本质上还是一次普通的 HTML 请求。

一个 request
一个 response
HTML 响应体持续流式输出
浏览器边接收边解析边 patch

服务端先把页面骨架 flush 给浏览器。

后面哪个模块数据准备好了,就继续往这个响应里写对应的 HTML 片段。

浏览器收到后,自动把内容补到指定区域。

重点不是“实时通信”。

重点是:HTML 文档本身开始支持后续 patch。

这是 HTML 交付方式的升级。

真正狠的是:乱序流式更新

真实业务里,一个页面慢,通常不是所有内容都慢,而是几个模块拖后腿。

比如一个后台详情页:

基础信息:很快
支付状态:一般
风控结果:较慢
操作日志:最慢

以前你只有两个选择。

要么服务端等全部数据查完再返回,首屏变慢。

要么前端拆成多个接口,自己维护一堆 loading、错误状态、重试逻辑、DOM 更新。

Declarative Partial Updates 给了第三种方式:

页面先出来,模块谁先准备好,谁先补上。

页面骨架可以先这样返回:

<section>
  <h2>支付状态</h2>
  <?start name="payment">
    <p>支付状态加载中...</p>
  <?end>
</section>

<section>
  <h2>风控结果</h2>
  <?start name="risk">
    <p>风控结果加载中...</p>
  <?end>
</section>

如果风控先完成,服务端先发:

<template for="risk">
  <p><strong>低风险</strong></p>
  <p>已通过自动审核</p>
</template>

如果支付后完成,再继续发:

<template for="payment">
  <p><strong>已支付</strong></p>
  <p>交易号:TXN-2026-001</p>
</template>

浏览器会把它们分别 patch 到正确位置。

这意味着:

慢模块不再拖死整页。

用户先看到页面结构,然后内容一块一块长出来。

对于后台详情页订单页商品页评论区搜索结果页文档导航CMS 模块,这个能力非常实用。

这些场景很多时候并不需要完整客户端应用。

它们只是需要服务端把 HTML 片段补上。

会不会成为框架杀手

这个能力没必要理解成“哪个框架要被替代”。

前端框架解决的是一整套工程问题:组件组织状态管理路由构建复用复杂交互团队协作

这些不是一个 HTML 提案能直接吃掉的。

Declarative Partial Updates 真正改变的是另一件事:

过去很多页面局部更新能力,是框架和库在替浏览器补课。

服务端明明已经生成了一段 HTML

但浏览器不知道这段 HTML 应该更新到哪里。

于是开发者只能写 JS 去请求定位替换,或者引入额外运行时来完成这件事。

现在这个提案想把这条路径缩短:

HTML 声明更新位置
template 携带更新内容
浏览器原生完成 patch

这不会让复杂前端消失。

但会吃掉一部分纯胶水代码。

尤其是那些只是为了“把服务端内容塞回页面”的代码。

还有一个能力已经落地

这不是浏览器第一次把能力还给 HTML

另一个已经落地的能力叫:

Declarative Shadow DOM

以前创建 Shadow DOM,需要写 JavaScript

element.attachShadow({ mode: 'open' });

现在可以直接写 HTML

<price-card>
  <template shadowrootmode="open">
    <style>
      .price {
        font-weight: bold;
        font-size: 20px;
      }
    </style>

    <slot name="price"></slot>
  </template>

  <span slot="price">¥199</span>
</price-card>

浏览器会直接解析这个 template,并创建对应的 Shadow Root

这件事的意义不只是少写几行 JS

它说明一个趋势:

Declarative Shadow DOM:让组件封装回到 HTML
Declarative Partial Updates:让局部更新回到 HTML

一个解决组件结构。

一个解决内容更新。

最后

Declarative Partial Updates 最值得关注的地方,不是语法有多酷,而是它改变了一个底层假设:

页面更新不一定必须由 JavaScript 发起。

Declarative Partial Updates 现在还不能直接用于生产环境。

它目前仍处在开发者测试阶段,Chrome 可以通过实验性 Web Platform Features flag 开启测试。

未来趋势:浏览器平台一定会把一部分框架层能力,下沉到 HTML 标准里。

HTML 正在重新变强。

  • 相关链接https://developer.chrome.com/blog/declarative-partial-updates?hl=zh-cn
扫码领红包

微信赞赏支付宝扫码领红包

发表回复

后才能评论