aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/games/techniques/async_scripts/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'files/zh-cn/games/techniques/async_scripts/index.html')
-rw-r--r--files/zh-cn/games/techniques/async_scripts/index.html49
1 files changed, 49 insertions, 0 deletions
diff --git a/files/zh-cn/games/techniques/async_scripts/index.html b/files/zh-cn/games/techniques/async_scripts/index.html
new file mode 100644
index 0000000000..2f34e0d144
--- /dev/null
+++ b/files/zh-cn/games/techniques/async_scripts/index.html
@@ -0,0 +1,49 @@
+---
+title: asm.js的异步脚本
+slug: Games/Techniques/Async_scripts
+translation_of: Games/Techniques/Async_scripts
+---
+<div>{{GamesSidebar}}</div><div>{{IncludeSubnav("/zh-CN/docs/Games")}}</div>
+
+<div class="summary">
+<p><span class="seoSummary">每个中型或大型游戏都应编译<a href="https://developer.mozilla.org/en-US/docs/Games/Tools/asm.js">asm.js</a>代码作为异步脚本的一部分,以便浏览器能够最大限度地灵活地优化编译过程。 在Gecko中,异步编译允许JavaScript引擎在游戏加载时缓存主线程的asm.js,并缓存生成的机器代码,这样游戏就不需要在随后的加载中编译(从Firefox 28开始)。 要查看差异,请切换<code>javascript.options.parallel_parsing</code> in <code>about:config</code>.</span></p>
+</div>
+
+<h2 id="异步执行">异步执行</h2>
+
+<p>获取异步编译非常简单:编写JavaScript时,只需使用<code>async</code>属性即可:</p>
+
+<pre class="brush: js">&lt;script async src="file.js"&gt;&lt;/script&gt;</pre>
+
+<p>或者,通过脚本来做同样的事情:</p>
+
+<pre class="brush: js">var script = document.createElement('script');
+script.src = "file.js";
+document.body.appendChild(script);</pre>
+
+<p>(从脚本中创建的脚本默认为异步。) 默认的HTML shell Emscripten生成后者。</p>
+
+<h2 id="什么时候用async或者不用">什么时候用async或者不用?</h2>
+
+<p>两种常见的情况下是脚本是<strong>非</strong>异步的(由<a href="https://www.w3.org/TR/html5/scripting-1.html">HTML规范</a>定义)</p>
+
+<pre class="brush: js">&lt;script async&gt;code&lt;/script&gt;</pre>
+
+<p>以及</p>
+
+<pre class="brush: js">var script = document.createElement('script');
+script.innerHTML = "code";
+document.body.appendChild(script);</pre>
+
+<p>两者都被视为“内联”脚本,阻塞其余所有任务,进行编译,编译完成后立即执行。</p>
+
+<p>如果你的代码是一个JS字符串呢? 而不是使用eval或innerHTML,这两者都会触发同步编译,您应该使用Blob和URL对象:</p>
+
+<pre class="brush: js">var blob = new Blob([codeString]);
+var script = document.createElement('script');
+var url = URL.createObjectURL(blob);
+script.onload = script.onerror = function() { URL.revokeObjectURL(url); };
+script.src = url;
+document.body.appendChild(script);</pre>
+
+<p>使用<code>src</code>而不是<code>innerHTML,则该</code>脚本是异步的。</p>