Зачем конвертировать WASM в JS?
Бинарный файл .wasm не может запускаться на странице сам по себе - браузеры загружают его через JavaScript. Пользователям нужен файл .js, чтобы импортировать модуль, передавать импорты и вызывать экспортируемые функции как обычные функции. Инструментарии создают эту прослойку автоматически, поэтому вам редко приходится писать код загрузки вручную.
Способы конвертации WASM в JS
Вывод прослойки Emscripten OPEN-SOURCE
При компиляции C/C++ выполните emcc app.c -o app.js, и Emscripten создаст как app.wasm, так и загрузчик app.js, который его инициализирует. Добавьте -s MODULARIZE=1 для создания импортируемого модуля.
wasm-pack для Rust OPEN-SOURCE
Для связки Rust + wasm-bindgen выполните wasm-pack build --target web; это создаст .wasm и файл привязок .js, который реэкспортирует каждую функцию. Импортируйте его в свое приложение с помощью init().
Об этих форматах
Файл .wasm содержит скомпилированный модуль WebAssembly: переносимый бинарный байт-код, созданный из таких языков, как C, C++ или Rust, и работающий со скоростью, близкой к нативной.…
Открыть детали .WASM →A JS file is a JavaScript source code file - plain, readable text that powers web page interactivity and server-side apps via Node.js. Open it in any code editor such as VS Code or…
Открыть детали .JS →Качество и на что обратить внимание
- Файл
.jsне содержит логику модуля - он только загружает и связывает.wasm, который должен поставляться вместе с ним. - Написанные вручную загрузчики должны предоставлять именно тот объект импортов, который ожидает модуль, иначе инициализация вызовет LinkError.
- Прослойка Emscripten/wasm-bindgen привязана к конкретной сборке, создавшей
.wasm; смешивание версий нарушает работу привязок.
Часто задаваемые вопросы
Можно ли полностью превратить WASM обратно в читаемый JavaScript?
Нужен ли мне файл .wasm после создания .js?
.js загружает и инициализирует .wasm во время выполнения; оба файла должны развертываться вместе.Какой флаг target должен использовать wasm-pack?
--target web для нативных ES-модулей, --target bundler для webpack/Vite, --target nodejs для Node.