--- title: Асинхронные скрипты для asm.js slug: Games/Techniques/Async_scripts tags: - Games - JavaScript - asm.js - async translation_of: Games/Techniques/Async_scripts ---
Каждая средняя или большая игра должна компилировать код asm.js как часть асинхронного скрипта, чтобы дать браузеру максимальную гибкость для оптимизации процесса компиляции. В Gecko асинхронная компиляция позволяет движку JavaScript компилировать asm.js из основного потока когда игра загружается, и кэшировать сгенерированный машинный код, так что игру не нужно компилировать при последующих загрузках (начиная с Firefox 28) , Чтобы увидеть разницу, переключите javascript.options.parallel_parsing
в about:config
.
Получить асинхронную компиляцию легко: при написании JavaScript просто используйте async
атрибут следующим образом:
<script async src="file.js"></script>
или, чтобы сделать то же самое через скрипт:
var script = document.createElement('script');
script.src = "file.js";
document.body.appendChild(script);
(скрипты создаются из скрипта по умолчанию async
.) Стандартная оболочка HTML, которую генерирует Emscripten, создает последнее.
Две распространенные ситуации, в которых сценарий * не * асинхронен (как определено спецификацией HTML ):
<script async>code</script>
а также
var script = document.createElement('script');
script.innerHTML = "code";
document.body.appendChild(script);
Оба считаются «встроенными» скриптами, компилируются и запускаются сразу
Что если ваш код находится в строке JS? Вместо использования eval
или innerHTML
, оба из которых запускают синхронную компиляцию, вы должны использовать BLOB-объект с URL объекта:
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);
Настройка src
вместо настройки innerHTML
делает этот скрипт асинхронным.