Асинхронные скрипты для asm.js

Каждая средняя или большая игра должна компилировать код 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 делает этот скрипт асинхронным.