От Rust к WASM с wasm-pack и React
Скомпилируйте код Rust в WebAssembly с помощью wasm-pack и используйте созданные JS-привязки в приложении React
«От Rust к WASM с wasm-pack и React» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Инструменты Rust для WASM
Стандартный процесс преобразования Rust в WASM использует два инструмента: wasm-pack координирует сборку — компилирует Rust в WASM, запускает wasm-bindgen и создаёт пакет npm, — а wasm-bindgen генерирует привязки JavaScript, благодаря которым функции Rust можно вызывать как обычные функции JavaScript с корректной обработкой типов.
Атрибут wasm-bindgen
Атрибут #[wasm_bindgen] помечает функции, структуры и методы Rust для экспорта в JavaScript. Без него функция компилируется в WASM, но остаётся недоступной из JavaScript. Если вы помечаете функцию атрибутом #[wasm_bindgen], wasm-bindgen создаёт связующий код JavaScript, который обрабатывает преобразование аргументов и возвращаемых значений.
Простая функция Rust
Минимальная экспортируемая функция Rust: use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn add(a: u32, b: u32) -> u32 { a + b }. Функция принимает два беззнаковых 32-разрядных целых числа и возвращает одно число. wasm-bindgen генерирует JavaScript-код, который вызывает эту функцию с числовыми аргументами и возвращает числовой результат.
Сборка с помощью wasm-pack
Выполните wasm-pack build --target web в каталоге пакета Rust. Эта команда компилирует код Rust в WASM, запускает wasm-bindgen для генерации привязок JavaScript и создаёт каталог pkg/, содержащий двоичный файл .wasm, связующий модуль JavaScript и определения типов TypeScript.
Импорт в React
Импортируйте сгенерированный модуль в компонент React: import init, { add } from '../pkg/my_lib'. Функция init загружает и инициализирует двоичный файл WASM; вызовите её один раз в useEffect. После инициализации вызывайте экспортированные функции напрямую: const result = add(2, 3).
Передача сложных данных: js_sys и JsValue
Для сложных данных, выходящих за пределы примитивных чисел, wasm-bindgen предоставляет js_sys::Array (массив JavaScript), js_sys::Object (объект JavaScript) и wasm_bindgen::JsValue (любое значение JavaScript). Эти типы позволяют функциям Rust принимать и возвращать массивы и объекты JavaScript, хотя требуют больше накладных расходов на сериализацию, чем примитивные типы.
Минимизация накладных расходов на маршаллинг
Ключевой принцип производительности: храните данные в памяти WASM и выполняйте все вычисления там. Передайте данные один раз, выполните вычисления и верните только итоговый результат. Избегайте подходов, при которых данные для каждого шага многократно передаются через границу WASM. Накладные расходы на один переход через границу невелики, но в циклах с большим числом итераций они накапливаются.
serde-wasm-bindgen для структур
Пакет serde-wasm-bindgen позволяет сериализовать структуры Rust в объекты JavaScript и обратно с помощью Serde. Пометьте структуру атрибутом #[derive(Serialize, Deserialize)] и используйте serde_wasm_bindgen::to_value() и from_value(). Это стандартный способ передачи сложных структурированных данных.
Запуск WASM в веб-воркере
Длительные вычисления WASM блокируют поток, в котором они выполняются. Разместите WASM в веб-воркере, чтобы основной поток React оставался свободным. Создайте файл веб-воркера, который инициализирует модуль WASM и обрабатывает сообщения. Отправляйте данные воркеру через postMessage, получайте результаты через событие message, а затем обновляйте состояние React полученным результатом.
Типы TypeScript из wasm-pack
wasm-pack автоматически создаёт файлы объявлений TypeScript (.d.ts) для всех экспортируемых функций и типов. Благодаря этому проект React на TypeScript получает полную типобезопасность при вызове функций Rust. Сгенерированные типы соответствуют сигнатурам функций Rust — add(a: number, b: number): number, — поэтому автодополнение в среде разработки работает корректно.
Рекомендации для рабочего окружения
После оптимизации двоичные файлы WASM обычно занимают от 100 КБ до 2 МБ. Включите wasm-opt при сборке wasm-pack, задав opt-level = "z" в профиле release файла Cargo.toml для агрессивной оптимизации размера. Передавайте файлы WASM с заголовком Content-Type: application/wasm и включите HTTP/2, чтобы браузер эффективно загружал двоичный файл потоком.
Атрибут wasm-bindgen
Каково назначение атрибута #[wasm_bindgen] в коде Rust?
Итоги урока
wasm-pack build --target web компилирует Rust в WASM и генерирует привязки JavaScript с помощью wasm-bindgen. Помечайте экспортируемые функции атрибутом #[wasm_bindgen]. Импортируйте init и экспортируемые функции в React, вызывайте init() в useEffect, а затем вызывайте функции как обычные функции JavaScript. Используйте serde-wasm-bindgen для сериализации сложных структур. Запускайте WASM в веб-воркерах при длительных вычислениях, чтобы основной поток React оставался свободным.
Часто задаваемые вопросы
Урок «От Rust к WASM с wasm-pack и React» бесплатный?
Да — полный текст урока «От Rust к WASM с wasm-pack и React» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «От Rust к WASM с wasm-pack и React»?
Скомпилируйте код Rust в WebAssembly с помощью wasm-pack и используйте созданные JS-привязки в приложении React Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «От Rust к WASM с wasm-pack и React»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое WebAssembly и какое место занимает React
- Загрузка модулей WASM в React
- От Rust к WASM с wasm-pack и React
- Сценарии применения WASM: обработка изображений и вычисления