Tauri

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

Tauri (рус. Таури, Тори, надм. Быкоподобный) — расово верная попытка скрестить ужа с ежом, а именно — веб-технологии с нативным десктопом, не превращая при этом компьютер пользователя в раскаленную печь, пытающуюся переварить Хромиум. По сути, это инструмент для тех, кто хочет писать десктопные (и с недавних пор мобильные) приложения, используя свой любимый JS, HTML и CSS, но при этом испытывает жгучий стыд за то, что их творение на Electron жрет оперативную память гигабайтами просто ради отображения моргающего курсора. В среде разработчиков позиционируется как Убийца Электрона, Святой Грааль оптимизации и Очередная хрень, которую нужно учить, потому что начальник прочитал статью на Хабре.

Суть[править]

Чтобы понять глубинный смысл существования Tauri, нужно окунуться в мрачную бездну истории создания кроссплатформенных GUI. Раньше, когда деревья были большими, а программисты — бородатыми и пахнущими свитером, приложения писались на C++ с использованием Qt или, прости Господи, MFC. Это работало быстро, жрало мало, но выглядело как интерфейс управления атомной станцией из 80-х, а порог вхождения был таким, что большинство неофитов ломали ноги еще на этапе линковки библиотек. Потом пришла эпоха Веба, и хипстеры от программирования решили, что учить плюсы — это для старперов, а они хотят лепить кнопочки на React и чтобы оно работало везде. Так родился Electron.

Electron был прост как палка: он брал ваш сайтик, запаковывал его вместе с полноценным браузером Chrome и Node.js, и выдавал это за десктопное приложение. В итоге калькулятор на Электроне весил 200 мегабайт и отжирал 500 метров оперативки, потому что для сложения двух чисел он запускал движок рендеринга, способный отрисовывать 3D-графику и майнить биткоины. Народ взвыл, вентиляторы ноутбуков вышли на орбиту, а Slack и Discord стали символами того, как можно заставить топовое железо тормозить на текстовом чате.

И тут на сцену, весь в белом и ржавчине (от Rust), выходит Tauri. Идея разработчиков была гениальна в своей простоте и коварна в реализации: а зачем таскать с собой целый браузер, если в каждой современной операционной системе он уже и так есть? В Windows валяется Edge (WebView2), в macOS — Safari (WebKit), в Linux — WebKitGTK. Давайте просто возьмем этот системный огрызок браузера, прикрутим к нему легчайший бэкенд на Rust вместо жирного Node.js, и получим приложение, которое весит 3 мегабайта и запускается быстрее, чем ты успеешь моргнуть. Звучит как сказка, где в конце все счастливы, а оперативка свободна, но, как и в любой сказке, тут есть свои драконы, о которых мы поговорим ниже, смакуя каждую деталь.

Кишки[править]

Внутренний мир Tauri — это поле битвы двух миров. С одной стороны у нас есть фронтенд. Тут царит полная анархия и демократия: ты можешь использовать React, Vue.js, Svelte, Solid, да хоть голый HTML с jQuery, если ты некромант. Tauri абсолютно плевать, что ты там навертел в JS, его задача — просто показать это в окне. Это та самая веб-часть, где хипстеры чувствуют себя как дома, попивая смузи и двигая дивы.

С другой стороны находится бэкенд, и вот тут начинается боль, страдание и Rust. Вместо привычного для веб-макак Node.js, который позволяет творить любую дичь с типами и памятью, Tauri предлагает писать логику на Rust. Это значит, что тебе придется познакомиться с такими понятиями, как владение (ownership), заимствование (borrowing) и лайфтаймы, от которых у неподготовленного джаваскриптера начинается экзистенциальный кризис и желание уйти в монастырь. Однако, именно благодаря Rust приложение получается blazingly fast (любимый мем растоманов) и безопасным. Никаких тебе undefined is not a function в системном потоке, только строгая компиляция и паника ядра, если ты совсем уж рукожоп.

Взаимодействие между этими двумя мирами происходит через так называемый IPC (Inter-Process Communication). Фронтенд шлет сигналы бэкенду: Эй, ржавый, сохрани файл!, а бэкенд, проверив все права доступа, подписи и наличие совести у разработчика, выполняет операцию и шлет ответ. В первой версии Tauri этот мост был похож на передачу записок через тюремную стену — медленно и только текстом (JSON). Во второй версии, которую пилили так долго, что успели состариться даже молодые стартаперы, IPC переписали, и теперь данные летают быстрее, чем сплетни в женском коллективе.

Размер имеет значение[править]

Главный козырь, которым адепты Tauri тычут в лицо любителям Электрона — это размер бинарника. Приложение Hello World на Electron весит, как уже упоминалось, под сотню мегабайт, потому что тащит с собой весь Хромиум. Приложение Hello World на Tauri весит… барабанная дробь… около 2-3 мегабайт. Иногда даже меньше, если ты умеешь пользоваться флагами компилятора и готов вырезать из бинарника все, включая иконку и совесть.

Это вызывает дикий восторг у тех, кто помнит времена дискет, и у тех, кто платит за трафик в роуминге. Но есть нюанс. Этот микроскопический размер достигается за счет паразитирования на системе пользователя. Tauri говорит: Я не принес с собой браузер, я буду жить в твоем. И вот тут начинается самое веселье, именуемое в народе кроссбраузерный ад.

Кроссплатформенная боль[править]

В идеальном мире все браузеры рендерят веб-страницы одинаково. В нашем мире, проклятом богами W3C, это далеко не так. Поскольку Tauri использует системный вебвью, вы получаете:

  • На Windows приложение работает на движке Chromium (через Edge WebView2). Это, пожалуй, самый адекватный вариант, потому что это почти Хром, и все ваши модные CSS-свистелки будут работать. Если, конечно, пользователь не сидит на Windows 7 без обновлений (хотя Tauri официально дропнул семерку, но некрофилы всегда найдут способ).
  • На macOS вы получаете Safari (WebKit). И тут начинается боль. Safari — это новый Internet Explorer современности. Он может не поддерживать какие-то специфические API, иначе рендерить тени, или просто вести себя как капризная примадонна. А самое веселое, что версия WebKit жестко привязана к версии macOS. Если у вашего юзера старая макось, у него старый WebKit, и ваше приложение будет выглядеть как говно, а вы ничего с этим не сделаете, кроме как повесите плашку Обновись, нищеброд.
  • На Linux… о, Linux. Тут используется WebKitGTK. Это такой Франкенштейн мира браузеров, который вроде бы WebKit, но с кучей своих, уникальных, любовно выращенных багов. Он может течь памятью, некорректно обрабатывать GPU-ускорение (привет, черный экран вместо интерфейса) или просто крашиться, потому что у пользователя не та тема оформления в GNOME. Разработка под Linux на Tauri — это путь самурая, готового к харакири.

В итоге, разработчик Tauri-приложения вынужден писать тонны полифилов и CSS-хаков, чтобы его детище выглядело одинаково везде. В то время как разработчик на Electron просто катит свою жирную бочку с Хромом и уверен, что везде все будет пиксель-в-пиксель, пусть и ценой сгоревшего процессора пользователя.

Tauri 2.0[править]

Долгое время Tauri был сугубо десктопной развлекухой. Но разработчики, посмотрев на Flutter, React Native и прочие тулзы для мобилок, решили: А чем мы хуже? Подержите мое пиво!. И выкатили Tauri 2.0 (после бесконечной беты и альфы). Теперь можно писать одно приложение, которое запускается на Windows, Mac, Linux, Android и iOS.

На мобилках схема та же: используется нативный WebView (WKWebView на iOS и системный WebView на Android). Бэкенд на Rust компилируется в нативные библиотеки, которые дергаются из Java/Kotlin или Swift. Звучит круто, но на практике добавляет еще один слой абстракции и боли. Теперь, помимо того, что тебе нужно знать JS и Rust, тебе нужно еще разбираться в экосистеме Android Studio и Xcode, уметь подписывать сертификаты, бороться с разрешениями (permissions) и молиться, чтобы Apple не реджекнула твое приложение просто потому, что у ревьюера плохое настроение.

Тем не менее, возможность написать логику на Rust и пошарить её между десктопом и мобилкой — это киллер-фича для тех, кто понимает. Представьте: у вас есть супер-сложный алгоритм шифрования или обработки данных. Вы пишете его один раз на Rust, и он работает везде, быстро и безопасно. А интерфейс рисуете на HTML, который тоже везде работает (ну, почти).

Безопасность[править]

Tauri помешан на безопасности. Разработчики настолько боятся, что через их фреймворк кого-то взломают, что по умолчанию запрещают всё. Хочешь прочитать файл? Хрен тебе, пропиши разрешение в конфиге. Хочешь открыть ссылку в браузере? Пиши разрешение. Хочешь пернуть в консоль? Ну, вы поняли.

В версии 2.0 ввели новую систему Capabilities (возможностей) и ACL (Access Control Lists), которая настолько сложна и запутанна, что без пол-литра и чтения исходников разобраться в ней невозможно. Документация, как водится в Open Source, местами отстает, местами врет, а местами просто говорит: Смотри примеры. Это превращает настройку проекта в увлекательный квест Угадай, почему оно не работает, где призом является рабочее приложение, а наказанием — потерянная неделя жизни.

Но есть и плюсы: благодаря изоляции (Isolation pattern) и тому, что бэкенд не торчит наружу как в локальном сервере, взломать Tauri-приложение сложнее, чем Electron. А еще есть встроенная защита от инъекций скриптов, хотя, если руки у разработчика растут из тазобедренного сустава, никакая защита не поможет.

Rust: Входной билет[править]

Нельзя говорить о Tauri и не упомянуть Rust. Это главный фильтр, отсеивающий слабых духом. Если в Электроне любой выпускник двухнедельных курсов Стань айтишником за 300 рублей мог наклепать приложение, просто скопипастив код со StackOverflow, то в Tauri этот номер не пройдет.

Тебе придется столкнуться с Карго (сборщик пакетов), который выкачивает половину интернета при каждой сборке (но все равно меньше, чем node_modules). Тебе придется ждать компиляции. Да, Rust компилируется медленно. Если ты привык к мгновенному Hot Reload в вебе, то ожидание пересборки бэкенда заставит тебя переосмыслить свою жизнь, выпить чаю, погулять с собакой и, возможно, даже жениться.

Но зато ты получаешь доступ ко всей экосистеме крейтов (библиотек) Rust. Нужна работа с USB? Есть крейт. Нужен SQL? Есть крейт. Нужно распарсить HTML регулярками (не делайте так)? Тоже есть. Это дает огромную мощь, но требует инвестиций времени в изучение языка, который славится своей крутой кривой обучения (больше похожей на отвесную скалу).

Мнение сообщества и срачи[править]

В интернетах, особенно на Reddit и LOR, баталии между сторонниками Electron и Tauri не утихают.

Адепты Электрона аргументируют так:

Да кому нужны ваши 50 мегабайт экономии? У всех сейчас по 32 гига оперативки! Зато я пишу один код, и он везде выглядит одинаково, а вы там в своем Tauri трахаетесь с CSS-хаками под Safari и сегфолтами на Линуксе. И вообще, время разработчика стоит дороже железа!

Фанаты Tauri (и Rust) отвечают:

Ты просто ленивая жопа, которая не может выучить нормальный язык. Твой Slack жрет больше, чем Ведьмак 3! Мы делаем софт экологичным, быстрым и безопасным. А WebKitGTK мы когда-нибудь починим… наверное. И вообще, перепиши всё на Rust!

Есть еще третья группа — маргиналы, использующие Flutter, Qt или JavaFX, которые смотрят на это веб-побоище как на возню в песочнице, но их никто не слушает.

Итог[править]

Если вам нужно быстро склепать прототип и плевать на ресурсы — берите Electron. Если вы делаете серьезный продукт, который должен работать быстро, уважать пользователя и не требовать для запуска покупки новой планки RAM — Tauri ваш выбор. Только не забудьте купить бубен для танцев вокруг Linux и Safari. Just for lulz.

App.png Весьма полезная вещь, позволяет машинам работать с помощью коммандычей
МетаПрограммаDRM (SecuROMStarForceАналоговая дыра) • БагБот (Автоответчик) • Варез (Repack) • ГлюкГуйДонатКопирайт (By design) • ЛогНюкРут (Не работай под рутом) • Спортивное программированиеМегапиксельКомпьютерВерсия 2.0КодОбфускацияСкриншотДатамайнПлагинТекстовый файлБольшие данныеАльфа и бета-тестыТаймстампКэшШаблоныHello WorldНейросетиФайлИнсталляцияВидеоМощный сбой Microsoft 19 июля 2024 годаCrowdStrikeПроект GNUUserscriptDxvkVkd3dБратан хорош давай давай впередКонечный автоматLumenЗаступник (приложение)NeeUnreal MCPОптимизацияДрайверТестированиеТройная буферизацияQBitTorrentСинтезаторОбрыв загрузки файла на 99%Polycount.comГрок написал программу о себеВредоносTamTamАппликацио
ФичиБагрепорт12309BSODCookiesEmbrace, extend and extinguishFL StudioSheep.exeWinlogon.exeБубенЗащита от дуракаКостыльМашинный переводПасхальное яйцоСвистелки и перделкиСм. рис. 1Съешь ещё этих мягких французских булокTermuxGNU MetroИндусский кодНескучные обои • Сжатие (За сжатие ДжипегаШакалШкала) • Работает — не трогайРандомайзерPDF (Распознавание PDF) • Дело Google в ФАСЧат-ботXMLМакросКритическая ошибкаФреймворкСинонимайзерSourceТрёхмерное отслеживаниеТрассировка фотоновHZB OcclusionДаунгрейд RTX 4070TressFXАвтопереводчикVSCodiumThorium BrowserShovelwareФайл подкачкиTea Dating AdviceSingle-Page ApplicationАптаймSafenSoft SysWatchМолния (мессенджер)C SharpОбновлениеOneDriveChatGPT AtlasVoice Over Translation
ВредоносноеБотнетБрутфорсВинлокЗвонилкаКитайские пингвиныПиксель смертиТроянЧервь МоррисаBonziBuddyMediaGetBrowser hijackingTinderМиссис МажорУтечка буфера обменаWin 10 TweakerОпараш Mozilla FirefoxЯндекс.МузыкаКрэкерБезопасность через умолчаниеGrifter.aviTrojan.Winlock.DeathМиссис МажорСредаDirectStorageDriverpackГенератор случайных чиселDisable Core 0РомхакингDDrawCompatWingetCreateWinGetCoowonЯндекс МессенджерVCPkgSELinuxXfireYouTube Auto-ResumeTape OperatorBotFatherMTProtoSignalDoubleClickFixGiteeБотофермаMalwareCeno BrowserLagoFastYouareanidiot
КомпанииApple / Apple (AppleScript) • GoogleMicrosoftSAPЯндексExiled Exchange 2BraveAdNauseamСкурвление FirefoxCafe BazaarAMD FEMFXPPSSPPАвтохукQuick machine recoveryПутинский мессенджер MAXBypassNROWizTreeJTubeGallium NineFalconRu-WireGuardМобильное приложениеWebRenderСмс-бомберInstaller-SHProton GEProcess LassoParkControlDolby AccessDevToolsDxWrapperБойкот мессенджера MaxFirejailLenzaБезопасность мессенджера MAXЦифровое гетто ГабенаQuasarRATGame MakerБрайан ЛандукСтарые форматы видеофайловMAX в школахdom.storage.default_quotaVirtualBoxArdourFlutter
ЛюдиВеб-мастерLovinGODБалмерГейтсГенерал ФейлорДжобсМитникПоттерингде РаадтСпольскиСтоллманТорвальдсШахиджанянAche666Марк ЦукербергЕвгений ПоповДенис КумпонМассовая компьютерная безграмотностьKomet ClientРеверс-инжинирингКроссплатформенностьDKMSАмигоAURWhiteMAX
Команды^H^WAlt+F4Ctrl+Alt+Delman/me/quitrm -rf
Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикFortran (Профессор)
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++ScalaH и Ё+
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёздыПрограммист (существо)Тернарный операторUnreal MCPИсходный кодSingle-Page ApplicationGiteaForgejoCephIDEДжуниор
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplaceФреймворкБыдлокодIndex.phpОхота за жукамиКуМирКлеточный автоматПроцедурное программированиеПоиск файлов в Unix по содержимомуPetoohФункция активации нейронаПерегрузка операторов в PythonЗерокодинг
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3DКнижный PythonMallocСвязный списокSOLIDООПУказательNULLWeLang++XenonRecompFuse.jsОптимизацияТестированиеAmbreon866Реверс-инжинирингКроссплатформенностьJSON
ЛюдиИлья КанторЮрий КлючевскийЭдуард ЛаасЭдвард СноуденСеймур Пейперт
Прочее++i + ++iДедлайн%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодачХукCurl cffiВибе-кодингFlutterАппликативный оператор