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,则该脚本是异步的。

相关推荐
北冥湖畔的燕雀1 小时前
C++泛型编程(函数模板以及类模板)
开发语言·c++
demi_meng3 小时前
reactNative 遇到的问题记录
javascript·react native·react.js
QX_hao3 小时前
【Go】--map和struct数据类型
开发语言·后端·golang
你好,我叫C小白3 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
千码君20163 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
Evand J5 小时前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
爱喝白开水a5 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway6 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康6 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼6 小时前
JavaWeb_p165部门管理
java·开发语言·前端