Svelte это фронтендерский фреймворк, который стремительно ворвался в индустрию году так в 2018-2019, и произвел тогда невероятно сильное впечатление: новый подход, новый приятный синтаксис и невероятные показатели бенчмарков. Был только один вопрос, сможет ли такое более-менее-радикальное решение закрепиться на рынке и продержаться достаточно долго чтобы обрасти экосистемой вокруг - стать достаточно взрослым “для продакшена”.

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

p.s: я не взял Vue.js в сравнение просто из-за нехватки свободного времени, в остальном прекрасный фреймворк, имею опыт.

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

Меня интересует как будет себя вести и ощущаться разработка следующих концепций:

  • роутинг
  • стейт-менеджмент
  • различные варианты вложенности компонентов, слоты.
  • работа с формами
  • препроцессинг стилей

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

стек технологий

Svelte: Sapper + встроенные средства для state management

React: Next.js + Redux

Angular : возможности стандартной Angular CLI + ngRx

тестирование

Что я посчитал важным протестировать и сравнить:

  • общая скорость и комфорт разработки (сугубо по ощущениям и затраченному времени)
  • размер билда, размер кода в памяти.
  • передача данных по сети, количество запросов, и т.д.
  • скорость отрисовки и рендеринга при различных общих операциях
  • ну и общий скоринг lighthouse и webpagetest.

реализация

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

Svelte

репозиторий: github: svelte-pomodore-timer-example

билд: surge: svelte-pomodoro-timer-example

Angular

репозиторий: github: angular-pomodoro-timer-example

билд: surge: angular-pomodoro-timer-example

React

репозиторий: github: angular-pomodoro-timer-example

билд: surge: angular-pomodoro-timer-example

Результаты, сводная таблица

По субъективным ощущениям комфорта побеждает конечно Svelte, несмотря на то, что для меня это абсолютно новый синтаксис, работать с концепцией приятно. Код пишется легко и в малом количестве.

Тяжелее всего, было на реакте, в силу большого количества Boulerplate-like кода и файлов которые надо описывать вручную, где, например, в Angular, за тебя делает CLI.

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

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

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

Ниже прилагаю сводную таблицу с конкретными данными.

Svelte (Sapper) React (Next.js) Angular (Angular-CLI)
Github page application code application code application code
Live demo application example application example application example
Build phase
Bundle build time (sec) 9 6 12
Production build export size 104 KB 380 KB and increasing every build 292 KB
Network
JS files in browser (kB) 29,3 83,778 81,1
CSS files in browser (kB) 0,93 2,1 0,94
Total resources loaded (kB) 88,2 276 269
Total requests 8 19 6
DOM Content Loaded (sec) 1,13 0,581 1,31
Total Load (sec) 1,52 1,82 1,31
Coverage
Js code used (%) 82 74 74
CSS code used (%) 90 57 66
Lighthouse scoring
Performance 100 99 97
Accessibility 100 94 94
Best Practices 93 93 93
SEO 80 80 80
webpagetest.org scoring
First Byte (sec) 0,365 0,353 0,324
Start Render (sec) 0,7 0,6 1
First Contentful Paint (sec) 0,647 0,619 0,97
Largest contentful paint (sec) 0,646 0,619 0,97
Performance investigation
When pomodoro timer decreased by one second
Scripting (ms) 0,4 0,6 0,5
Rendering (ms) 0,3 0,3 0,3
Painting (ms) 0,2 0,2 0,2
System (ms) 0 0 0
When user click "pause" button and timer goest into on-pause-state
Scripting (ms) 3 5 3
Rendering (ms) 5 6 6
Painting (ms) 4 4 5
System (ms) 8 9 9
Route change behaviour (User goes to /config SPA page)
Scripting (ms) 5 9 10
Rendering (ms) 2 1 1
Painting (ms) 0,4 0,3 0,2
System (ms) 1 1 1