惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
人人都是产品经理
人人都是产品经理
美团技术团队
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
博客园 - 【当耐特】
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
量子位
罗磊的独立博客
月光博客
月光博客
N
Netflix TechBlog - Medium
大猫的无限游戏
大猫的无限游戏
博客园_首页
P
Proofpoint News Feed
Jina AI
Jina AI
云风的 BLOG
云风的 BLOG
博客园 - 司徒正美
腾讯CDC

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
Shine — C++ Фреймворк для десктоп приложений с использова...
wtf-keaton · 2026-05-04 · via Все публикации подряд на Хабре

Доброго времени суток, уважаемые пользователи Хабра.

Я не то что бы профессиональный разработчик на C++, в основном я занимаюсь геймдевом на UE5 (по крайней мере последнее время). Но последнее время достаточно часто я балуюсь разработкой десктоп приложений под Windows. Для красоты и простоты я задумывался об использовании именно react. Но из выбора что я увидел было 2 варианта:

  1. Tauri - Фреймворк под Rust с отрисовкой фронтенда сделанном на React и т.п.

  2. Electron -  фреймворк для разработки кроссплатформенных настольных приложений с использованием веб-технологий (скопировал описание с гугла)

Electron я отмел сразу, так как хотел писать бэкенд на чем то более удобном чем JS/TS для себя. Tauri мне очень понравился, но изучение Rust заняло немного времени. И смотря на это все я подумал, что можно реализовать какой-нибудь аналог Tauri используя C++.

Немного посидев поизучав информацию, я примерно выстроил себе план работы, из этого вылился первый MVP Shine. Фреймворк на данный момент поддерживает только Windows и тесно связан с vcpkg, так как находится на очень ранней стадии разработки, но его уже вполне себе можно потыкать и использовать.

Репозиторий проекта

А теперь к установке и использовании:

Для начала то, что нам нужно для запуска:

  • CMake

  • Node.JS

  • CLion (можете использовать что-то своё, мне комфортнее в нём)

Дальше мы открываем терминал и прописываем команду:
npm create shine-app@latest

У нас появится простая на данный момент настройка проекта, а именно указание его имени:

CLI создания приложения

CLI создания приложения

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

CLI Вывод

CLI Вывод

Структура проекта у нас выглядит следующим образом:

D:.
├───cmake # кастомные cmake функции для удобства сборки и запуска
├───frontend # Тут у нас находится фронтенд, сам UI приложения
│   ├───public
│   └───src
│       └───assets
├───generated # Тут у нас лежат ассеты собранные в бинарник, чтобы не таскать их за собой в релизе
├───scripts # Скрипты сборки для удобства
├───shine # Код библиотеки
│   ├───components
│   │   ├───include
│   │   │   └───shine
│   │   │       └───components
│   │   └───src
│   └───core
│       ├───include
│       │   └───shine
│       │       └───engine
│       └───src
│           └───engine
│               └───win32
└───src # Код нашего приложения (в данном случае main.cpp)

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

Дальше мы открываем проект в CLion (или там где удобно вам) и настраиваем профили CMake, У меня это выглядит так:

Мои настройки CMake

Мои настройки CMake

Дальше идем в View -> Tool Windows -> vcpkg

Открываем vcpkg

Открываем vcpkg

Далее выбираем наш существующий манифест, и нажимаем на карандашик сверху чтобы он работал с нашими CMake профилями:

UI с vcpkg окном

UI с vcpkg окном

Кликаем галочку Add vcpkg integration to existing CMake profiles

Галочка что нужно нажать

Галочка что нужно нажать

Далее кликаем ПКМ по корневому CMakeLists.txt и нажимаем Reload CMake Project.

Расположение Reload CMake Project

Расположение Reload CMake Project

Дальше мы можем спокойно запустить приложение и увидеть что оно работает:

UI Интерфейс template приложения

UI Интерфейс template приложения

Идею темплейта я решил взять просто с Tauri, простое окно где можно ввести имя и при нажатии Greet наше C++ ядро отформатирует сообщение и выведет его во фронтенде:

После нажатия Greet

После нажатия Greet

Со стороны C++ наш handler функции greet выглядит следующим образом:

SHINE_COMMAND(greet) {
    // У функции собранной с SHINE_COMMAND по дефолту есть аргументы
    // В развернутом виде функция выглядит примерно так:
    // nlohmann::json greet(const nlohmann::json& args)
    std::string name_str = args["name"];

    return std::format("Hello, {}", name_str);
}

и указание того, что мы можем вызвать эту функцию из фронтенда:

app.GetRouter().AddHandlers({SHINE_HANDLER(greet)});

После этого наш фронтенд знает что мы можем вызывать функцию greet с помощью метода invoke. Выглядит это следующим образом:

    async function handleGreet() {
        if (!name.trim()) return;

        setIsLoading(true);
        try {
            // Вызываем функцию и записываем ответ в setGreetMsg
            const res = await invoke('greet', { name });
            setGreetMsg(res.result || res);
        } catch (error) {
            setGreetMsg("Error: Could not connect to Shine Core");
        } finally {
            setIsLoading(false);
        }
    }

Дальше мы можем как угодно переделывать наш проект React и делать наше UI. При сборке в дебаге приложение просто слушает локалхост с нашим портом, в Shine есть поддержка HMR и при изменении кода, UI в приложении так же изменится. При релизе же, проект фронтенда собирается и после чего переводятся в байты, дальше мы используем эти байты внутри приложения не распаковывая их храним в памяти.

Помимо всего этого у нас есть конфиг файл: shine.conf.json, выглядит он так по стандарту:

{
  "window": {
    "title": "Shine Secure App",
    "width": 900,
    "height": 600
  },
  "capabilities": {
    "allowedCommands": [
      "fs_read_text_file",
      "window_drag"
    ]
  }
}

В нем пока что мы указываем title окна приложения, его размеры. Помимо этого есть ещё 2 параметра конфига:

  • frameless - Отключает рамки у окна

  • resizable - Разрешает / запрещает изменение размера окна

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

Учитывая что мы пишем на C++, и запихиваем ассеты фронтенда прямиком в бинарник, приложение из template имеет достаточно приятный вес - всего 845кб, при этом он не требует зависимостей для запуска и можно отправлять голый .exe пользователю и он запустится на его системе.

Вес релизного приложения

Вес релизного приложения


В планах у меня реализовать поддержку Linux и MacOS, а так же возможность получать состояние элементов фронтенда из плюсов и взаимодействия с ними. Например заполнять прогресс бар условный из C++ при какой-нибудь загрузке и т.п.

Это моя первая попытка сделать что-либо полезное на C++ для опенсорса, буду очень рад объективной критике, советам и контрибьютингу.