Розробка десктопного торговельного терміналу
Десктопний торговельний терміналу надає можливості, недоступні у браузері: прямої взаємодії з мережею без обмежень CORS, системних сповіщень, автозапуску, доступу до локальних файлів для експорту даних, потенційно меншої затримки через нативні TCP-з'єднання.
Вибір технології
Electron — найпопулярніший фреймворк. React/Vue/Angular frontend + Node.js backend в одному додатку. Мінус — великий розмір (~100MB) та високе споживання пам'яті (кілька екземплярів Chromium). Плюс — повторне використання веб-коду.
Tauri (Rust + WebView) — легша альтернатива Electron. Використовує системний WebView (Edge на Windows, WebKit на macOS), розмір бінарника 3–10MB. Rust backend замість Node.js — значно менше пам'яті, вища продуктивність.
Qt (C++ або Python) — нативний UI, максимальна продуктивність, але складна розробка та застарілий UX.
Для більшості проектів торговельних терміналів — Tauri, якщо потрібна продуктивність, Electron, якщо потрібна швидкість розробки.
Архітектура Tauri
// src-tauri/src/main.rs
use tauri::{Manager, Window};
use tokio::sync::broadcast;
#[tauri::command]
async fn subscribe_market_data(
symbol: String,
window: Window,
state: tauri::State<'_, AppState>,
) -> Result<(), String> {
let mut rx = state.market_data_bus.subscribe();
tokio::spawn(async move {
while let Ok(event) = rx.recv().await {
if event.symbol == symbol {
window.emit("market-data", &event).unwrap_or_default();
}
}
});
Ok(())
}
#[tauri::command]
async fn place_order(
order: OrderRequest,
state: tauri::State<'_, AppState>,
) -> Result<OrderResponse, String> {
state.exchange_client
.place_order(order)
.await
.map_err(|e| e.to_string())
}
// Frontend: використання Tauri API
import { invoke } from '@tauri-apps/api/tauri';
import { listen } from '@tauri-apps/api/event';
// Підписка на ринкові дані через нативну подію
await invoke('subscribe_market_data', { symbol: 'BTC/USDT' });
const unlisten = await listen<MarketData>('market-data', (event) => {
updateOrderBook(event.payload);
});
Нативні функції для трейдерів
Системний трей — терміналу працює в треї, отримує алерти навіть у згорнутому стані:
import { TrayIcon } from '@tauri-apps/api/tray';
import { sendNotification } from '@tauri-apps/plugin-notification';
// Сигнал про ціну
if (currentPrice >= alertPrice) {
await sendNotification({
title: 'Price Alert',
body: `BTC/USDT reached ${currentPrice.toFixed(2)}`,
icon: 'icons/icon.png',
});
}
Гарячі клавіші — глобальні комбінації клавіш:
use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, Modifiers, Shortcut};
app.global_shortcut().register(
Shortcut::new(Some(Modifiers::CTRL | Modifiers::SHIFT), Code::KeyB),
move |_app, _shortcut, _event| {
// Ctrl+Shift+B - швидка покупка по ринку
place_market_buy_order();
},
)?;
Автозапуск — запуск із системою для моніторингу 24/7:
import { enable, isEnabled } from '@tauri-apps/plugin-autostart';
async function enableAutostart() {
if (!(await isEnabled())) {
await enable();
}
}
Продуктивність проти Electron
| Метрика | Electron | Tauri |
|---|---|---|
| Розмір бінарника | 80–150 MB | 3–10 MB |
| Пам'ять при запуску | 150–300 MB | 30–80 MB |
| CPU в режимі очікування | 2–5% | 0.5–1% |
| Час запуску | 2–5 сек | 0.5–1 сек |
Для терміналу торгівлі, що працює 24/7, різниця в споживанні пам'яті та CPU суттєва.
Автоматичне оновлення
Tauri вбудований updater через GitHub Releases або користувацький сервер:
// tauri.conf.json
{
"updater": {
"active": true,
"endpoints": ["https://releases.yourapp.com/{{target}}/{{arch}}/{{current_version}}"],
"dialog": true,
"pubkey": "..."
}
}
При виході нової версії додаток показує сповіщення та завантажує оновлення на фоні. Підпис оновлень приватним ключем — обов'язкова вимога безпеки.







