I've just noticed strange behaviour with rendering before script is being performed. I always thought, that there is no chance for browsers to dequeue a task from render queue and execute it before script tag, since this is a single thread. And as you will see, it's not true. There is a simple example of code below:
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>
One may see inconsistent output in console. Sometimes render comes up before script and vice versa. It may cause to flickering in UI for example.
Could anyone give a meaningful explanations of this?
External classic scripts are parser-blocking, i.e. the HTML parser will wait until the script's execution before continuing parsing the remaining of the document.
But to also be render-blocking, they need to be in the
<head>of the document.Note that Firefox apparently doesn't support render-blocking yet.
Also, you may be interested in the
blocking="render"attribute, which allows a<script>to not be parser blocking (defer,async, ormodule) while being render-blocking, though this is currently only available for external scripts, but this might change in the near future.