blocking="render" 在 <script> 上无效,非标准属性,主流浏览器均不支持;真正控制渲染阻塞需用同步脚本、defer、type="module"或动态插入等合法机制。

blocking="render" 在 <script> 上**不能用**,写了也无效——它不是标准属性,主流浏览器根本不识别。
Chrome/Firefox/Safari 都不支持 blocking 属性
截至 2026 年 8 月,blocking 属性未被 WHATWG 或 W3C 纳入 HTML 规范,MDN 上查不到文档,CanIUse 无任何支持数据。你在 DevTools 里检查元素,会发现该属性只是个普通自定义属性,浏览器完全忽略它。
- Chrome 127+、Firefox 128、Safari 17.5 均不解析
blocking,无论值是render还是其他字符串 - 所谓“
blocking="render"让模块脚本阻塞渲染”的说法,源于早期 Chromium 实验性 flag(如chrome://flags/#enable-blocking-attribute)的误传,从未进入稳定版 - 把
blocking="render"和fetchpriority="high"混着写,只会让 HTML 多出无意义的字符,还可能误导后续维护者
<script> 真正能控制渲染阻塞的合法方式
想让脚本影响渲染时机,必须用已被广泛实现的机制:
- 同步脚本(无
async/defer):默认阻塞 HTML 解析和渲染,<script src="a.js"></script>就是典型 -
defer:并行下载,DOM 解析完后、DOMContentLoaded前按顺序执行,**不阻塞渲染**,但保证执行时机可控 -
type="module":默认行为等同于defer,无需额外声明;若需强制同步阻塞,只能回退到传统内联脚本或手动插入 - 动态插入:
document.head.appendChild(script)创建的脚本默认不阻塞渲染,哪怕没加async
为什么有人以为 blocking="render" 有用
常见误解来源:
立即学习“前端免费学习笔记(深入)”;
- 把
<link rel="stylesheet">的天然阻塞行为,错误归因于加了blocking="render" - 混淆了实验性
<script blocking="render">(从未落地)和已存在的<link rel="preload" as="script">(只影响网络调度,不改变阻塞逻辑) - 看到构建工具模板里硬编码了该属性,误以为是“新最佳实践”,实则是遗留噪音
真正要优化首屏,盯住 DevTools Performance 面板里的 “Parse HTML” 和 “Layout” 阶段空白期,而不是往标签里塞一个浏览器根本不认的属性。



















