asm.js 的异步脚本

上次我在游戏开发的博客提到了asm.js 的异步脚本,意思就是每个中型或大型游戏都应编译asm.js (en-US)代码作为异步脚本的一部分,以便浏览器能够最大限度地灵活地优化编译过程。在 Gecko 中,异步编译允许 JavaScript 引擎在游戏加载时缓存主线程的 asm.js,并缓存生成的机器代码,这样游戏就不需要在随后的加载中编译(从 Firefox 28 开始)。要查看差异,请切换javascript.options.parallel_parsing in about:config.

异步执行

获取异步编译非常简单:编写 JavaScript 时,只需使用 async 属性即可:

javascript 复制代码
<script async src="file.js"></script>

或者,通过脚本来做同样的事情:

javascript 复制代码
const script = document.createElement("script");
script.src = "file.js";
document.body.appendChild(script);

(从脚本中创建的脚本默认为异步。)默认的 HTML shell Emscripten 生成后者。

什么时候用 async 或者不用?

两种常见的情况下是脚本是 异步的(由HTML 规范定义)

javascript 复制代码
<script async>code();</script>

以及

javascript 复制代码
const script = document.createElement("script");
script.textContent = "code()";
document.body.appendChild(script);

两者都被视为"内联"脚本,阻塞其余所有任务,进行编译,编译完成后立即执行。

如果你的代码是一个 JS 字符串呢?你应该使用带有对象 URL(object URL)的 Blob 对象,而不是使用 evalinnerHTML,这两者都会触发同步编译:

javascript 复制代码
const blob = new Blob([codeString]);
const script = document.createElement("script");
const url = URL.createObjectURL(blob);
script.onload = script.onerror = () => URL.revokeObjectURL(url);
script.src = url;
document.body.appendChild(script);

使用src而不是innerHTML,则该脚本是异步的。

相关推荐
kyriewen7 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程
weedsfly10 小时前
迭代器、生成器与异步迭代——让数据“按需流动”的艺术
前端·javascript
假如让我当三天老蒯10 小时前
前端跨域解决方案(学习用)
前端·javascript·面试
铁皮饭盒12 小时前
Bun 哪比 Node.js 快?
javascript·后端
JieE21219 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
candyTong1 天前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
_柳青杨1 天前
深入理解 JavaScript 事件循环
前端·javascript
大家的林语冰1 天前
ES5 凉凉,Babel 8 正式发布,默认不再编译为 ES5 和 CJS......
前端·javascript·前端工程化
weedsfly1 天前
异步编程全景与事件循环——彻底搞懂 JS 执行机制
前端·javascript
用户1733598075371 天前
纯前端 PDF 数字签名实战:Vue 3 + pdf-lib 在浏览器里完成签名嵌入
前端·javascript