HTML有一条顽固的规则,悄悄塑造了前端架构十年:它按到达顺序渲染。如果你的页面第三部分需要一次慢速数据库查询,它后面的所有内容都得等待。常见的逃生通道都是妥协——缓冲整个响应放弃流式传输,用CSS重排破坏无障碍树,或者引入一个框架,其主要工作就是把服务器延迟变成客户端转圈。
Chrome 148带来了一个实验性答案,绕开了这三种妥协。在"声明式部分更新"(Declarative Partial Updates)的总称下,两个相关API让服务器可以先发送占位符、稍后再填充,也让JavaScript可以把标记流式注入元素,而不必等待完整字符串。目前这些功能位于 chrome://flags/#enable-experimental-web-platform-features 标志后面,npm上有polyfill,其他浏览器厂商也传出积极信号。
![]()
声明式部分:让处理指令重获新生
声明式这一半,复活了HTML自诞生以来一直忽略的东西:处理指令(processing instructions)。在XML中,它们携带元数据;在HTML中,它们一直被当作注释解析并丢弃。新API给了它们一份工作。
欢迎回来,Dan。
当解析器到达 时,它会找到匹配的 ,并将自己的内容替换进去。最终得到的DOM里既没有marker也没有template,只有那个段落。服务器在等待用户查询时,不必再扣住文档的其余部分。
还有一种范围形式(range form),这是你最常会用到的,因为它免费提供了一个加载状态:
加载中…
和 之间的所有内容会立即渲染,并在模板出现时被替换。更妙的是,模板可以重新发出一个marker,这就变成了追加循环。查询每产生一行,就流式发送一个 ,每个模板以 结尾,列表就会就地增长。不需要appendChild,不需要框架,不需要任何客户端JavaScript。
作用域规则:一个需要记住的限制
作用域规则是重要的限制: 只能修补其自身父元素内部的marker。这是有意为之,意味着放入 的模板可以覆盖整个文档,包括 。在从用户输入生成模板之前,这一点值得了解。
另一半解决的是我们大多数人已经不再注意的混乱。诚实地问自己:innerHTML、setHTML、setHTMLUnsafe、insertAdjacentHTML和createContextualFragment这五个API中,哪些会清理输入,哪些会执行
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.