我刚刚注意到在执行脚本之前渲染的奇怪行为。我一直认为,浏览器没有机会将任务从渲染队列中出列并在脚本标记之前执行它,因为这是单个线程。正如您将看到的,这不是真的。下面是一个简单的代码示例:
console.log('SCRIPT EXECUTED')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>HTML</title>
<script>
requestAnimationFrame(function animate(time) {
console.log('RAF', performance.now());
});
</script>
</head>
<body>
<h1>Hello world</h1>
<script src="./script.js"></script>
</body>
</html>
人们可能会在控制台中看到不一致的输出。有时渲染出现在脚本之前,反之亦然。例如,它可能会导致 UI 闪烁。
有人能对此给出有意义的解释吗?
无论是外部脚本还是内联脚本都没有关系 - 它们按照在页面中遇到的顺序执行。
输出不一致的最大罪魁祸首是方法
requestAnimationFrame()
。根据其文档,即使该脚本始终在script.js
之前运行,输出时间也将取决于许多其他因素,例如:
因此,这意味着即使您的脚本在后台以正确的顺序运行,渲染时间也会关闭,具体取决于浏览器对您的反应速度
requestAnimationFrame()
。