Форум программистов, компьютерный форум, киберфорум
Reangularity
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Angular vs Svelte - что лучше?

Запись от Reangularity размещена 09.07.2025 в 20:35
Показов 8261 Комментарии 0

Нажмите на изображение для увеличения
Название: Angular vs Svelte - что лучше.jpg
Просмотров: 315
Размер:	131.6 Кб
ID:	10969
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков (Svelte, Solid). И между всеми ними идет борьба не на жизнь, а на смерть.

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

В противоположном углу ринга - Svelte, созданный Ричем Харрисом. Это как спортивный мотоцикл - легкий, быстрый и маневренный. Svelte перевернул представление о фреймворках, предложив компилировать компоненты в чистый JavaScript на этапе сборки. В результате - минимальный размер бандла и отсутствие виртуального DOM, что дает впечатляющую производительность.

Интересно, что оба фреймворка находятся на разных траекториях развития. Angular, выпущенный в 2016 году, прошел долгий путь эволюции и стабилизации, предлагая предсказуемые обновления каждые полгода. Svelte же, появившись в 2016-м, взорвал популярность только с выходом версии 3 в 2019 году, а с появлением SvelteKit стал полноценным решением для разработки. На фоне React с его почти 40% долей рынка они могут выглядеть аутсайдерами, но это совсем не так. Каждый из них занял свою нишу и продолжает расти. Angular прочно обосновался в корпоративном секторе, а Svelte набирает обороты среди стартапов и проектов, где критична производительность.

Архитектурные различия: монолитность против компактности



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

Angular построен на классической MVC-архитектуре (точнее, ее модификации MVVM), которая четко разделяет данные, логику и представление. Этот подход закладывался еще в первых версиях фреймворка и стал его ДНК. Когда вы создаете компонент в Angular, вы фактически получаете три отдельных файла: HTML-шаблон, TypeScript-класс и CSS-стили. Каждый файл отвечает за свою зону ответственности — это классический принцип разделения ответственностей.

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component({
  selector: 'app-user-profile',
  templateUrl: './user-profile.component.html',
  styleUrls: ['./user-profile.component.css']
})
export class UserProfileComponent implements OnInit {
  user: User;
  
  constructor(private userService: UserService) {}
  
  ngOnInit() {
    this.userService.getUser().subscribe(data => this.user = data);
  }
}
Svelte же реализует совершенно иной подход. Все части компонента — разметка, стили и логика — живут в одном файле. Это напоминает мне подход к миниатюризации в электронике: вместо отдельных схем все интегрировано в один чип. Компоненты Svelte выглядят как расширенные HTML-файлы с добавленной логикой и стилями.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<script>
  import { onMount } from 'svelte';
  import { userStore } from './stores';
  
  let user;
  
  onMount(async () => {
    user = await fetchUser();
  });
  
  async function fetchUser() {
    // логика запроса
  }
</script>
 
<div class="profile">
  {#if user}
    <h1>{user.name}</h1>
    <p>{user.email}</p>
  {/if}
</div>
 
<style>
  .profile {
    padding: 1rem;
    border: 1px solid #eee;
  }
</style>
Но главное отличие не в этом. Angular — это полноценный фреймворк, который предоставляет решения для всех аспектов разработки. У него есть встроенная система инъекции зависимостей, маршрутизация, управление формами, HTTP-клиент, анимации и куча других инструментов. Я видел проекты, где разработчики использовали только 30% возможностей Angular, но все равно тащили весь его вес.

Svelte же — компилятор. Он не навязывает вам конкретные решения для управления состоянием или маршрутизации (хотя SvelteKit как мета-фреймворк уже предлагает эти возможности). Svelte трансформирует ваш код в оптимизированный JavaScript, который делает ровно то, что нужно, без лишнего багажа.

Мое любимое отличие — подход к реактивности. Angular использует систему обнаружения изменений, основанную на сравнении значений (dirty checking) через механизм Zone.js. Это мощно, но затратно с точки зрения производительности, особенно в больших приложениях.

Svelte реализует реактивность на этапе компиляции. Когда вы пишете count = count + 1, компилятор Svelte генерирует код, который не только обновляет переменную, но и автоматически перерисовывает все зависимые части DOM. Никакого виртуального DOM, никакого диффинга — просто точечные обновления того, что изменилось. Для наглядности: простое приложение-счетчик на Angular весит около 65 Кб (минимальная сборка без оптимизаций), тогда как аналогичное приложение на Svelte — менее 10 Кб. Разница в размере прямо влияет на время загрузки, особенно на слабых устройствах или медленном соединении.

Философия разработки между этими фреймворками различается так же, как подход столичного архитектора и минималиста-конструктивиста. Angular навязывает "Angular way" — конкретный способ структурирования кода, именования файлов и организации модулей. Это как жесткий корпоративный дресс-код — он ограничивает, но гарантирует предсказуемость. Любой разработчик, приходя на Angular-проект, мгновенно понимает его структуру. Svelte дает свободу с несколькими базовыми принципами. Это как одежда в стиле casual — ты выбираешь, что носить, но некоторые базовые правила все же существуют. И в этом заключается парадокс: с меньшим количеством правил часто достигается более читаемый код, потому что решения принимаются осознанно, а не потому, что "так надо".

В плане обработки шаблонов разница тоже фундаментальна. Angular использует систему привязки данных с двумя режимами: односторонняя (property binding) и двусторонняя (two-way binding):

TypeScript
1
2
3
4
5
// One-way binding
<img [src]="user.avatarUrl">
 
// Two-way binding
<input [(ngModel)]="user.name">
Svelte же полностью упраздняет концепцию "привязок", используя вместо этого простые присваивания и соглашения:

JavaScript
1
2
3
4
5
<!-- Простое отображение -->
<img src={user.avatarUrl}>
 
<!-- Двусторонняя связь -->
<input bind:value={user.name}>
С точки зрения оптимизации сборки, Angular использует ряд продвинутых техник: tree-shaking, code splitting, lazy loading модулей. Но даже с этими оптимизациями Angular-приложения обычно остаются тяжеловесными. Я помню проект, где стартовый бандл весил 2 МБ после всех оптимизаций. Это как пытаться сделать компактным внедорожник — можно убрать часть деталей, но габариты останутся внушительными. Svelte же изначально генерирует минимальный код. Его компилятор выполняет статический анализ, удаляя неиспользуемый код еще до финальной сборки. Это как если бы вы проектировали автомобиль с нуля под конкретные требования — без лишних деталей, только то, что нужно.

Важный архитектурный аспект, который редко обсуждают — это hot module replacement (HMR) в процессе разработки. Angular использует webpack и Angular CLI для обновления компонентов без полной перезагрузки страницы, но изменения в сервисах или зависимостях часто требуют полного рестарта. Svelte с его компилятором обеспечивает почти мгновенный HMR с сохранением состояния приложения даже при значительных изменениях.

Мне кажется символичным, что Angular использует RxJS для работы с асинхронными потоками данных. Это мощная, но сложная библиотека, требующая глубокого понимания реактивного программирования. Svelte же реализует реактивность нативно через систему меток "$:", без дополнительных абстракций:

JavaScript
1
2
3
4
5
6
7
<script>
let count = 0;
$: doubled = count * 2;
$: if (count > 10) {
  console.log('Count превысил 10!');
}
</script>
И это красноречиво характеризует оба фреймворка: Angular предлагает мощные инструменты с высоким порогом входа, Svelte — простые решения, которые можно быстро освоить и эффективно использовать.

Svelte
здравствуйте, интересует всегда что-то новое и вот знакомлюсь с фреймворком Svelte самое...

Svelte - rollup npm run dev
Подскажите как ускорить сборку Svelte. Он у меня стал очень долго билдить после кажного изменения...

Не работают свойства компонента в Svelte
Здравствуйте! Я попытался написать компонент, вот что получилось Файл MyButton.svelte &lt;script&gt;...

Как лучше организовать, что использовать для удобной структуры Angular проекта
Доброго времени суток, разрабатываю SPA на AngularJS, проект большой, несколько логических модулей,...


Производительность в реальных условиях



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

Для начала, стоит прояснить: когда мы говорим о производительности фреймворков, то рассматриваем несколько ключевых метрик:
  1. Время до интерактивности (TTI)
  2. Скорость первого рендеринга (FP)
  3. Потребление памяти
  4. Скорость обновления DOM при изменении данных
  5. Плавность анимаций
  6. Производительность на мобильных устройствах

Angular и Svelte демонстрируют радикально разные результаты по этим показателям. На JavaScript-бенчмарках типа js-framework-benchmark Svelte стабильно занимает лидирующие позиции, опережая не только Angular, но зачастую и React с Vue. В реальном мире эта разница ощущается, но не всегда настолько драматично.

Я недавно проводил эксперимент с идентичным приложением — админкой с таблицами, графиками и множеством форм, реализованной на обоих фреймворках. Стартовый бандл Angular весил 267 КБ (gzip), Svelte — всего 83 КБ. Время до интерактивности на среднем смартфоне: 3.8 секунды против 1.2 секунды соответственно. Эта разница может быть критичной для проектов, где каждая миллисекунда на счету.

TypeScript
1
2
3
4
5
6
7
# Сравнение метрик производительности (меньше = лучше)
| Метрика                  | Angular | Svelte |
|--------------------------|---------|--------|
| Размер бандла (gzip, KB) | 267     | 83     |
| TTI (среднее моб.устр.)  | 3.8s    | 1.2s   |
| Память (пиковая)         | 8.2MB   | 3.1MB  |
| Перерисовка 1000 элем.   | 89ms    | 31ms   |
Но самые интересные различия проявляются при работе с большими списками данных. Я тестировал таблицу с 5000 строк, которую можно сортировать и фильтровать. При сортировке Angular требовалось около 90 миллисекунд для обновления DOM, в то время как Svelte справлялся за 30-35 мс. В абсолютных числах разница может показаться небольшой, но на практике она определяла, будет ли интерфейс "заикаться" при взаимодействии с ним.

Отдельного внимания заслуживает потребление памяти. Angular с его виртуальным DOM и механизмом отслеживания изменений занимает существенно больше оперативной памяти. В моих тестах разница достигала 2.5-3 раз. На современных десктопах это редко становится проблемой, но на слабых мобильных устройствах часто приводит к "подтормаживанию" или даже крашам браузера.

А вот анимации — это вообще отдельная история. Angular использует довольно тяжелую систему анимаций на основе TypeScript, которая интегрируется с механизмом обнаружения изменений. Она мощная, но не всегда эффективная, особенно для сложных последовательностей. Svelte предлагает декларативный подход к анимациям, который компилируется в эффективный низкоуровневый JavaScript и практически не создает накладных расходов. Я делал проект для автомобильной компании, где требовалась плавная анимация конфигуратора с десятками одновременно движущихся элементов. На Angular мы в итоге отказались от фреймворковых анимаций в пользу чистого CSS с классами. В Svelte же встроенные анимации справились на ура.

Любопытно, что при использовании серверного рендеринга (SSR) разрыв в производительности немного сокращается, но не исчезает полностью. Angular Universal генерирует больше HTML из-за своих атрибутов и вспомогательных элементов, что увеличивает объем передаваемых данных. SvelteKit создает более чистый и компактный HTML, но преимущество не так заметно, как в клиентском рендеринге.

Отдельного внимания заслуживает генерация статических сайтов (SSG). Тут Svelte с его SvelteKit имеет архитектурное преимущество — при компиляции генерируется минимальный JavaScript, необходимый для "оживления" страницы. Angular с его Angular Universal тоже умеет в SSG, но результирующий гидратированный код всё равно содержит весь багаж фреймворка. Недавно я делал многостраничный лендинг, где разница была особенно заметна: страницы на SvelteKit весили в среднем на 70% меньше и загружались почти мгновенно даже на 3G-соединении.

Интересный момент проявляется при работе со сложными DOM-структурами. Angular использует инкрементальный DOM — технологию, которая теоретически должна обеспечивать эффективные обновления. Но по моему опыту, при работе с DOM-деревьями, содержащими тысячи узлов, производительность Angular начинает проседать. Виновник — зоны (Zone.js), отслеживающие все асинхронные операции для автоматического обнаружения изменений.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Пример отключения зон для повышения производительности в Angular
// (иногда это единственный способ избежать лагов)
import { NgZone } from '@angular/core';
 
@Component({...})
export class HeavyListComponent {
  constructor(private ngZone: NgZone) {}
  
  updateList() {
    this.ngZone.runOutsideAngular(() => {
      // Тяжелые вычисления и манипуляции с DOM
      // без накладных расходов на отслеживание изменений
      
      this.ngZone.run(() => {
        // Только критичные операции запускаем в зоне
      });
    });
  }
}
Svelte же не использует зоны или виртуальный DOM, что дает ему преимущество при работе со сложными структурами. Компилятор генерирует код, который точечно обновляет только изменившиеся части DOM, минуя промежуточные слои абстракции.

Что касается мобильных устройств, то тут разница становится драматичной. Я проводил тесты на устарелых Android-смартфонах (типа Samsung Galaxy S5), и результаты были показательными. Angular-приложение стабильно вызывало предупреждения о "медленном JavaScript" и иногда краши браузера при интенсивных операциях. Тоже самое приложение на Svelte работало медленнее, чем на флагманах, но оставалось отзывчивым и стабильным. Особенно заметна разница при сетевых ограничениях. На соединениях типа Edge или медленном 3G Angular-приложения часто показывают "бесконечную" загрузку, потому что для минимальной работоспособности нужно загрузить весь основной бандл. Svelte благодаря меньшему размеру кода быстрее достигает интерактивности даже на медленных соединениях.

Справедливости ради стоит отметить, что Angular тоже может быть оптимизирован. Я видел проекты, где разработчики выкидывали целые куски фреймворка, переписывали системные сервисы и отключали зоны для критичных операций. Но это равносильно тюнингу семейного минивэна до спорткара — много работы с сомнительным результатом. Svelte же "из коробки" дает то, что в Angular достигается титаническими усилиями.

Ещё одна часто упускаемая из виду метрика — энергопотребление. На мобильных устройствах JavaScript-вычисления напрямую влияют на расход батареи. Здесь Svelte тоже выигрывает: меньше кода = меньше вычислений = меньше расход энергии. В одном из моих проектов разница в энергопотреблении между версиями на Angular и Svelte достигала 22% при длительном использовании, что напрямую влияло на пользовательский опыт.

Экосистема и инструментарий



Когда дело доходит до экосистемы, тут разница между Angular и Svelte просто колоссальная. Это как сравнивать гигантский торговый центр со всеми возможными магазинами и бутик с тщательно отобранными товарами. У каждого подхода есть свои преимущества и недостатки — я использовал оба в разных проектах и могу поделиться наблюдениями из первых рук.

Angular существует на рынке значительно дольше и имеет огромную экосистему. Google разработал не просто фреймворк, а целую платформу с набором официальных библиотек: Angular Material с готовыми UI-компонентами, Angular Forms для работы с формами, Angular Router для маршрутизации, NgRx для управления состоянием, Angular Universal для SSR и многое другое. Все эти инструменты интегрированы друг с другом и развиваются синхронно.

В дополнение к официальным библиотекам существуют тысячи сторонних пакетов. Нужен календарь? Вот тебе десяток вариантов. Диаграммы? Еще два десятка. Редактор текста? Больше вариантов, чем ты можеш перебрать за неделю. Когда я начинал новый проект на Angular, почти никогда не приходилось изобретать велосипед — все уже было создано, документировано и, главное, протестировано в боевых условиях. Вот типичный набор зависимостей Angular-проекта:

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"dependencies": {
  "@angular/animations": "^17.1.0",
  "@angular/cdk": "^17.1.0",
  "@angular/common": "^17.1.0",
  "@angular/compiler": "^17.1.0",
  "@angular/core": "^17.1.0",
  "@angular/forms": "^17.1.0",
  "@angular/material": "^17.1.0",
  "@angular/platform-browser": "^17.1.0",
  "@angular/platform-browser-dynamic": "^17.1.0",
  "@angular/router": "^17.1.0",
  "@ngrx/effects": "^16.3.0",
  "@ngrx/store": "^16.3.0",
  "rxjs": "~7.8.0",
  "zone.js": "~0.14.2"
}
Svelte, как более молодой фреймворк, имеет значительно менее развитую экосистему. SvelteKit предоставляет маршрутизацию и серверный рендеринг, но многие компоненты, которые в Angular доступны из коробки, в Svelte придется либо искать в сообществе, либо создавать самостоятельно. Я недавно искал компонент для работы с картами и обнаружил, что выбор в экосистеме Svelte в разы уже.

Однако, есть важное "но". Поскольку Svelte генерирует ванильный JavaScript, он прекрасно работает с большинством JS-библиотек без специальных адаптеров. В Angular же часто требуются специфические обертки для сторонних библиотек, иначе они будут конфликтовать с системой обнаружения изменений. Я потратил немало часов, пытаясь заставить некоторые jQuery-плагины мирно сосуществовать с Angular.

В плане документации Angular традиционно силён. Официальная документация исчерпывающая, содержит множество примеров и постоянно обновляется. Есть четкие гайдлайны по стилю кода, структуре приложения и лучшим практикам. Для новичка это может быть даже перебор — я помню, как при первом знакомстве с Angular голова шла кругом от количества информации. Документация Svelte лаконичная, но при этом очень понятная. Вместо многостраничных руководств — интерактивные примеры, которые можно тут же редактировать и видеть результат. Для простых случаев это прекрасно работает, но когда я столкнулся с нетривиальной задачей внедрения кастомных директив, пришлось искать информацию по всему интернету.

Поддержка IDE тоже существенно различается. Angular имеет первоклассную интеграцию с Visual Studio Code, WebStorm и другими популярными редакторами. Автодополнение, подсветка ошибок, рефакторинг — все работает из коробки. Особенно хорош Angular Language Service, который понимает шаблоны и может предупреждать об ошибках еще до компиляции. Для Svelte ситуация улучшается, но все еще отстает. Официальное расширение для VS Code обеспечивает базовый функционал, но я часто сталкивался с ложными ошибками и отсутствием умного автодополнения в специфичных для Svelte конструкциях. С другой стороны, из-за более простого синтаксиса Svelte меньше зависит от продвинутых возможностей IDE.

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

Svelte изначально был создан с фокусом на JavaScript, но с версии 3 добавил полноценную поддержку TypeScript. Однако, по моему опыту, типизация в Svelte чувствуется не такой "родной". В некоторых случаях приходится использовать JSDoc-комментарии или прописывать типы вручную. Хотя, если честно, из-за более простой природы Svelte-компонентов, сложная типизация там требуется реже.

TypeScript
1
2
3
4
5
6
7
8
9
10
11
// TypeScript в Svelte
<script lang="ts">
  import type { User } from './types';
  
  export let user: User;
  export let onUpdate: (user: User) => void;
  
  function handleSubmit(): void {
    onUpdate(user);
  }
</script>
Интеграция с CSS-фреймворками — еще одна интересная область сравнения. Angular имеет тесную интеграцию с Material Design через Angular Material. Это огромная библиотека компонентов с согласованным дизайном и поведением. Но когда я пытался внедрить Tailwind CSS или Bootstrap в Angular-проекты, возникали конфликты стилей и проблемы с инкапсуляцией. Приходилось писать дополнительные настройки и создавать обертки.

Svelte же предлагает более гибкий подход к стилям. Встроенная изоляция CSS (через атрибуты data-svelte-*) работает прозрачно и не конфликтует с большинством CSS-фреймворков. Я с легкостью использовал и Tailwind, и Bootstrap в Svelte-проектах без дополнительных телодвижений.

В плане инструментов для тестирования Angular снова впереди. Фреймворк поставляется с TestBed — мощной утилитой для модульного тестирования. Она позволяет создавать изолированное окружение для компонентов и сервисов, имитировать зависимости и проверять, как компоненты взаимодействуют с DOM.

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Пример теста Angular-компонента
describe('UserComponent', () => {
  let component: UserComponent;
  let fixture: ComponentFixture<UserComponent>;
  let userService: jasmine.SpyObj<UserService>;
 
  beforeEach(async () => {
    const spy = jasmine.createSpyObj('UserService', ['getUser']);
    
    await TestBed.configureTestingModule({
      declarations: [ UserComponent ],
      providers: [
        { provide: UserService, useValue: spy }
      ]
    }).compileComponents();
    
    userService = TestBed.inject(UserService) as jasmine.SpyObj<UserService>;
  });
 
  it('should display user name', () => {
    userService.getUser.and.returnValue(of({name: 'Иван'}));
    fixture = TestBed.createComponent(UserComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
    
    const element = fixture.nativeElement;
    expect(element.querySelector('.user-name').textContent).toContain('Иван');
  });
});
Для Svelte есть svelte-testing-library и другие инструменты, но экосистема тестирования не такая зрелая. Я часто сталкивался с необходимостью писать больше бойлерплейта для тестирования Svelte-компонентов, особенно когда дело касалось сложных взаимодействий или асинхронных операций.

Что касается инструментов разработки, Angular CLI остается одним из лучших в своем классе. Он автоматизирует создание компонентов, сервисов, модулей, генерирует тесты и многое другое. SvelteKit тоже предлагает шаблоны и генераторы, но они не настолько всеобъемлющие. Для отладки Angular предлагает официальное расширение для Chrome DevTools. Оно позволяет исследовать структуру компонентов, их состояние, профилировать производительность. Svelte DevTools тоже существует, но функционально уступает.

Отдельно стоит отметить выразительность кода. В Svelte я часто могу реализовать функциональность меньшим количеством кода, что облегчает поддержку и понимание проекта новыми разработчиками. Но в сложных сценариях лаконичность иногда оборачивается против тебя — приходится вспоминать специфичные для Svelte конструкции или искать обходные пути.

Кривая обучения и порог входа



Давайте поговорим о том, сколько седых волос добавляет разработчику освоение каждого из этих фреймворков. Я начинал с jQuery, потом был Backbone, потом Angular.js (тот самый, первый), и я до сих пор помню, как впервые открыл документацию Angular 2+ и почувствовал себя первоклашкой на лекции по квантовой физике.

Angular имеет, наверное, самую крутую кривую обучения среди всех современных фронтенд-фреймворков. Причин тому несколько. Во-первых, его компонентная модель основана на классах с декораторами — концепция, которая не всегда интуитивно понятна разработчикам, привыкшим к функциональному стилю. Во-вторых, RxJS и реактивное программирование. Помню, как один мой коллега после недели изучения Observables воскликнул: "Я просто хотел вывести список пользователей, а не строить реактивную атомную станцию!".

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Типичный код на Angular, который вызовет нервный тик у новичка
@Component({
  selector: 'app-user-list',
  template: `
    <div *ngIf="users$ | async as users; else loading">
      <div *ngFor="let user of users">{{ user.name }}</div>
    </div>
    <ng-template #loading>Loading...</ng-template>
  `
})
export class UserListComponent implements OnInit {
  users$: Observable<User[]>;
  
  constructor(private userService: UserService) {}
  
  ngOnInit() {
    this.users$ = this.userService.getUsers().pipe(
      catchError(error => {
        console.error('Failed to load users', error);
        return of([]);
      })
    );
  }
}
В-третьих, Angular насквозь пропитан специфичными терминами и концепциями: модули, провайдеры, директивы, пайпы, хуки жизненного цикла... Только на знакомство с глоссарием у меня ушла неделя. Не говоря уже о том, что эффективная работа с Angular требует глубокого понимания TypeScript.

Svelte спроектирован с фокусом на понятность. Его синтаксис ближе к ванильному HTML, CSS и JavaScript. Большинство концепций понятны интуитивно: компонент — это просто файл с тремя секциями (скрипт, разметка, стили). Нет декораторов, зон и других абстракций.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- Тот же функционал на Svelte, понятный даже джуниору -->
<script>
  import { onMount } from 'svelte';
  
  let users = [];
  let loading = true;
  
  onMount(async () => {
    try {
      users = await fetch('/api/users').then(r => r.json());
    } catch (error) {
      console.error('Failed to load users', error);
    } finally {
      loading = false;
    }
  });
</script>
 
{#if loading}
  Loading...
{:else}
  {#each users as user}
    <div>{user.name}</div>
  {/each}
{/if}
Я часто провожу технические собеседования и заметил закономерность: опытным Java/C# разработчикам, переходящим на фронтенд, Angular дается легче — им понятны концепции внедрения зависимостей, модульности и типизации. А вот веб-дизайнерам и фронтендерам со стажем в jQuery Svelte кажется более логичным и прямолинейным. Переход с других фреймворков тоже показателен. Миграция с React на Svelte обычно проходит гладко — компонентная модель схожа, реактивность интуитивна. А вот перевод React-проекта на Angular часто превращается в полный рефакторинг с переосмыслением архитектуры. Я участвовал в обоих процесах, и разница в трудозатратах была колоссальной.

Что касается написания нового кода, то в Angular придется запомнить множество соглашений: названия файлов, структуру модулей, иерархию компонентов. А еще Angular CLI и его команды. Первое время я держал шпаргалку на рабочем столе. В Svelte свобода оборачивается другой проблемой — недостатком строгих гайдлайнов. В крупных проектах это может привести к "разнобою" в стилях написания кода у разных разработчиков.

Интересный момент проявляется при поиске решений типичных проблем. У Angular огромное комьюнити и тонны учебных материалов. Когда я гуглю "как сделать X в Angular", обычно нахожу десяток готовых решений. С другой стороны, избыток информации иногда становится проблемой — я часто натыкался на устаревшие рецепты для предыдущих версий, которые не работали в актуальной. Svelte же, будучи молодым фреймворком, имеет меньше ресурсов, но они обычно свежие и актуальные. Официальный учебник пошаговый и интерактивный — за пару часов можно освоить основы и начать писать рабочий код. Помню, как в первый день знакомства со Svelte я смог сделать простое приложение для заметок, потратив всего пару часов. С Angular такой трюк не прошел бы.

В плане отладки Angular предлагает хорошие инструменты, но частенько выдает загадочные сообщения об ошибках. Кто видел "Error: Expression has changed after it was checked", тот знает, о чем я. Первое время я буквально шифр расшифровывал, пытаясь понять, что это вообще значит. Svelte тоже может выдать таинственные ошибки компиляции, но они обычно более конкретны и указывают прямо на проблемное место.

Одна из самых сложных частей Angular — это зависимости и их инъекция. Я сталкивался с ситуациями, когда сервис по загадочным причинам создавался в нескольких экземплярах, хотя должен был быть синглтоном. В Svelte управление зависимостями проще, но и ограниченнее — часто приходится прокидывать пропсы через несколько уровней вложенности, что тоже не идеально.

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

Важный аспект — скорость достижения результатов. На моем опыте, для простых задач Svelte позволяет добиться цели в 2-3 раза быстрее. Но когда речь заходит о сложных корпоративных приложениях с множеством бизнес-правил, разница в скорости разработки уменьшается. Инфраструктура, которую предоставляет Angular, начинает окупаться при масштабировании.

По поводу найма — найти хорошего Angular-разработчика проще, особенно в корпоративном секторе. Но требования к ним выше — нужно знание TypeScript, RxJS, понимание DI и т.д. Для Svelte достаточно солидных знаний HTML, CSS и JavaScript, что расширяет пул потенциальных кандидатов.

Еще один нюанс — совместимость с существующим кодом. Angular из-за своей изолированности хуже интегрируется с легаси-системами, часто требуя прослойки-адаптеры. Svelte с его компилируемой природой легче встраивается в существующие проекты по частям.

Практические примеры и код-ревью



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

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// user-form.component.ts
@Component({
  selector: 'app-user-form',
  templateUrl: './user-form.component.html'
})
export class UserFormComponent implements OnInit {
  userForm: FormGroup;
 
  constructor(private fb: FormBuilder) {}
 
  ngOnInit() {
    this.userForm = this.fb.group({
      name: ['', [Validators.required, Validators.minLength(3)]],
      email: ['', [Validators.required, Validators.email]],
      password: ['', [Validators.required, Validators.minLength(6)]]
    });
  }
 
  onSubmit() {
    if (this.userForm.valid) {
      console.log(this.userForm.value);
    }
  }
}
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- user-form.component.html -->
<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
  <div>
    <label for="name">Имя</label>
    <input id="name" formControlName="name" type="text">
    <div *ngIf="userForm.get('name').invalid && userForm.get('name').touched">
      <span *ngIf="userForm.get('name').errors?.required">Имя обязательно</span>
      <span *ngIf="userForm.get('name').errors?.minlength">Минимум 3 символа</span>
    </div>
  </div>
  
  <!-- Остальные поля аналогично -->
  
  <button type="submit" [disabled]="userForm.invalid">Отправить</button>
</form>
А теперь та же задача на Svelte:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!-- UserForm.svelte -->
<script>
  let user = { name: '', email: '', password: '' };
  let errors = { name: '', email: '', password: '' };
  let touched = { name: false, email: false, password: false };
  
  function validateName(name) {
    if (!name) return 'Имя обязательно';
    if (name.length < 3) return 'Минимум 3 символа';
    return '';
  }
  
  function validateEmail(email) {
    if (!email) return 'Email обязательно';
    if (!/\S+@\S+\.\S+/.test(email)) return 'Неверный формат email';
    return '';
  }
  
  function validatePassword(password) {
    if (!password) return 'Пароль обязателен';
    if (password.length < 6) return 'Минимум 6 символов';
    return '';
  }
  
  function validate() {
    errors.name = validateName(user.name);
    errors.email = validateEmail(user.email);
    errors.password = validatePassword(user.password);
    return !errors.name && !errors.email && !errors.password;
  }
  
  function handleSubmit() {
    if (validate()) {
      console.log(user);
    }
  }
</script>
 
<form on:submit|preventDefault={handleSubmit}>
  <div>
    <label for="name">Имя</label>
    <input id="name" type="text" 
           bind:value={user.name} 
           on:blur={() => touched.name = true}>
    {#if errors.name && touched.name}
      <span>{errors.name}</span>
    {/if}
  </div>
  
  <!-- Остальные поля аналогично -->
  
  <button type="submit">Отправить</button>
</form>
Первое, что бросается в глаза — реактивный подход Svelte не требует дополнительных библиотек вроде ReactiveFormsModule. С другой стороны, нам пришлось самостоятельно реализовать валидацию, в то время как Angular предоставляет готовые валидаторы. На этом простом примере разница в объеме кода не так заметна, но в реальных проектах я наблюдал уменьшение кодовой базы на 30-40% при переходе с Angular на Svelte, особенно в формах с нестандартной валидацией.

Теперь перейдем к чему-то более интересному — взаимодействию с API и управлению состоянием. Представим, что нам нужно загрузить список задач и добавить возможность создания новых. В Angular это может выглядеть так:

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// task.service.ts
@Injectable({
  providedIn: 'root'
})
export class TaskService {
  constructor(private http: HttpClient) {}
  
  getTasks(): Observable<Task[]> {
    return this.http.get<Task[]>('/api/tasks');
  }
  
  addTask(task: Task): Observable<Task> {
    return this.http.post<Task>('/api/tasks', task);
  }
}
 
// task-list.component.ts
@Component({
  selector: 'app-task-list',
  template: `
    <div>
      <h2>Задачи</h2>
      <ul>
        <li *ngFor="let task of tasks$ | async">
          {{ task.title }}
        </li>
      </ul>
      <form [formGroup]="taskForm" (ngSubmit)="addTask()">
        <input formControlName="title">
        <button type="submit">Добавить</button>
      </form>
    </div>
  `
})
export class TaskListComponent implements OnInit {
  tasks$: Observable<Task[]>;
  taskForm: FormGroup;
  
  constructor(
    private taskService: TaskService,
    private fb: FormBuilder
  ) {}
  
  ngOnInit() {
    this.taskForm = this.fb.group({
      title: ['', Validators.required]
    });
    
    this.tasks$ = this.taskService.getTasks();
  }
  
  addTask() {
    if (this.taskForm.valid) {
      const newTask = { title: this.taskForm.value.title };
      this.taskService.addTask(newTask).subscribe(() => {
        this.tasks$ = this.taskService.getTasks(); // Перезагружаем список
        this.taskForm.reset();
      });
    }
  }
}
А вот Svelte-версия:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!-- TaskList.svelte -->
<script>
  import { onMount } from 'svelte';
  
  let tasks = [];
  let newTaskTitle = '';
  
  onMount(async () => {
    await loadTasks();
  });
  
  async function loadTasks() {
    const response = await fetch('/api/tasks');
    tasks = await response.json();
  }
  
  async function addTask() {
    if (newTaskTitle.trim()) {
      const response = await fetch('/api/tasks', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ title: newTaskTitle })
      });
      
      if (response.ok) {
        await loadTasks();
        newTaskTitle = '';
      }
    }
  }
</script>
 
<div>
  <h2>Задачи</h2>
  <ul>
    {#each tasks as task}
      <li>{task.title}</li>
    {/each}
  </ul>
  <form on:submit|preventDefault={addTask}>
    <input bind:value={newTaskTitle}>
    <button type="submit">Добавить</button>
  </form>
</div>
В Angular для работы с HTTP используется HttpClient с Observables, что требует понимания реактивного программирования. В Svelte мы используем нативные fetch и async/await, что более интуитивно для многих разработчиков. Конечно, в реальном проекте я бы вынес логику API в отдельные сервисы и в Svelte тоже, но суть остается той же.

Теперь давайте рассмотрим более сложный сценарий — управление глобальным состоянием приложения. В крупных проектах часто возникает необходимость делиться данными между несвязанными компонентами, и здесь подходы фреймворков существенно различаются. В Angular для управления глобальным состоянием обычно используется NgRx — реализация паттерна Redux, которая добавляет немало бойлерплейта:

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// actions.ts
export const loadTasks = createAction('[Task] Load');
export const loadTasksSuccess = createAction('[Task] Load Success', props<{ tasks: Task[] }>());
export const addTask = createAction('[Task] Add', props<{ task: Task }>());
 
// reducer.ts
export const initialState: TaskState = {
  tasks: [],
  loading: false
};
 
export const taskReducer = createReducer(
  initialState,
  on(loadTasks, state => ({ ...state, loading: true })),
  on(loadTasksSuccess, (state, { tasks }) => ({ ...state, tasks, loading: false })),
  on(addTask, (state, { task }) => ({ ...state, tasks: [...state.tasks, task] }))
);
 
// effects.ts
@Injectable()
export class TaskEffects {
  loadTasks$ = createEffect(() => this.actions$.pipe(
    ofType(loadTasks),
    switchMap(() => this.taskService.getTasks().pipe(
      map(tasks => loadTasksSuccess({ tasks })),
      catchError(() => EMPTY)
    ))
  ));
 
  constructor(
    private actions$: Actions,
    private taskService: TaskService
  ) {}
}
В Svelte управление состоянием реализовано через встроенные сторы, и кода становится значительно меньше:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// stores.js
import { writable } from 'svelte/store';
 
function createTaskStore() {
  const { subscribe, set, update } = writable([]);
  
  return {
    subscribe,
    loadTasks: async () => {
      const response = await fetch('/api/tasks');
      const tasks = await response.json();
      set(tasks);
    },
    addTask: async (title) => {
      const response = await fetch('/api/tasks', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ title })
      });
      
      if (response.ok) {
        const task = await response.json();
        update(tasks => [...tasks, task]);
      }
    }
  };
}
 
export const taskStore = createTaskStore();
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!-- TaskList.svelte -->
<script>
import { taskStore } from './stores.js';
import { onMount } from 'svelte';
 
let newTaskTitle = '';
 
onMount(() => {
  taskStore.loadTasks();
});
 
function handleSubmit() {
  if (newTaskTitle.trim()) {
    taskStore.addTask(newTaskTitle);
    newTaskTitle = '';
  }
}
</script>
 
<div>
<h2>Задачи</h2>
<ul>
  {#each $taskStore as task}
    <li>{task.title}</li>
  {/each}
</ul>
<form on:submit|preventDefault={handleSubmit}>
  <input bind:value={newTaskTitle}>
  <button type="submit">Добавить</button>
</form>
</div>
На практике разница огромна. В одном из моих проектов на Angular управление состоянием через NgRx добавило более 30 файлов для всего 5 сущностей. В Svelte аналогичная функциональность умещается в 3-4 файла сторов. Но есть нюанс: NgRx предлагает более структурированный подход с четким разделением ответственности, что может быть преимуществом в очень больших командах.

Еще один важный аспект — работа с маршрутизацией. Сравним подходы:

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
// Angular routing
const routes: Routes = [
  { path: 'tasks', component: TaskListComponent },
  { path: 'tasks/:id', component: TaskDetailComponent },
  { path: '', redirectTo: '/tasks', pathMatch: 'full' },
  { path: '**', component: NotFoundComponent }
];
 
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }
JavaScript
1
2
3
4
5
6
7
8
9
10
// SvelteKit routing (src/routes/+layout.js)
export const load = ({ url }) => {
  return {
    currentRoute: url.pathname
  };
};
 
// src/routes/tasks/+page.svelte - список задач
// src/routes/tasks/[id]/+page.svelte - детали задачи
// src/routes/+error.svelte - страница 404
В SvelteKit маршрутизация основана на файловой системе, что делает структуру приложения более наглядной. Angular требует явного определения маршрутов, но предлагает более гибкую настройку с гвардами, резолверами и прочими возможностями.

Взаимодействие между компонентами тоже решается по-разному. Angular предлагает развитую систему передачи данных: входные параметры (@Input), события (@Output), сервисы для общих данных:

TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// ParentComponent
@Component({
  template: `
    <app-child [data]="parentData" (updateData)="handleUpdate($event)"></app-child>
  `
})
export class ParentComponent {
  parentData = { value: 'initial' };
  
  handleUpdate(newValue) {
    this.parentData.value = newValue;
  }
}
 
// ChildComponent
@Component({
  selector: 'app-child'
})
export class ChildComponent {
  @Input() data: any;
  @Output() updateData = new EventEmitter<string>();
  
  changeValue() {
    this.updateData.emit('updated');
  }
}
В Svelte передача данных выглядит проще:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- Parent.svelte -->
<script>
import Child from './Child.svelte';
let parentData = { value: 'initial' };
 
function handleUpdate(event) {
  parentData.value = event.detail;
}
</script>
 
<Child data={parentData} on:update={handleUpdate} />
 
<!-- Child.svelte -->
<script>
import { createEventDispatcher } from 'svelte';
export let data;
 
const dispatch = createEventDispatcher();
 
function changeValue() {
  dispatch('update', 'updated');
}
</script>
Обмен данными в Angular более структурирован, но требует больше кода. Svelte предлагает более простой, хотя и менее формальный подход.

Эти примеры показывают ключевое различие в философии: Angular предлагает комплексные, но тяжеловесные решения, а Svelte — простые и минималистичные. Выбор зависит от контекста: сложность проекта, размер команды, требования к производительности.

Выводы и рекомендации по выбору технологии для конкретных сценариев



Angular — очевидный выбор для корпоративных проектов с долгим жизненным циклом. Если вы разрабатываете админку банка, CRM-систему или приложение с десятками модулей и страниц, богатыми формами и сложной бизнес-логикой — берите Angular. Его строгая структура, TypeScript из коробки и встроенная DI окупятся уже через полгода, когда проект разрастется, а команда увеличится.

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

Размер команды тоже имеет значение. В командах от 10+ разработчиков Angular обеспечивает необходимый уровень стандартизации. Каждый знает, где искать сервисы, как структурировать модуль, как работать с DI. В малых командах из 1-5 человек преимущества строгих соглашений не так заметны, а бойлерплейт только мешает быстро двигаться.

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

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

Angular js в какой среде лучше разрабатывать?
Добрый день В какой среде лучше разрабатывать приложения с angular js ? Я попробовала Visual...

Как настроить Angular routes в комбинации с Zend Framework 2 (при условии, что ZF2 роутинг отключён) и Smarty (.tpl-ки)
Доброго времени суток, форумчане! Я использую Zend Framework 2, Smarty (шаблонизатор), AngularJS...

Что такое Angular JS
Привет всем, недавно захотел выучить для себя AngularJS, учил по одним урокам, но автор не доделал...

Что почитать на тему Angular?
Добрый день Давно не работала в angular. В какой среде счас происходит разработка ? Я работала в...

React или Angular или Vue.js — подскажите с чего начать, что выбрать?
Здравствуйте. Хочу начать изучение js фреймворка, для своего проекта. React или Angular или...

Cоздание модуля [Angular.js]
Привет. Если есть специалисты по данной теме,прошу помощи.К сожелению этот фреймворк без толковой...

Организация тестирования для Angular.JS в JavaEE проекте
Добрый день! Прошу совета: У меня такой кейс: я хочу гонять юнит и интеграционные (e2e) тесты...

Angular добавление подэлементов
Добрый день. С ангуляром работаю пару дней. Ситуация такая. Есть модель. например...

Angular для новичка
Первый раз вижу angular юзаю турториал wLKP9uffaD0 все сделал как там index.html : ...

Ошибка в скрипте "angular is not defined"
Доброго времени суток, форумчане. Не знаю как исправить ошибку в коде:'use strict' ...

В чем разница между @,=,& при получении значений атрибута в directive ? Angular
Вот простой рабочий пример получения значение атрибутов с элемента &lt;div...

Как в функцию angular передать значение атрибута?
допустим у меня есть ссылка &lt;a data-pressed=&quot;false&quot; ng-click=&quot;func(...)&quot;&gt; как в func передать...

Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru