Parcel рассматривает WebAssembly как полноценный тип модуля наряду с
JavaScript, CSS и изображениями. .wasm-файлы попадают в
граф зависимостей и обрабатываются через систему трансформаций и
кэширования, что позволяет включать бинарные модули без ручной настройки
загрузчиков.
WebAssembly в Parcel работает через унифицированный механизм ресурсов: файл анализируется, оптимизируется, получает хешированное имя и помещается в итоговый бандл как отдельный ассет. На этапе выполнения он загружается через стандартный WebAssembly API или через обёртки, генерируемые сборщиком.
.wasm как модуляParcel поддерживает прямой импорт WebAssembly-модулей:
import wasmUrl from "./module.wasm";
В этом случае результатом импорта становится URL до собранного
.wasm-файла. Такой подход используется, когда требуется
вручную управлять загрузкой:
const response = await fetch(wasmUrl);
const buffer = await response.arrayBuffer();
const module = await WebAssembly.instantiate(buffer, importObject);
export const instance = module.instance;
Parcel при этом выполняет:
.wasm в выходной каталогВозможен импорт, при котором Parcel генерирует готовую инициализацию модуля:
import init, { add } from "./math.wasm";
await init();
console.log(add(2, 3));
В таком режиме сборщик:
WebAssembly.instantiateStreaming, если поддерживаетсяТакой вариант характерен для модулей, собранных через Rust (wasm-bindgen) или AssemblyScript.
URL importParcel позволяет работать с WebAssembly как с ассетом:
import wasmURL from "./module.wasm?url";
Поведение:
Этот вариант применяется при необходимости:
WebAssembly может быть загружен через import():
const wasmModule = await import("./module.wasm");
await wasmModule.default();
Parcel в этом случае:
Динамическая загрузка особенно эффективна для:
Наиболее распространённый сценарий — использование Rust через
wasm-pack. Parcel корректно обрабатывает выходные
артефакты:
import init, { calculate } from "./pkg/math_bg.wasm";
await init();
console.log(calculate(10));
Структура пакета обычно включает:
.wasm бинарник.d.ts (в TypeScript проектах)Parcel сохраняет связность этих файлов и не разрывает их при бандлинге.
WebAssembly в Parcel не абстрагирует модель памяти. Передача данных остаётся явной:
const arr = new Uint32Array(instance.exports.memory.buffer);
arr[0] = 42;
const result = instance.exports.process(0);
Особенности:
WebAssembly.MemoryParcel использует возможности браузера:
WebAssembly.instantiateStreaming — при загрузке через
HTTPArrayBuffer при несовместимостиУсловная схема:
const module = await WebAssembly.instantiateStreaming(fetch(url));
При этом Parcel гарантирует:
application/wasm)WASM часто используется внутри Web Workers:
// worker.js
import wasmURL from "./compute.wasm";
const module = await WebAssembly.instantiateStreaming(fetch(wasmURL));
Parcel обеспечивает:
Сценарии применения:
Parcel включает WebAssembly в систему контент-хеширования:
.wasm получает уникальное имя вида
module.8f3a1c.wasmЭто снижает:
Основные категории ошибок:
Возникают при:
WebAssembly.instantiateStreaming(fetch(url))
Причины:
Parcel не скрывает ошибки, но сохраняет stack trace и source mapping для JS-обвязки.
Поддержка WebAssembly в Parcel ориентирована на современные среды:
Ограничения проявляются в:
WebAssembly глобального объектаWebAssembly в Parcel интегрируется с ESM-моделью:
.wasm рассматривается как модульПример цепочки зависимостей:
main.js
└── compute.wasm
└── memory import object
Parcel строит единый dependency graph, где WASM не является изолированным ресурсом, а частью модульной системы приложения.