外部classic 脚本为parser-blocking,也就是说,在继续解析文档的其余部分之前,HTML解析器将等待脚本执行.
<script src="data:text/javascript,console.log(document.body.children[document.body.children.length - 1].nodeName);"></script>
<span>Should log SCRIPT and not SPAN</span>
但要达到render-blocking岁,他们必须在文件的第<head>
位.
/*
* Since StackSnippets do wrap the HTML & JS content in the <body>,
* we use another <iframe> for our demo.
* But StackSnippet's console isn't available there,
* so we use postMessage and log from here.
*/
onmessage = ({data}) => console.log(...data);
<iframe srcdoc="
<!DOCTYPE HTML>
<html>
<head>
<script>
requestAnimationFrame(function animate(time) {
parent.postMessage(['RAF', performance.now()], '*');
});
</script>
<script src='./script'></script>
<script>
parent.postMessage(['SCRIPT EXECUTED'], '*')
</script>
</head>
<body>
<h1>HELLO WORLD</h1>
</body>
</html>"></iframe>
请注意,Firefox显然还不支持render-blocking.
此外,您可能会对blocking="render"
属性感兴趣,该属性允许<script>
在为render-blocking时不被解析器阻塞(defer
、async
或module
),尽管这目前仅对外部脚本可用,但在不久的将来是this might change.
onmessage = ({data}) => console.log(...data);
/* In Chrome this logs
* SCRIPT EXECUTED
* H1
* "RAF", a number
*/
<iframe srcdoc="
<!DOCTYPE HTML>
<html>
<head>
<script>
requestAnimationFrame(function animate(time) {
parent.postMessage(['RAF', performance.now()], '*');
});
</script>
<script defer src='data:text/javascript,parent.postMessage([document.body.children[document.body.children.length - 1].nodeName], `*`);'></script>
<script>
parent.postMessage(['SCRIPT EXECUTED'], '*')
</script>
<head>
<body>
<h1>HELLO WORLD</h1>
</body>
</html>"></iframe>