Всё началось с, казалось бы, простого желания

Мне хотелось написать небольшое приложение. Я работаю fullstack‑разработчиком, поэтому для разработки я решил использовать web‑технологии. Мне хотелось, чтобы я мог написать код один раз, и чтобы он запускался на всех моих устройствах (windows, linux, android).

Самое главное: написать приложение быстро

Мне хотелось использовать готовые инструменты. Я был уверен, что их мне будет достаточно. Посмотрел на существующие решения: electron, neutralinojs, apache cordova, tauri, capacitor, ... Все они мне не нравились по разным причинам. Разберём основные моменты:

Electron — в каждое приложение (даже в мой hello world) запихивает chrome (130mb). Для моего простейшего приложения — это очень плохо. Не умеет упаковываться в мобильное приложение.

Neutralinojs — backend нужно писать на c++, также не умеет в мобилки.

Apache cordova, capacitor — умеют упаковываться только в мобилки. Capacitor умеет упаковываться (с помощью electron) в десктоп, но проблему electron мы обсудили.

Tauri — хороший инструмент. Но он не для меня, не хочу писать на rust. Хочу всё приложение писать на typescript, к которому привык. Порог входа этого инструмента слишком высокий

Wails — тоже хороший, но использует Go.

PWA — хочется именно нативное приложение, которое можно было бы распространять в google play + проблема десктопа остаётся.

В общем, мне не нравилось, что при выборе мне всегда нужно с чем‑то мириться. Я подумал: а что если просто взять системный WebView и Node.js, и склеить их вместе?

Если не нашёл подходящее чужое, то напишу своё?

В какой‑то момент я решился погрузиться в разработку. Спустя вот уже два года (от идеи до работающей реализации), я представляю вам:

Webnative — Build Web, Ship Anywhere (такой слоган придумал)

Фреймворк объединяет лучшие стороны остальных других инструментов:

  1. Не тащит за собой chrome.

  2. Позволяет использовать js/ts и на бэке и на фронте.

  3. Одна кодовая база для всех платформ сразу.

  4. Абстракция апи от реальной реализации на платформах.

  5. Старается изо всех сил дать ощущение «работает как магия» — удобный dx.

Главная цель проекта -

позаботиться о fullstack разработчиках, дать им удобный и простой инструмент для сборки приложений под любые платформы.

На данный момент поддерживаются linux, windows и android. Далее планирую поддерживать и остальные платформы: macos, ios.

Как начать пользоваться:

npm install -g @mindw1n/webnative

webnative init my-app && cd my-app

webnative build linux

Всё! Через 7 секунд у тебя готовый AppImage.

Довольно простой синтаксис: webnative build <platform>. При этом <platform> — это windows, linux, android или all (все по очереди).

Структура проекта тоже очень простая:

my-app/

app/ # любой фреймворк: React, Vue, Svelte, vanilla

app/backend/ # Node.js, точка входа index.ts / index.js

webnative.json # конфиг

Внутри app и backend есть по папке api, чтобы удобно абстрагировать специфичный для платформы код. Также я написал и опубликовал библиотеку webnative‑core, она позволяет необходимые апи для десктопа. Апи для мобильных устройств можно взять у Capacitor, они работают из коробки без проблем.

Как это работает изнутри (только для очень любопытных)

Если тебе интересно только «поставил и работает» — листай до следующего раздела. Здесь для тех, кто хочет понять, что происходит под капотом.

C++ хост‑процесс запускает два дочерних процесса: WebView с твоим фронтендом и Node.js с твоим бэкендом. C++ при запуске nodejs открывает pipe и передаёт fd процессу nodejs. Тот в свою очередь запускает http сервер и отправляет по трубе (pipe) данные:

{ "port": number, "key": string }

Эти данные нужны для того, чтобы фронтенд мог напрямую разговаривать с бекендом по защищённому каналу. Защищён он ключом «key», который сервер генерирует и при запросе проверяет.

Всё максимально кастомизируемо: бекенд пишется разработчиком, фронт тоже. С++ нужен был только чтобы их подружить.

Думаю, остальные детали реализации я опишу уже в документации к проекту.

Бенчмарки

Давайте сравним Webnative и Electron (самый популярный фреймворк для создания приложений на десктоп)

Все замеры — на реальных hello‑world проектах. webnative app с фронтендом и Node.js бэкендом против стандартного electron-builder

Время сборки

webnative build linux   —   7.4 сек
electron-builder        —   19.3 се

Webnative собирается в 2.6 раза быстрее!

Размер дистрибутива

webnative (fullstack AppImage)       —   36 МБ
webnative (frontend-only AppImage)   —   1.1 МБ
Electron AppImage                    —   130 МБ

36 МБ против 130 МБ — потому что мы не тащим Chromium. А если бэкенд не нужен, то 1.1 МБ — это просто нативное окно с WebKit внутри.

Потребление RAM

webnative (+ системный WebKit)   —   ~300 МБ
Electron                         —   ~566 МБ

Важная оговорка: WebKit в случае webnative — системный, он уже есть на машине. webnative его не устанавливает и не дублирует. Electron же тащит свой Chromium в каждое приложение отдельно.

Заключение

Если у Вас остались вопросы или вы хотите присоединиться к проекту, то вот ссылка на github проекта: https://github.com/kl1ro/webnative.git

Также прикрепляю пример использования: https://www.youtube.com/watch?v=BdnwlwOvEts

Спасибо, что дочитали это до конца! Рад, что вам была интересна моя работа!

Комментарии (19)


  1. savostin
    10.06.2026 17:46

    Чем Bun не устроил?

    https://bun.com/docs/bundler/executables#full-stack-executables

    Мобилки? Интересно как вы Node на iOS запускать собираетесь…


    1. zartdinov
      10.06.2026 17:46

      Есть Electrobun, но без мобилок, для десктопа удобно


    1. mindw1n Автор
      10.06.2026 17:46

      Доброй ночи, savostin! Отвечу коротко на ваши вопросы.

      1. В проекте я использовал nodejs как стандарт индустрии, поддержку bun можно добавить в будущем.

      2. Мобильные устройства - это отдельный мир. Я задавался вашим вопросом. Честный ответ - на мобильных устройствах нельзя запустить nodejs. Но что можно сделать - это добавить ts обёртку для java вызовов (если мы говорим про андроид). И ребята из команды capacitor с этим успешно справляются: https://capacitorjs.com/docs/plugins. Webnative спокойно поддерживает плагины capacitor, я проверял.

      Спасибо за ваш интерес к проекту!


  1. MountainGoat
    10.06.2026 17:46

    На Tauri можно писать на одном только TypeScript.


    1. zartdinov
      10.06.2026 17:46

      Это если backend совсем не нужен и не нужны взаимодействия с самой системой.
      Но в таком случае проще даже тулзы юзать, которые оборачивают в Tauri.
      Типа таких https://github.com/tw93/Pake


      1. MountainGoat
        10.06.2026 17:46

        В Tauri можно из TS работать с файлами, сокетами, БД, а на мобилках с NFC и биометрией, и ещё там всякого.


    1. mindw1n Автор
      10.06.2026 17:46

      Доброй ночи, MountainGoat!

      Хочу коротко прокомментировать ваши слова: да, технически можно. Но как только приходится выйти за рамки предустановленных API — нужен Rust. Вся бэкенд-логика, нестандартные системные вызовы, плагины — это Rust. В webnative бэкенд — это просто Node.js, вся npm экосистема доступна без ограничений.

      Спасибо за ваше внимание к моему проекту!


      1. xormark
        10.06.2026 17:46

        не пишите ерунды, разберитесь сначала в вопросе.

        Если приложение работает с

        работает с файлами

        сетью

        UI

        BD

        окнами

        уведомлениями

        то можно почти 100% кода писать на TypeScript.

        и даже если нужен winapi, есть способы интеграции node-процесса и делать import ffi from 'ffi-napi'

        что является конечно же бредом, зачем тянуть ноду, когда можно просто в расте команды написать и дергать их из js


  1. MiracleUsr
    10.06.2026 17:46

    C++ хост‑процесс запускает два дочерних процесса: WebView с твоим фронтендом и Node.js с твоим бэкендом.

    Nodejs таскаете с собой в дистрибутиве, или пользователю надо его обязательно в систему устанавливать нужной версии как зависимость?

    Как оно работает с типичными андроидовскими особенностями - например, можно ли создать background/foregorund-сервис, подписываться на системные события, и т.д.?

    Ну и на iOS оно не взлетит - Apple не пускает в AppStore ничего с JIT -компиляцией, а у вас там нода с V8.


    1. mindw1n Автор
      10.06.2026 17:46

      Доброй ночи, MiracleUsr!

      В процессе дизайна этой системы я потратил кучу времени на то, чтобы придумать как это всё правильно упаковать. В проекте я ставлю приоритетом удобство пользователя. Занимаемое на диске пространство - это один из самых важных параметров!

      Однако в первых версиях webnative (в тех, которые сейчас есть в открытом доступе) я сфокусировался на self-contained приложениях. В будущем я планирую добавить windows (setup) и linux (flatpak) дистрибьюцию. Эти версии: v4 и v5 соответственно, я постараюсь опубликовать в открытый доступ в ближайшее время. Они позволят грузить зависимости динамически. При этом nodejs как зависимость будет устанавливаться автоматически (при разрешении пользователя) глобально, что позволит многим приложениям использовать один и тот же бекенд.

      Отвечу на вопрос про особенности мобильных платформ. Плагины Capacitor позволяют получить доступ к нативным api устройства. Их можно использовать вместе с webnative без ограничений.

      Спасибо за ваше внимание к моему проекту!


  1. xormark
    10.06.2026 17:46

    Tauri — хороший инструмент. Но он не для меня, не хочу писать на rust. Хочу всё приложение писать на typescript, к которому привык. Порог входа этого инструмента слишком высокий

    риально? а почему на ts тогда не писать, а растом только запускать webview?

    а bun зачем существует? c электроном сравнивать это конечно мощно, го сравнение с tauri и bun


    1. mindw1n Автор
      10.06.2026 17:46

      Доброй ночи, xormark!

      Electron взят для наглядности — это самый известный инструмент в нише. Tauri и webnative решают схожие задачи по-разному, каждый со своими компромиссами.

      Спасибо за интерес к моей работе!


      1. xormark
        10.06.2026 17:46

        если честно выглядит так, будто он взят потому что он самый тяжелый и тормознутый инструмент в нише


  1. acusric
    10.06.2026 17:46

    Системный WebView будет сильно зависеть от оси (Linux WebKitGTK и Windows WebView2 — для коммерческих и моб. app не очень). Да и размерчик.. это из-за nodejs.


  1. cmyser
    10.06.2026 17:46

    Тоже хотел написать что в таури можно и чисто TS использовать и что апи у веба очень большой, но об этом и так много сказано

    А у вас вот бэкенда это взаимодействие с нативной платформой получается ? А то непонятно зачем писать бэк рядом с фронтом если бэк всё равно хостить на сервере

    И если да, то хотелось бы примеров в статье с работой системного при из TS, но тут получается что они на фронте нужны, а если они на бэке только как передать взаимодействия ?


    1. MiracleUsr
      10.06.2026 17:46

      А у вас вот бэкенда это взаимодействие с нативной платформой получается ? А то непонятно зачем писать бэк рядом с фронтом если бэк всё равно хостить на сервере 

      Судя по всему да. И тут дальше зависит от того, насколько грамотно продумана архитектура самого конкретного приложения, использующего этот рантайм.

      Если разработчик запилит свое приложение так, что вся логика приложения все-таки живет в браузерной части, а на бэкенд оно лазиет от случая к случаю, только когда нужно как-то взаимодействовать с системой - это в целом ок. Хотя в этом случае довольно жирно тащить для такого целую огромную ноду (это и дополнительная зависимость, и потребление памяти), тут больше напрашивается какой-нибудь легковесный враппер системных API (файлы, сокеты, и т.д.) в REST API (или JSON-RPC через какие-нибудь вебсокеты), и можно обойтись без ноды. Подобный подход уже реализован в Tauri.

      А если писать как обычно пишут под веб - на фронтенде только представление, а логика вся на бэке - то для десктопа/мобилок получается ещё более неэффективно, мало того что нужно тащить ноду на клиентскую машину и ее процесс висит в памяти, так например куча структур дублируется и в процессе браузера, и в процессе ноды, и данные гоняются туда-сюда на каждый чих.


      1. cmyser
        10.06.2026 17:46

        да
        вот ялавка например как то так делала мост https://t.me/yandex4frontend/469
        и я тоже считаю что это лучший вариант

        веб уже сейчас почти всё позволяет, по сути новый уровень абстракции, при этом крайне безопасный ( слить данные зачастую можно только самому )
        и крайне четкий и строгий по правилам


  1. RigelGL
    10.06.2026 17:46

    Попробуйте Flutter, тоже норм стандарт, развитая экосистема, собирается под веб, винду, линукс, андроид, ios, маки. По скорости +- также как и js на v8, если не быстрее. Памяти потребляет в разы меньше чем электрон.

    Не знаю как вы собирали бандл электрона, но у меня на выходило около 80-85мб. После установки, конечно, было больше 200-300 мб.


  1. lonberg
    10.06.2026 17:46

    Задавался тем же вопросом(Chromium-200MB), … по началу. Остановился на связке python+webview. Позже спустился на землю: Ну что такое сегодня для типичного компа 200MB? Кто это вообще считает?