В последние годы WebAssembly (WASM) стал настоящей революцией в веб-разработке, позволяя запускать на клиентской стороне приложения, ранее ограниченные серверной средой или конкретными платформами. В этой статье мы рассмотрим, как можно запустить Ruby-фреймворк Hanami непосредственно в браузере с помощью WebAssembly, основываясь на опыте российского разработчика и энтузиаста программирования, Паwла Свёнковского. Его эксперимент, которым мы поделимся, демонстрирует реальные возможности и вызовы технологии, а также предоставляет практические решения, которые могут пригодиться каждому, кто заинтересован в совмещении Ruby и браузерных приложений через WASM. Самая красивая особенность такого подхода – возможность снизить порог входа для начинающих разработчиков, позволив им взаимодействовать с фреймворком без необходимости сложных локальных настроек и установок Ruby, менеджеров версий и расширений на C. Идея запуска Hanami в браузере звучит особенно заманчиво, ведь этот фреймворк отличается модульностью и лёгкостью, что делает его отличным кандидатом для подобных экспериментов.
Среди причин обратить внимание на Hanami – его чёткая архитектура, современный синтаксис и активное сообщество. При этом традиционные Ruby-приложения требуют мощных серверов и сложных инструментов настройки, чего можно избежать, предоставив среду исполнения прямо в браузере. Однако для реализации такого решения потребовалось преодолеть ряд технических препятствий и несовершенств текущих инструментов WASM. Исходная точка работы – репозиторий ruby.wasm, являющийся официальной частью Ruby-организации на GitHub.
В этом проекте собран основной инструментарий, необходимый для компиляции и запуска Ruby-кода с помощью WebAssembly. В частности, можно выделить утилиту ruby_wasm, доступную через RubyGems, которая облегчает подготовку и сборку WASM-пакетов. Тем не менее, просто запустить Hanami в WASM не так просто, как кажется. Фреймворк использует ряд зависимостей, среди которых такие, как bigdecimal, которые на момент написания эксперимента не компилируются в WebAssembly. Для решения этой проблемы была применена хитрость, подсказанная в подкасте Владимира Дементьева – вместо настоящей реализации BigDecimal была создана заглушка.
Она не содержит функционала, но позволяет обойти ошибку компиляции и продолжить работу. Помимо этого пришлось модифицировать процесс компиляции WASM, чтобы пропустить нежелательные компоненты и встроить необходимые кастомные зависимости. Еще один важный момент – сам Hanami контриллеры и валидаторы были задействованы без полноценного роутера и механизмов HTTP запросов, поскольку полная эмуляция серверного окружения в браузере пока невозможна из-за ограничений WASM и Ruby. Автору удалось добиться запуска отдельного действия с валидациями, демонстрирующего базовую работу фреймворка в таком окружении. Реализация поддержки пользовательского кода в браузере выглядела следующим образом: сначала загружался WASM-файл, содержавший скомпилированный слой Ruby и необходимые гемы.
Далее создавалась виртуальная машина Ruby и выполнялся инициализационный скрипт, добавлявший пути к шеллам (shims) и подключавший ключевые библиотеки Hanami. В итоге в браузере была определена Ruby-модель, которая исполнялась через специальный метод run_action. Этот метод принимал класс действия и сериализованные параметры, запускал процесс и возвращал результат, что позволило реализовать взаимодействие с пользователем непосредственно в браузерном интерфейсе. Сам код на JavaScript использует современные асинхронные функции для загрузки WASM, создания виртуальной машины и затем исполняет Ruby-строки, встраивая пользовательский ввод, что открывает широкие возможности для интерактивных приложений на Ruby без серверной части. В качестве дополнительного шага автор подготовил скрипт сборки, который управляет процессом компиляции Ruby в WASM с помощью ruby_wasm и RubyWasm::Packager.
В скрипте помимо прочего исключается гем bigdecimal, который не компилируется, и задаются пути к шёллам и выходным файлам. На практике размер итогового WASM-файла составлял порядка 50 мегабайт, что стало серьёзным ограничением для популярных сервисов, таких как Cloudflare Pages и Netlify. Поэтому было принято решение разместить демонстрационную версию на дешевом VPS, что позволило избежать проблем с ограничениями хостинга и убедиться, что эксперимент работает у реальных пользователей. Несмотря на то, что запуск Hanami целиком в браузере – пока недостижимая цель из-за технических и функциональных ограничений, опыт показывает, что отдельные его модули и действия вполне реализуемы. Это открывает перспективы использования Ruby и Hanami в новых сценариях, расширяя фронтиры веб-разработки.
Кроме того, стоит отметить важность изучения сторонних ресурсов и опытных разработчиков, таких как Владимир Дементьев, чей код и электронная книга выступили источником знаний и готовых решений для преодоления сложностей внедрения Ruby в WASM. Такой обмен опытом ускоряет изучение технологии и вдохновляет на новые эксперименты. В целом, использование WebAssembly для запуска Ruby-кода и Hanami в браузере – это перспективное направление, хотя и наполненное «драконами» и «шероховатостями». Научиться правильно конфигурировать сборку, обходить несовместимые зависимости, создавать виртуальную машину и обрабатывать ошибки – это ценный навык, который пригодится разработчикам, стремящимся к инновациям и улучшению пользовательского опыта. Несмотря на ограничения, уже сегодня возможна реализация небольших промо-демо, обучающих материалов и минимальных серверов приложений, работающих полностью на клиентской стороне с помощью WASM.
В будущем, по мере развития инструментов и экосистемы Ruby-WASM, можно ожидать улучшения поддержки гемов, оптимизации размера и скорости загрузки, а также появления полноценных приложений с маршрутизацией и другими функциями. Для тех, кто хочет начать свой путь – стоит внимательно ознакомиться с репозиторием ruby.wasm, изучить ruby_wasm tool, пользоваться готовыми примером и следить за сообществом разработчиков. Не менее важен опыт погружения в асинхронный JavaScript и взаимодействие с виртуальными машинами через WASM. Кроме технических знаний, эксперимент Паwла подчеркивает ценность настойчивости и готовности изучать новое – за полчаса можно получить работающую демо, но по-настоящему освоить технологию пришлось провести часы в попытках понять код других и устранять ошибки.
В итоге, перспектива запускать Hanami и Ruby в браузере через WASM становится всё более достижимой, а опыт подобных исследований важен для развития современного веба.