Tauri
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.