【发布时间】:2017-12-14 09:28:53
【问题描述】:
我有以下 HTML 文件:
<html>
<body>
<script>
const first = document.createElement("script");
first.setAttribute("src", "./remote.js");
first.async = false;
const second = document.createElement("script");
second.appendChild(document.createTextNode(`console.log("second");`));
document.body.appendChild(first);
document.body.appendChild(second);
</script>
</body>
</html>
remote.js的内容是
console.log("first");
控制台输出是
second
first
我希望在第二个脚本之前完成第一个脚本。
这是对更复杂的代码的简化,性能对其至关重要。因此,虽然我知道我可以使用document.write,或者注册到first.onload,然后才附加第二个脚本。两者都有我想避免的性能问题。
【问题讨论】:
-
您认为
first.onload的问题是什么?特别是如果它不是外部脚本,而是您想要在脚本加载后执行的一些代码? -
如果您只是想让脚本运行,那没有什么问题。但是,尽早将脚本添加到 DOM 允许脚本流线程更早地解析脚本。见blog.chromium.org/2015/03/…
-
但是您不想运行另一个必须在 remote.js 之后加载的脚本,您有内联代码吗?
-
不确定我是否理解这个问题;目标是在不更改加载顺序的情况下以最佳性能加载脚本。因此,脚本首先需要先运行,第二个应该在第一个完成后立即运行。
-
我是说你没有第二个脚本可以加载。您有一个加载远程脚本的内联脚本,并包含在远程脚本完成时应该运行的代码。没有充分的理由为此创建第三个
<script>元素。
标签: javascript html performance browser