WebAssembly (WASM) представляет собой низкоуровневый бинарный формат, который позволяет выполнять код на веб-странице с почти нативной производительностью. Интеграция WASM с фреймворком Fresh открывает возможности для создания высокопроизводительных веб-приложений на JavaScript, используя модули, написанные на Rust, C или C++.
В Fresh подключение WASM выполняется через стандартный механизм ES-модулей. Основная последовательность действий:
Компиляция в WASM Rust-код компилируется в
формат .wasm с использованием wasm-pack или
cargo build --target wasm32-unknown-unknown. Важно
использовать флаги оптимизации (--release) для сокращения
размера бинарника.
Импорт модуля в проект Fresh После компиляции можно импортировать модуль как обычный ES-модуль:
import init, { add } from "../pkg/my_wasm_module.js";
await init();
console.log(add(5, 7));
Функция init загружает бинарник и инициализирует его в
окружении браузера. Остальные экспортированные функции становятся
доступными для вызова из JavaScript.
WASM работает только с примитивными типами данных (числа, строки через индексацию памяти). Для взаимодействия с DOM необходим JavaScript-прокси. Пример:
import init, { calculate } from "../pkg/math_wasm.js";
await init();
const input = document.getElementById("input").value;
const result = calculate(Number(input));
document.getElementById("output").textContent = result;
Здесь WASM выполняет тяжелые вычисления, а манипуляции с DOM остаются на стороне JavaScript. Такой подход обеспечивает высокую производительность без ограничения возможностей интерфейса.
Fresh поддерживает серверный рендеринг (SSR) с Deno. WASM-модули могут быть использованы и на сервере:
import init, { generate_hash } from "../pkg/hash_wasm.js";
await init();
export function handler(req) {
const data = new TextEncoder().encode("Fresh + WASM");
const hash = generate_hash(data);
return new Response(hash);
}
На сервере WASM ускоряет CPU-интенсивные операции, например хэширование, криптографию или обработку изображений, не блокируя основной поток событий.
WASM предоставляет доступ к линейной памяти через
WebAssembly.Memory. При интенсивном обмене данными с
JavaScript рекомендуется:
TypedArray для обмена бинарными
данными.Пример выделения буфера и передачи его в WASM:
const buffer = new Uint8Array(1024);
const ptr = wasmInstance.exports.allocate(buffer.length);
wasmInstance.memory.set(buffer, ptr);
wasmInstance.exports.process(ptr, buffer.length);
Эта техника позволяет избежать лишних аллокаций и повышает общую производительность приложения.
WASM-модули не поддерживают исключения JavaScript напрямую. Ошибки должны обрабатываться через коды возврата или через специальные экспортированные функции, возвращающие состояние выполнения:
#[wasm_bindgen]
pub fn divide(a: f64, b: f64) -> Result<f64, JsValue> {
if b == 0.0 {
Err(JsValue::from_str("Division by zero"))
} else {
Ok(a / b)
}
}
На стороне Jav * aScript:
try {
const result = divide(10, 0);
} catch (e) {
console.error(e);
}
Для интеграции с Fresh рекомендуется:
wasm-pack build --target web для
корректного экспорта в браузер.--release и
wasm-opt.const wasmModule = import("../pkg/module.js");
wasmModule.then(m => m.init());
Использование WASM в Fresh сочетает производительность нативного кода с современными возможностями веб-фреймворка, обеспечивая гибкую архитектуру для веб-приложений любого масштаба.