<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Angular</title>
    <description/>
    <link>https://tproger.ru/tag/angular</link>
    <atom:link href="https://tproger.ru/tag/angular/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Fri, 23 Oct 2026 22:48:04 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Angular</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Переход с React на Angular в 2026: как перестроить мышление и не сгореть</title>
      <link>https://tproger.ru/articles/perehod-s-react-na-angular-v-2026-kak-perestroit-mywlenie-i-ne</link>
      <comments>https://tproger.ru/articles/perehod-s-react-na-angular-v-2026-kak-perestroit-mywlenie-i-ne?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дима Дмитриев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/perehod-s-react-na-angular-v-2026-kak-perestroit-mywlenie-i-ne</guid>
      <description><![CDATA[<p>Разбор перехода с React на Angular: архитектура компонентов, ООП вместо хуков, RxJS и поиск циклических зависимостей. Узнайте, когда брать Angular.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/perehod-s-react-na-angular-v-2026-kak-perestroit-mywlenie-i-ne">Переход с React на Angular в 2026: как перестроить мышление и не сгореть</a>»</p>]]></description>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 31 Jul 2026 05:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда я говорю, что перешёл с React на Angular обычно в ответ у коллег слишком много вопросов и ни одного ответа. Если открыть типичные статьи, там везде предлагают React, Next.js и React Native. Про переход с Angular на React вы наверняка уже читали и смотрели много гайдов, а вот обратный путь почти никто не описывал.</p><p>Мне пришлось разбираться самому, когда я пришёл на новый проект, где на этапе знакомства с системой я понял: сделать её на React технически можно, но нужно постоянно собирать структуру с нуля. Angular с его сложной архитектурой, сервисами и строгой типизацией казался оптимальным решением для такого масштаба.</p><p>Теоретически получить базовое понимание фреймворка можно за десять дней курсов, но у меня ушло минимум полтора месяца, чтобы перестать мысленно переводить конструкции React на Angular и начать просто писать код.</p><h2>Разделение ответственности и файловая структура</h2><p>Главный сдвиг в голове при переходе с React — смена подхода, где компоненты несут всю нагрузку, на архитектуру, построенную на классах и ООП. В React привыкаешь думать компонентами: каждый кусок интерфейса представляет собой функцию, которая принимает пропсы и возвращает разметку. Вся логика и JSX-шаблон живут в одном файле, всё плоское и перед глазами. В Angular приходится перестраиваться и думать объектами и иерархиями.</p><p>Разделение на файлы поначалу вызывает раздражение. Вместо одного файла здесь сразу три: отдельный HTML-шаблон, стили и TypeScript-класс компонента, взаимодействующие через декораторы. Если нужно сделать маленький компонент-иконку для рендеринга SVG, Angular всё равно потребует три файла. Инлайн-шаблоны сделать можно, но это считается плохой практикой. Переключение между файлами поначалу отвлекает, но когда шаблон становится большим и сложным, работать с ним как с отдельным документом оказывается удобно.</p><p>Проект в Angular организуется по строгой структуре: сначала выделяются библиотеки (libs), внутри них — фичи (features), и только внутри фич живут компоненты. В React всё обычно проще и ограничивается папками с компонентами, которые используют друг друга.</p><h2>От функций и хуков к ООП и наследованию</h2><p>В React для переиспользования похожей логики создается несколько компонентов, а общее состояние выносится в кастомный хук. Из-за этого в крупном проекте бывает легко потерять связь и перестать понимать, откуда именно берутся данные. В Angular эта задача решается через классическое наследование классов.</p><p>Архитектура строится вокруг базовых классов с общими методами и свойствами, от которых наследуются конкретные сущности. Если создать базовый класс Animal, дочерние классы Cat, Duck или Elephant получат его функциональность и добавят собственные уникальные атрибуты, не затрагивая родительский код. Когда нужно исправить или обновить базовую логику, нужно только внести изменения в одном месте, и они автоматически разойдутся по всей иерархии.</p><h2>Асинхронные данные и реактивные потоки RxJS</h2><p>Больше всего при переходе на Angular пугает RxJS. В React мы привыкли явно запрашивать данные и ждать ответа, а здесь приходится подписываться на поток и реагировать на каждое его изменение. Данные идут сами и непрерывно, а главная задача разработчика — правильно их направить: отфильтровать лишнее, объединить несколько потоков в один и вовремя отписаться, чтобы избежать утечек памяти.</p><p>В реальном коде это выглядит как цепочка операторов, модифицирующих данные до их попадания в компонент. Проблема в том, что в RxJS около 50 операторов, и для нормальной работы нужно сходу знать хотя бы 10-15 из них, без этого читать чужой код не получится.</p><p>На адаптацию уходит время: сначала приходишь в документацию за каждым оператором, а затем вырабатывается инстинкт. Начинаешь сразу видеть, где применить switchMap, а где добавить takeUntilDestroyed для автоматической очистки ресурсов. Это похоже на изучение иностранного языка — сначала переводишь каждое слово, а потом начинаешь думать на нем.</p><h2>Встроенный tooling: формы, CLI и декораторы</h2><p>Когда от стадии “отрицания” переходишь к “принятию” подхода, начинаешь замечать вещи, за которые Angular хочется любить. Первое, что бросается в глаза после React, — работа с формами. В React каждый раз приходится выбирать между React Hook Form, Formik и другими решениями, разбираясь в новой библиотеке на каждом проекте. В Angular работы с формами встроена в сам фреймворк: есть задокументированные Template-driven и Reactive Forms. Реактивные формы позволяют прописать объект FormGroup и всю валидацию прямо в TypeScript. В сложных конструкторах с вложенной логикой и зависимыми полями это полностью закрывает задачи без поиска сторонних пакетов на npm.</p><p>Следом привыкаешь к CLI, который буквально не даёт сделать что-то неправильно. Для нового компонента достаточно выполнить ng generate component auth-form — инструмент сам создаст файлы и зарегистрирует компонент в модуле. Точно так же одной командой генерируются сервисы и модули с маршрутизацией. Инструмент выполняет рутину по единственному правильному шаблону, который при необходимости можно настроить под проект.</p><p>Приятно удивляет и декоратор @HostBinding. Если в React для добавления CSS-класса по условию приходится писать логику в JSX или выносить её в отдельную функцию, то в Angular достаточно повесить одну строчку над свойством класса. Класс сам появляется или исчезает на хост-элементе в зависимости от значения, не создавая лишнего шума в шаблоне.</p><h2>Диагностика циклических зависимостей</h2><p>Самая противная проблема в Angular — циклические зависимости. Это ситуация, когда Сервис А зависит от Сервиса Б, а Сервис Б где-то дальше по цепочке ссылается на Сервис А. Фреймворк далеко не всегда ясно указывает на место ошибки: приложение может просто упасть при старте или вывести в консоль сбой, указывающий совсем не на ту причину.</p><p>На поиск подобного бага можно легко убить полдня, если перебирать компоненты вручную. В React такие проблемы возникают реже — там меньше неявных связей, а ошибка обычно располагается ближе к источнику. В Angular нужно учиться думать деревьями и графами.</p><p>Для выхода из этой ситуации есть инструмент Nx и команда nx dep-graph (или nx graph). Она визуализирует интерактивную карту проекта прямо в браузере, рисуя дерево связей между всеми библиотеками. Если в проекте появился закольцованный цикл, команда автоматически подсвечивает его красным цветом.</p><h2>Критерии выбора стека под задачи</h2><p>Angular точно не подходит на роль первого фреймворка для новичка. Это логичный следующий шаг, если хочется развиваться в сторону фуллстека или бэкенда: Java и Go тоже используют классы, объекты и dependency injection как стандартную практику. Год работы с Angular помогает легче понимать паттерны того же Spring Boot, потому что основные концепции уже отработаны на фронтенде.</p><p>Если задача — быстро собрать MVP, стартап, лендинг или небольшое приложение, объективно проще взять React. Там меньше формальностей и ниже порог входа на старте. Когда же предстоит развивать сложную долгоживущую систему с крупной командой, Angular оказывается практичнее: через год любой новый разработчик сразу поймёт структуру без дополнительных объяснений.</p><p>По этой причине Angular часто выбирают для разработки крупных распределённых платформ и корпоративных экосистем — например, в <a href="https://centicore.ru/">Centicore Group</a>, где есть сложные стандарты архитектуры и строгая типизация, чтобы поддерживать порядок в масштабных проектах.</p><h2>Итого</h2><p>В итоге переход с React на Angular сильно расширяет инженерные мозги. В какой-то момент начинаешь понимать, почему в больших системах выбирают именно эту экосистему, а не собирают очередной конструктор из десятка библиотек на React.</p><p>Да, поначалу три файла на один маленький компонент и десятки операторов RxJS откровенно бесят и кажутся какой-то лютой бюрократией. Но когда дискомфорт уходит, а в проекте появляется куча людей, ты просто перестаёшь тратить время на споры о структуре папок, выборе стейт-менеджера или библиотек для форм. Код становится прозрачным и понятным по умолчанию.</p><p>Для меня этот опыт стал крутым шагом вперед. Ты перестраиваешь мышление с коротких функций на нормальное ООП, начинаешь нативно понимать архитектурные паттерны и уже без страха смотришь в сторону того же бэкенда. Так что если представится шанс пощупать Angular на реальном проекте — не бойтесь, оно того стоит.</p>]]></content:encoded>
    </item>
    <item>
      <title>Будущее фронтенда: куда движется React, Vue и Angular</title>
      <link>https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular</link>
      <comments>https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular</guid>
      <description><![CDATA[<p>Как изменились React, Vue и Angular за последние 5-10 лет? Эксперты ответили, что будет с фронтенд-разработкой в 2026 году и стоит ли переходить на фреймворки без VDOM и гидратации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular">Будущее фронтенда: куда движется React, Vue и Angular</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Паттерны проектирования]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние пять лет IT-сфера изменилась так сильно, что джун из 2020 года сегодня бы не прошёл собеседование на ту же позицию.</p><p>Если вы фронтенд-разработчик или только планируете им стать, эта публикация поможет вам сориентироваться в текущей ситуации:</p><ul><li>Узнаете, какие крупные изменения произошли в React, Vue и Angular за последние 5-10 лет.</li><li>Поймёте, стоит ли учить новые фреймворки без виртуального DOM или лучше углубиться в проверенные решения.</li><li>Разберётесь, почему компании продолжают требовать знание React, хотя Solid.js работает быстрее.</li></ul><p>Тимлид и разработчики рассказали, как они видят будущее профессии. Объяснили, почему джуну недостаточно знать только JS, какие навыки помогут вам зарабатывать больше и оставаться востребованным специалистом.</p><p>ℹ️ <i>После прочтения вы сможете принять взвешенное решение: продолжать углубляться в текущий стек, осваивать новые инструменты или развивать смежные навыки.</i></p><h2>Как изменились React, Vue и Angular за последние 5-10 лет?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/f488b013-32ed-47d0-ada9-3a1c3a84b59f.jpg" alt="" /></figure><h3>React</h3><p>До 2019 года разработчики писали объёмные классы с методами жизненного цикла. Они управляли состоянием через setState и передавали данные через пропсы. Потом появились <b>хуки </b>— с тех пор логику помещают в функции, состоянием управляют через useState и useReducer, побочные эффекты контролируют через useEffect.</p><p>Серверные компоненты решили проблему первой загрузки. Тяжёлые части приложения обрабатывает сервер и отправляет клиенту уже готовыми. Конкурентный режим разбивает отрисовку на части и расставляет приоритеты для обновлений — интерфейс не виснет, когда нагрузка возрастает.</p><h3>Vue</h3><p>Composition API сделал организацию кода более гибкой. Логику теперь группируют по функциональности, а не по типам опций. Ещё реактивность переписали с нуля на прокси-объектах, что ускорило отслеживание изменений.</p><p>Компилятор научился оптимизировать шаблоны на этапе сборки. Телепорты решили проблему с модальными окнами и всплывающими подсказками — компоненты отрисовываются в нужном месте DOM-дерева независимо от родителя.</p><p><a href="https://tproger.ru/articles/v-kakuyu-storonu-razvivaetsya-vue-i-est-li-emu-sovremennye-alternativy">В какую сторону развивается Vue и есть ли ему современные альтернативы</a></p><h3>Angular</h3><p>Каждый компонент сам определяет свои зависимости, поэтому пропала необходимость в модулях. <b>Сигналы</b> заменили зонную детекцию изменений. Теперь Angular точно знает, какие части интерфейса нужно обновлять.</p><p>Строгая типизация и декораторы сделали код более предсказуемым. Встроенные инструменты покрывают все потребности крупных проектов: формы с валидацией, маршрутизация с ленивой загрузкой, HTTP-клиент с перехватчиками.</p><p>Фреймворки уходят от сложных решений к более простым. Тренд последних лет — делать приложения быстрее для пользователей и удобнее для разработчиков.</p><p>Пока большая троица занималась «работой над ошибками», появился запрос на <a href="https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya">что-то</a> более лёгкое и быстрое.</p><h2>Фронтенд-фреймворки кажутся избыточными — возвращаемся к ванильному JS?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/1af1ebd0-69e3-4f07-8d6d-053e8c3e70bb.jpg" alt="" /></figure><blockquote>Тот, кто попробовал фреймворки, никогда не вернется к чистому ванильному JS 🙂 Меняются и развиваются сами фреймворки, но тренда на отказ от них точно нет.</blockquote><p>Несмотря на тенденцию упрощения, разработчики сходятся во мнении, что полного отказа от фреймворков не произойдёт.</p><blockquote>В моде решения на основе концепции «исчезающих фреймворков», которые на выходе выдают почти чистый императивный JS-код. Дело в том, что это общий тренд в IT, где вся сложность и расчёты уходят в инфраструктуру, собирая минимальный бандл, где нет ничего лишнего для клиентов.</blockquote><p>Фреймворки — это ещё и способ стандартизации разработки в командах.</p><blockquote>Фреймворки никогда не будут избыточными. Один из первых вопросов на собеседовании —  инструмент, с которым ты умеешь работать. Больший пласт знаний сегодня — это фреймворк. Остальное, чаще всего, бизнес-логика того или иного проекта.</blockquote><p>Из-за критики традиционных фреймворков появился новый класс решений. Больше всего ругают VDOM и гидратацию, хотя они считались неотъемлемой частью современных SPA.</p><h2>Стоит ли переходить на фреймворки без VDOM и гидратации?</h2><p>Solid.js и Svelte уже несколько лет развивают концепцию тонкой реактивности. В 2021 году появился Qwik, который вообще отказался от гидратации.</p><blockquote>SolidJS хорош для аналогов десктопных приложений в браузере — Figma, Miro. Здесь приложение загружается один раз, а потом работает долго и должно быть максимально отзывчивым. Qwik отлично подойдёт, если вы создаёте сайт, куда пользователь приходит за контентом, и важно показать ему этот контент мгновенно.</blockquote><p>При этом массового перехода на новые фреймворки пока не происходит. Компании продолжают искать React и Vue разработчиков — проекты на Solid.js и Qwik остаются экспериментальными.</p><blockquote>Сами по себе фреймворки мало значат для коммерческой разработки без сторонних библиотек вокруг них. Вот когда критическая масса разработчиков популярных библиотек мигрирует на Qwik, а вместе с ними и сообщество, что-то сдвигается.</blockquote><p>Проблема новых фреймворков — это отсутствие экосистемы. React и Vue окружены тысячами готовых библиотек для любых задач. На Solid.js и Qwik большинство решений придётся писать самостоятельно.</p><blockquote>Без поддержки сообщества пользователей ни один инструмент не сможет стать массовым. Даже если работаешь в заказной разработке и есть возможность расширить кругозор команды, сомнительно брать на тест инструмент, под который придётся писать до 30% базового функционала.</blockquote><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/74e9b111-b93b-4fdf-a8b5-9db67bf7e95e.jpg" alt="" /></figure><p>Команды, которые захотят перейти на новые фреймворки, столкнутся с дополнительными сложностями. Разработчикам придётся учить новые концепции и подходы, а компаниям — тратить время и деньги на переобучение.</p><blockquote>У новых фреймворков высокий порог входа: вас ждёт переобучение команды и сложности ручной оптимизации.</blockquote><p>Технологии развиваются циклично. То, что сейчас кажется инновацией, переосмысливает старые подходы.</p><blockquote>Во времена DDR/DDR2 было сложно выполнять клиентский рендеринг, а вот серверам ресурсов хватало. Разработчики как могли воплощали подход, который сейчас называется SSR, и возвращали на клиент готовую разметку для компонентов. И никакого тебе VDOM.</blockquote><p>Пока новые фреймворки остаются нишевыми инструментами. React, Vue, Angular продолжат доминировать в коммерческой разработке за счёт экосистемы и сообщества.</p><h2>Как изменится роль фронтенд-разработчика в 2026 году?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/6027e94f-65a4-4ab2-9364-6f5e322267f1.jpg" alt="" /></figure><p>В 2020 году джуниор находил работу, если знал HTML, CSS и основы JS. Сегодня работодатели требуют от новичков React или Vue, TypeScript, системы сборки — и это не конец списка. Ещё и вакансий на всех начинающих не хватает, компании сразу ищут мидлов.</p><p>Инструменты с искусственным интеллектом — Copilot, ChatGPT, Cursor — ускоряют работу. Они же повышают планку: если джун с помощью ИИ работает как мидл, то мидл должен демонстрировать более глубокие знания. Работодатели стали больше ценить тех, кто понимает принципы работы кода, а не просто копирует готовые решения.</p><blockquote>Зная JavaScript и любой инструмент даже не из большой тройки, с использованием AI можно быстро погрузиться в другой нужный инструмент.</blockquote><p>Чёткой границы между фронтендом и бэкендом больше нет. От фронтенд-разработчика ждут, что тот разбирается в серверной части, умеет настраивать процессы непрерывной интеграции и доставки, работает с базами данных.</p><h2>Какие навыки развивать разработчику, чтобы оставаться востребованным?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/d62a3715-b713-4af3-8658-3ff4a6df7d85.jpg" alt="" /></figure><p>Технические навыки — это основа. Когда понимаете алгоритмы и структуры данных, вы пишете быстрый код. Когда знаете паттерны проектирования, ваши приложения легко поддерживать.</p><p><b>Учитесь быстро разбираться в новых инструментах вместо того, чтобы зацикливаться на одном фреймворке</b>.</p><blockquote>По мне так лучше быть фреймворк-агностиком, нежели фанатом одного, которого легко чем-то обидеть.</blockquote><p>Архитектурное мышление отличает <b>«</b>сильного<b>»</b> разработчика:</p><ul><li>Как организовать код, чтобы его легко поддерживать?</li><li>Как спроектировать API, чтобы оно не ломалось при изменениях?</li><li>Как построить систему, которая выдержит рост нагрузки?</li></ul><p>Те, кто решают эти вопросы, получают офферы с космическими зарплатами.</p><p><b>Софт-скиллы</b> тоже влияют на карьерный рост:</p><ul><li>Объясните техническую проблему менеджеру простыми словами.</li><li>Проводите код-ревью так, чтобы не обидеть коллегу, но улучшить код.</li><li>Оценивайте сроки и управляйте ожиданиями.</li><li>Аргументируйте выбор технологии.</li></ul><p>Когда вы понимаете бизнес, вы становитесь партнёром. Почему мы делаем эту фичу? Как она повлияет на метрики? Какие есть альтернативы? Разработчик, который мыслит категориями бизнеса, становится незаменимым.</p><p>Рынок вынуждает постоянно учиться, потому что индустрия меняется каждый год. Кто застревает в зоне комфорта — отстаёт.</p><p><i>Как ChatGPT повлиял на ценность вашего труда? Успеваете подстраиваться под требования рынка, параллельно работать и пробовать новые технологии? Делитесь в комментариях.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>SolidJS и Qwik: фронтенд нового поколения</title>
      <link>https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya</link>
      <comments>https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya</guid>
      <description><![CDATA[<p>Обзор SolidJS и Qwik — плюсы и минусы фреймворков. Сравнение SolidJS и Qwik, практические рекомендации по переходу и тенденция отказа от React/Vue.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya">SolidJS и Qwik: фронтенд нового поколения</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 Sep 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Помните, когда впервые попробовали React/Vue после JS и jQuery?</b> Тот момент, когда всё встало на свои места, и вы поняли — вот оно, будущее фронтенда. В 2025 году разработчики <a href="https://www.reddit.com/r/solidjs/comments/1m4hlzj/im_really_impressed_with_solid/">испытывают</a> похожие чувства с SolidJS и Qwik.</p><h2>Последний рубеж React и Vue</h2><p><b>Согласны, что VDOM превратился в бюрократическую прослойку?</b> Изменили состояние в одном месте — получите полный пересчёт дерева компонентов. Фреймворки заставляют загружать всё сразу, тащат багаж служебного кода. И пока этот код не загрузится, пользователь смотрит на белый экран.</p><p>SSR <a href="https://tproger.ru/translations/rendering-on-the-web">ускоряет</a> загрузку страницы: сервер рендерит HTML, пользователь видит контент и пытается с ним взаимодействовать. Но пока JavaScript не загрузится, ничего не заработает.</p><p>Потом JS наконец подгружается и начинает гидратацию. По сути, он заново создаёт в памяти то же дерево компонентов, которое сервер уже отрендерил в HTML. Выполняется двойная работа. Кстати, в это время пользователь тыкает неработающие кнопки — дотерпит ли он до полной загрузки?</p><p>Системные проблемы не исправить очередным хуком или новой версией фреймворка, поэтому появление SolidJS и Qwik — было вопросом времени.</p><blockquote>Поиск новых решений — здоровый признак развития фронтенда. В конце концов, и Vue был создан потому, что Эвану Ю не хватало облегченной альтернативы AngularJS. Большая тройка фреймворков решает огромный спектр задач, имеет колоссальную поддержку сообщества, но их нельзя назвать идеальным инструментом на все случаи жизни.</blockquote><h2>Обзор SolidJS</h2><p>SolidJS во многом похож на React. Самое интересное — его подход к обновлению интерфейса:</p><ul><li><b>Отсутствие виртуального DOM</b> — Solid напрямую обновляет только те DOM-узлы, которые действительно изменились.</li><li><b>Компоненты как функции инициализации</b> — каждый компонент вызывается только один раз для настройки реактивности.</li><li><b>Сигналы вместо хуков</b> — состояние управляется через createSignal(), который возвращает геттер/сеттер пару.</li></ul><p>Например, когда срабатывает счётчик, Solid не перерисовывает весь компонент. Он точечно обновляет только текст внутри &lt;p&gt;, где используется count():</p><h3>Преимущества SolidJS</h3><p>👍 <b>Производительность и размер бандла</b></p><p>Благодаря отсутствию виртуального DOM и мелкозернистым обновлениям, приложения <a href="https://www.reddit.com/r/reactjs/comments/tsx8hw/solidjs_devex_compared_to_react/?tl=ru">работают</a> быстрее аналогов на React.</p><p>👍 <b>Простота освоения</b></p><p>Синтаксис SolidJS похож на React. Функциональные компоненты, JSX, концепции вроде Suspense и Error Boundaries — всё это есть в Solid. Изучение основ <a href="https://www.reddit.com/r/solidjs/comments/1len1pf/comment/myi8qci/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">займёт</a> 1-2 дня, если есть опыт с MobX/effector/RxJS.</p><p>👍 <b>Стабильность</b></p><p>Фреймворк находится на стабильной версии 1.x. Это означает отсутствие кардинальных изменений API, в отличие, например, от ситуации со Svelte, где сосуществуют версии 4 и 5 с разными подходами.</p><p>👍 <b>Совместимость с React</b></p><p>SolidJS совместим с экосистемой React. Можно переиспользовать дизайн-системы и компоненты в legacy-приложениях.</p><p>👍 <b>Удобное управление состоянием</b></p><p>Функционал сигналов и сторов покрывают 90% потребностей в управлении состоянием без необходимости подключать внешние библиотеки.</p><h3>Минусы SolidJS</h3><p>👎 <b>Ограниченная экосистема</b></p><p>Выбор готовых компонентов и библиотек значительно меньше, чем у React. Команды тратят больше времени на создание компонентов с нуля: тяжко при работе с таблицами, гридами, формами, валидацией.</p><p>👎 <b>Кривая обучения</b></p><p>Несмотря на знакомый синтаксис, модель реактивности SolidJS отличается от React. Разработчики должны усвоить следующие принципы:</p><ul><li>Избегать условных конструкций непосредственно в компонентах.</li><li>Не деструктурировать пропсы и сторы, чтобы сохранить реактивность.</li><li>Не использовать асинхронный код внутри createEffect.</li></ul><p>👎 <b>Проблемы с инструментарием</b></p><p>Возникают сложности с настройкой компилятора в нестандартных окружениях — монорепозиториях, при запуске тестов или интеграции с другими инструментами. DevTools не дотягивает до аналога у React.</p><p>👎 <b>SolidStart всё ещё развивается</b></p><p>SSR-решение SolidStart пока не достигло зрелости Next.js или Nuxt. Разработчики <a href="https://www.reddit.com/r/solidjs/comments/1len1pf/comment/myml5tt/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">сообщают</a> о проблемах с гидратацией и других сложностях при работе с серверным рендерингом.</p><h2>Обзор Qwik</h2><p>Qwik — это проект Мишко Хевери (создателя Angular). Идея фреймворка заключается в возможности возобновить работу приложения на клиенте без повторного выполнения кода, который уже был выполнен на сервере.</p><p>В Qwik радикально решили проблему гидратации — полностью отказались от неё. Время до интерактивности (TTI) падает в разы. Пользователь может кликать на кнопки сразу после загрузки HTML, без ожидания разогрева всего приложения.</p><p>Qwik автоматически разбивает код на мелкие чанки и загружает их только при необходимости. Символ $ в коде указывает на границы ленивой загрузки.</p><h3>Плюсы Qwik</h3><p>👍 <b>Мгновенная загрузка</b></p><p>Практически нулевой JavaScript при первоначальной загрузке, следовательно отличные показатели Core Web Vitals.</p><p>👍 <b>Автоматическая оптимизация</b></p><p>Оптимизация на уровне компилятора, умная предзагрузка критических ресурсов. Не нужно думать о разделении кода — Qwik делает это автоматически.</p><p>👍 <b>Знакомый синтаксис</b></p><p>👍 <b>Спасибо за SEO</b></p><p>Быстрая загрузка улучшает ранжирование за счёт полноценного SSR из коробки.</p><h3>Минусы Qwik</h3><p>👎 <b>Молодая экосистема</b></p><p>Ограниченное количество библиотек, мало готовых решений и компонентов. Небольшое сообщество разработчиков (если сравнивать с React/Vue).</p><p>👎 <b>Кривая обучения</b></p><p>Придётся изучать новые концепции. Из-за ленивой загрузки усложняется отладка.</p><blockquote>Qwik — это радикально новая ментальная модель. У фреймворка высокий порог входа: вас ждёт переобучение команды и сложности ручной оптимизации. Чтобы Qwik работал идеально, разработчик должен вручную указывать, что можно лениво загружать, а что нет.</blockquote><p>👎 <b>Сложность интеграции</b></p><p>Трудно интегрировать существующие React/Vue компоненты и ограниченная поддержка сторонних библиотек. Скорее всего, придётся с нуля переписывать код существующего проекта.</p><h2>Экосистема и готовность к продакшену</h2><p>Если сравнивать с React, то экосистема — самое слабое место обоих фреймворков.</p><p>SolidJS имеет SolidStart — метафреймворк с роутингом, SSR и серверными функциями. <a href="https://docs.solidjs.com/quick-start">Документация</a> качественная, сообщество активное. Большинство React-библиотек можно адаптировать без особых проблем, для популярных UI-китов есть готовые порты.</p><p>Qwik развивается в связке с <a href="https://qwik.dev/docs/qwikcity/">Qwik City</a>, который покрывает типовые задачи веб-разработки. <a href="https://www.builder.io/m/qwik">Builder.io</a> активно инвестирует в экосистему, регулярно выходят обновления и новые интеграции.</p><p>Риски есть, но они управляемые. Меньший размер сообщества означает меньше готовых решений и ответов на Stack Overflow. Если не боитесь изучать новое, то выигрыш в производительности перевесит неудобства.</p><h2>Сравнение SolidJS и Qwik</h2><p>SolidJS повышает производительность обновлений. Если данные меняются часто и непредсказуемо — графики, мониторинги, редакторы — Solid даст максимальную отзывчивость.</p><p>Qwik повышает производительность загрузки. Если бизнес зависит от первого впечатления, Qwik обеспечит мгновенный старт.</p><p><b>Медиа</b>, <b>блоги</b> с жёсткими требованиями к TTFB/TTI/INP будут лучше работать на Qwik. Пользователи смогут читать и скроллить без задержки. Интерактив добавляется дозированно — это лучшая стартовая стоимость.</p><p><b>E-commerce</b>, <b>каталоги </b>с SEO и карточками рекомендуется разрабатывать на Qwik. Особенно если на главной тяжёлые модули, а клиенты приходят с поисковиков. Вы выигрываете у конкурентов буквально на первом взаимодействии.</p><p><b>Сложный SPA</b> или <b>дашборд </b>с живыми виджетами и апдейтами будет лучше работать на SolidJS. Точечная реактивность упростит жизнь и снизит цену апдейтов. Solid сияет в проектах, где происходят сотни мелких изменений в секунду.</p><blockquote>Solid хорош для аналогов десктопных приложений в браузере — Figma, Miro. Здесь приложение загружается один раз, а потом работает долго и должно быть максимально отзывчивым. Также Solid будет хорош там, где важна плавность анимаций.</blockquote><p><b>Лэндинги</b>, <b>мобильные приложения</b>, <b>визитки</b> — здесь Solid даст сверхбыструю реактивность и облегчит сборку.</p><p>Оба фреймворка умеют SSR/SSG и стриминг. Solid снижает стоимость обновлений, Qwik — стоимость старта. Для LCP/TTI/INP в контентных сценариях выигрывает Qwik. Для интенсивных интерактивных сценариев Solid удерживает FPS и снижает CPU.</p><p>Оба дружат с серверными платформами. SolidStart имеет адаптеры для Vercel/Netlify, Qwik City — тоже.</p><blockquote>Выбирайте Solid.js, если вы создаете сервис, куда пользователь заходит надолго, и ему важна отзывчивость после загрузки. Выбирайте Qwik, если вы создаете сайт, куда пользователь приходит за контентом, и важно показать ему этот контент мгновенно.</blockquote><p>Немного выводов:</p><ul><li>Solidjs быстрее Qwik при рендеринге. Qwik быстрее Solidjs при загрузке страниц.</li><li>У Solidjs документация лучше, чем у Qwik.</li><li>С нуля код на Qwik писать проще и быстрее, чем на SolidJS.</li><li>Typescript в SolidJS может быть головной болью, в Qwik об этом можно не беспокоиться.</li></ul><h2>Практические рекомендации по переходу на SolidJS и Qwik</h2><ol><li><b>Начните с аудита текущих проблем</b>. Посмотрите метрики сайта: сколько времени занимает гидратация? Тормозят ли обновления интерфейса? Где именно проблема — на старте или в процессе работы?</li><li><b>Выберите изолированную часть проекта</b>. Возьмите один виджет, одну страницу, один компонент и реализуйте его на новом фреймворке. Измерьте разницу в производительности и удобстве разработки.</li><li><b>Если проблема в медленной загрузке</b> — попробуйте Qwik. Соберите прототип лендинга или каталога, включите SSG с resumability и протестируйте на медленном соединении.</li><li><b>Если проблема в тормозах интерфейса</b> — попробуйте Solid. Перепишите самый страдальный компонент с частыми обновлениями, уберите мемоизации и посмотрите на результат.</li></ol><p>Оба фреймворка собираются через Vite, имеют TypeScript из коробки и хорошую интеграцию с популярными инструментами. Стоимость эксперимента низкая, а потенциальная выгода высокая.</p><h2>Тенденция отказа от React/Vue</h2><blockquote>Компании и разработчики не столько отказываются от популярных решений, сколько перестают использовать их для всех задач подряд. Раньше выбора практически не было, и эти фреймворки были молотком, для которого любая задача — гвоздь.</blockquote><p><i>А вы что думаете? Готовы попробовать модные фреймворки SolidJS и Qwik в следующем проекте?</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Осторожно: @Size не проверяет на null! Как я пропустил баг</title>
      <link>https://tproger.ru/articles/ostorozhno---size-ne-proveryaet-na-null--kak-ya-propustil-bag-</link>
      <comments>https://tproger.ru/articles/ostorozhno---size-ne-proveryaet-na-null--kak-ya-propustil-bag-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Тюрин ]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ostorozhno---size-ne-proveryaet-na-null--kak-ya-propustil-bag-</guid>
      <description><![CDATA[<p>Почему @Size(min = 1) в Spring не проверяет null и пропускает пустые поля? Разбираем реальный кейс с формой отзыва, объясняем поведение @Size, @NotBlank, @NotNull и показываем, как правильно валидировать обязательные поля в Spring Boot.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ostorozhno---size-ne-proveryaet-na-null--kak-ya-propustil-bag-">Осторожно: @Size не проверяет на null! Как я пропустил баг</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 10 Aug 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разрабатывая веб-приложения на Java Spring, мы часто сталкиваемся с необходимостью валидации входных данных. Одна из самых распространённых задач — убедиться, что обязательное текстовое поле заполнено и соответствует определённым критериям, например, длине. Кажется, что решение очевидно: используем аннотацию <i>@Size</i>. Но здесь нас поджидает одна неприятность.</p><p>Недавно я столкнулся с одной проблемой на реальном проекте. У меня есть сайт: бэкенд написан на Spring, а фронтенд — на Angular. Я добавлял новую форму для отправки отзыва пользователя и, в спешке, забыл добавить валидацию на одно из полей формы на фронтенде.</p><p>Я хотел, чтобы поле «комментарий» было обязательным и имело длину от 1 до 100 символов. На бэкенде использовал аннотацию @Size(min = 1, max = 100) к обязательным полям, например для поля `comment` в моем DTO имеет такой вид:</p><p>Тест с пустой строкой {"comment": ""} был корректно отклонён. Однако, когда я отправил запрос без поля "comment" вообще ( {} ), валидация прошла успешно, и поле «comment» пришло как null. Это была серьёзная ошибка — поле, которое по логике было обязательным, могло быть пропущено. Т.е. могли потеряться важные для меня данные.</p><h4>Почему так происходит?</h4><p>Причина кроется в спецификации JSR-303 (Bean Validation). Документация (Javadoc) для аннотации <i>@Size</i> прямо указывает: «null elements are considered valid». Это означает, что если значение поля null, валидатор <i>@Size</i> считает его валидным и не выполняет проверку длины.</p><p>Это поведение подтверждается и в исходном коде валидатора. Метод, отвечающий за проверку строки, сначала проверяет значение на null, и если оно null, сразу возвращает true, не переходя к проверке размера. Это стандартное поведение для многих аннотаций валидации, таких как<i> @Min, @Max, @Pattern</i> и т.д. Они проверяют <b>качество</b> значения, но не его <b>наличие</b>.</p><h4>Предлагаемое решение</h4><p>Чтобы поле было действительно обязательным (не null и не пустое), необходимо использовать аннотации, которые проверяют наличие значения - это <i>@NotNull, @NotEmpty, @NotBlank</i> . Для строк лучшим выбором является комбинация:</p><p>Понимание разницы между этими аннотациями критически важно:</p><ul><li><i>@NotNull</i>: Гарантирует, что значение поля не является null. Однако оно не проверяет пустые строки или строки из пробелов и будут считаться валидными.</li></ul><ul><li><i>@NotEmpty</i>: Гарантирует, что значение не null и не пустое (для строки длина &gt; 0). Это означает, что "" будет отклонено, но строка из одних пробелов "   " пройдёт валидацию, так как её длина больше 0.</li></ul><ul><li><i>@NotBlank</i>: Предназначена исключительно для String. Гарантирует, что строка не null, не пустая и после удаления пробелов с начала и конца (trim) имеет длину больше 0. Это означает, что null, "" и "   " будут отклонены. Именно это поведение обычно ожидается от "обязательного текстового поля".</li></ul><h4>Красивое возвращение ошибок</h4><p>Для того чтобы клиент (в моём случае, Angular-приложение) получал понятные сообщения об ошибках валидации, я настроил глобальный обработчик исключений с помощью <i>@ControllerAdvice</i>. Когда валидация не проходит, Spring выбрасывает MethodArgumentNotValidException. Далее, я его перехватываю и возвращаю структурированный ответ.</p><p>Angular-приложение может легко обработать этот JSON и отобразить пользователю понятное сообщение об ошибке.</p><h4>Выводы</h4><p>Аннотация <i>@Size</i> сама по себе не делает поле обязательным. Она проверяет только длину, если значение не null. Для обязательных строковых полей всегда используйте <i>@NotBlank</i>. Для других типов данных используйте <i>@NotNull</i>.</p><p>Не полагайтесь на @Size(min = 1) как на замену проверки на null или пустую строку. Эта ловушка, в которую я сам попался, может привести к консистентным данным в вашей системе и потенциальным уязвимостям, если бэкенд будет работать с неожиданными null значениями. Всегда явно указывайте, что поле является обязательным, с помощью соответствующих аннотаций.</p><p>Этот материал — не открытие века, а скорее напоминание как себе, так и  коллегам. Даже опытные разработчики иногда могут упустить из виду такие нюансы. Я столкнулся с этой проблемой на проекте, и она стоила мне времени на отладку и тестирование.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как я развернул сайт на Java Spring Boot + Angular SSR с Docker и Nginx: личный опыт</title>
      <link>https://tproger.ru/articles/kak-ya-razvernul-sajt-na-java-spring-boot---angular-ssr-s-docker-i-nginx--lichnyj-opyt</link>
      <comments>https://tproger.ru/articles/kak-ya-razvernul-sajt-na-java-spring-boot---angular-ssr-s-docker-i-nginx--lichnyj-opyt?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Тюрин ]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ya-razvernul-sajt-na-java-spring-boot---angular-ssr-s-docker-i-nginx--lichnyj-opyt</guid>
      <description><![CDATA[<p>Как развернуть сайт на Spring Boot и Angular с SSR, Docker и Nginx: пошаговый опыт настройки, устранения ошибок, подключения HTTPS и защиты от ботов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ya-razvernul-sajt-na-java-spring-boot---angular-ssr-s-docker-i-nginx--lichnyj-opyt">Как я развернул сайт на Java Spring Boot + Angular SSR с Docker и Nginx: личный опыт</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 31 May 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проект представляет
собой веб-приложение на Spring Boot и Angular.
Первоначально я выбрал простую монолитную
архитектуру, но по мере роста требований
и целей пришлось перейти на микросервисный
подход. Здесь я расскажу, как это
происходило: с конфигурациями, ошибками
и решениями.</p><h2>Монолитная архитектура</h2><p>Исходная схема:</p><ul><li>Backend: Spring Boot</li><li>Frontend:
	Angular</li></ul><p>Так как у меня уже
был арендованный VDS, я зарегистрировал
домен у одного известного провайдера,
а хостил сайт уже на VDS сервере.
Для простоты интегрировал Angular-сборку
в Spring Boot как статику через
frontend-maven-plugin.
Всё собиралось в один JAR. Почему так?
Ранее уже был такой опыт, и я решил пойти
этим путем.</p><p>После регистрации
домена необходимо подождать, чтобы ввести доменное имя.
Значит есть время для запуска и настройки
приложения. Однако при тестировании
проявились ключевые недостатки:</p><ul><li>Отсутствие SSR в
	Angular негативно влияло на SEO;</li><li>Ошибка в Angular ломала Maven-сборку;</li><li>Сложно поддерживать и масштабировать.</li></ul><h2>Переход на микросервисы</h2><p>Было принято решение
разделить фронтенд и бэкенд на отдельные
сервисы и использовать микросервисный
подход с SSR для Angular:</p><p>Новая структура:</p><ul><li>Backend: Spring Boot</li><li>Frontend:
	Angular Universal (SSR)</li><li>Инфраструктура:
	Docker Compose, Nginx, HTTPS</li></ul><h3>Docker, Nginx и запуск</h3><p>Создана базовая
структура docker-compose.yml:</p><p>И соответствующий
Nginx:</p><p>После запуска проект
открывался по IP, но появилось множество
проблем:</p><ul><li>Дублирование
	API-префиксов: /api/api/endpoint
→
	Решение: корректировка proxy_pass
	и URL в Angular</li><li>Редиректы
	на POST: Spring добавлял лишние слеши
→
	Решение: правильные аннотации и настройка
	Nginx</li><li>405
	Method Not Allowed
→ Решение: использовать
	@PostMapping</li><li>Docker-сети
→
	Решение: задать общую сеть в
	docker-compose.yml</li></ul><h3>Безопасность: HTTPS, SSL, CORS</h3><p>Чтобы сайт открывался
по имени с панели провайдера для моего
домена, значения DNS-сервера оставил без
изменений (провайдер предоставляет их
бесплатно), а для ресурсной записи @ и
www указал ip адрес своего хостинга. Так
как провайдер домена бесплатно
предоставил SSL-сертификаты (Let's Encrypt), то
как я их интегрировал:</p><p>Скачал с панели
провайдера и перенес на хостинг такие
файлы:</p><p>domain.crt — сертификат</p><p>domain.key — приватный
ключ</p><p>ca_bundle.crt — цепочка
доверия</p><p>Добавил
в Nginx такую запись для HTTPS:</p><p>Но при обращении к сайту по https конечно же возникли ошибки.
А именно: в логах Nginx были ошибки на
SSL_CTX_use_PrivateKey_file.
Оказалось формат был PKCS#7, а
требовался PEM. Конвертировал через
OpenSSL:</p><p>Так
как сертификаты имеют срок действия,
не стоит забывать об их продлении и
обновлении.</p><p>К
тому же всегда следует проверять логи
Nginx (error.log), там могут находится ответы
на вопросы, почему сайт не работает.</p><p>На стороне Spring Boot
были CORS-проблемы, решено так:</p><h3>Атаки ботов и защита</h3><p>После запуска сайта
в логах Nginx стали появляться тысячи
запросов от ботов, ищущих уязвимости
WordPress, PHPMyAdmin и других популярных утилит,
хотя мой сайт работает на Java/Angular. Пример
лога:</p><p><i>45.155.205.213
- - [01/Jan/2023:04:12:11 +0000] "GET /wp-login.php HTTP/1.1"
404 153</i></p><p>Добавлен фильтр в
nginx.conf:</p><h3>Финальная конфигурация</h3><p>После
всех настроек мой сайт
работает и полностью функционирует.
Конфигурация сильно изменена по сравнению
с первоначальной. Вот как они выглядят
сейчас.</p><p><i>docker-compose.yml</i></p><p><i>
nginx.conf</i></p><p><i>
Dockerfile backend</i></p><p><i>
Dockerfile frontend</i></p><p>Разделение сервисов
улучшило поддержку и масштабируемость, к тому же, я получил ценные знания. Надеюсь,
статья будет полезна тем, кто разворачивает
подобные конфигурации на Java и Angular.</p>]]></content:encoded>
    </item>
    <item>
      <title>В какую сторону развивается Vue и есть ли ему современные альтернативы</title>
      <link>https://tproger.ru/articles/v-kakuyu-storonu-razvivaetsya-vue-i-est-li-emu-sovremennye-alternativy</link>
      <comments>https://tproger.ru/articles/v-kakuyu-storonu-razvivaetsya-vue-i-est-li-emu-sovremennye-alternativy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/v-kakuyu-storonu-razvivaetsya-vue-i-est-li-emu-sovremennye-alternativy</guid>
      <description><![CDATA[<p>Фреймворк для разработки интерфейсов и ве-приложений Vue — особенности и преимущества. Куда движется и есть ли ему современные альтернативы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/v-kakuyu-storonu-razvivaetsya-vue-i-est-li-emu-sovremennye-alternativy">В какую сторону развивается Vue и есть ли ему современные альтернативы</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Инновации]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Jan 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Прогрессивный фреймворк для создания веб-приложений, сайтов и пользовательских интерфейсов Vue.js входит в топ наиболее популярных инструментов разработки. Vue легко интегрируется в проекты, где задействован язык программирования JavaScript и есть библиотеки на его основе. В числе основных плюсов Vue.js — доступность, простая архитектура, высокая производительность и гибкие настройки. У фреймворка обширная экосистема и многочисленное сообщество пользователей.</p><p>Vue создан более 10 лет назад. Для IT-продукта это большой срок, достаточный для завершения полного эволюционного цикла. Однако фреймворк продолжает развиваться и остается востребованным инструментом для создания интерфейсов, веб-приложений и инфраструктуры.</p><p>Узнаем, есть ли альтернативы у фреймворка Vue, каковы его особенности и преимущества и как использовать Vue.js с максимальной эффективностью.</p><h2>Что такое Vue.js и зачем он нужен</h2><p>Разработка современных интерфейсов и веб-приложений практически невозможна без фреймворков. Эти инструменты используются для оптимизации процессов и включают в себя наиболее востребованные сценарии и функции. Vue.js стабильно входит в рейтинг лучших фреймворков и широко используется крупными компаниями для разработки своих продуктов.</p><p>Vue создан программистом из Google Эваном Ю в 2012 году — это был его пет-проект, то есть продукт для личного пользования, которым он занимался в свободное от основной работы время. Доступной для широкой публики технология стала только в 2015 году.</p><p>Эван Ю решил разработать этот фреймворк после того, как попытался поработать с Backbone.js и Angular — инструментами аналогичного назначения. Их функциональные возможности показались программисту недостаточными.</p><p>Когда коллега Эвана по ИТ-отрасли Тейлор Отвелл, создатель другого популярного продукта Laravel, заявил в соцсети, что изучает Vue, считая его более удобным, чем другие инструменты, популярность фреймворка кратно возросла. Другие разработчики стали активно использовать Vue.js для разработки пользовательских интерфейсов.</p><p>Интересный факт. Название фреймворка происходит от английского слова «view» в переводе на французский язык, что указывает на связь модели и отображения.</p><p>Это бесплатный опенсорс-проект (с открытым кодом), которым могут пользоваться все желающие. Улучшением и доработкой компонентов Vue занимаются программисты всего мира — у фреймворка очень обширное и доброжелательное сообщество. Несколько лет подряд Vue.js даже держался в топе на GitHub по количеству звезд. И в 2025 году популярность фреймворка все еще остается высокой.</p><h2>Сферы применения Vue</h2><p>Востребованность Vue.js объясняется его широкой сферой применения. Фреймворк используется для разработки:</p><ul><li>быстрых сайтов и веб-приложений;</li><li>веб-ресурсов с повышенной нагрузкой — онлайн-магазинов, информационных порталов;</li><li>лендингов — одностраничных сайтов с интерактивным содержанием;</li><li>социальных сетей, сервисов CMS и других;</li><li>адаптивных интерфейсов;</li><li>личных кабинетов и страниц пользователей;</li><li>интерфейсов для авторизации, интерактивных чатов, форм заявки и прочих функциональных блоков.</li></ul><p>Vue пользуется популярностью не только в среде рядовых пользователей, но и в профессиональном сообществе. Продуктом пользуются такие компании, как Alibaba, EuroNews, Zoom, Ozon, Xiaomi и многие другие. Фреймворк считается одним из самых перспективных и адаптивных — новые версии выходят регулярно.</p><p>Многие компании используют Vue.js в своих внутренних проектах. Например, такие гиганты индустрии как Apple и Google в качестве основных инструментов разработки применяют другие фреймворки, но периодически привлекают и разработчиков на Vue.js. Компания Яндекс в основном пользуется React, но проект «Едадил» полностью сделан на Vue.</p><h2>Основные преимущества Vue</h2><p>Список плюсов у фреймворка довольно внушительный.</p><h3>Реактивность</h3><p>У разработчиков на Vue есть набор готовых шаблонов и возможность вносить изменения в реальном времени, не обновляя страницы. Такое свойство ускоряет разработку, повышает скорость загрузки и делает управление состоянием любой системы интуитивно понятным. Отслеживание и срабатывание происходит в процессе выполнения кода непосредственно в браузере, то есть сборка при такой схеме работы не требуется.</p><h3>Декларативность</h3><p>Синтаксис шаблонов расширяет стандарты HTML, позволяя описывать ожидаемый результат в декларативной форме на основе статуса JavaScript. Если говорить проще, декларативность, это когда вы формулируете то, что хотите сделать, а фреймворк сам выполняет поставленную задачу.</p><h3>Низкий порог входа</h3><p>Если вы знакомы с JavaScript, знаете основы CSS и HTML, вы без труда освоите Vue. Концепции фреймворка просты для понимания: программисты пишут код уже на первых неделях освоения.</p><h3>Подробная документация</h3><p>Эксперты называют <a href="https://v3.ru.vuejs.org/">доки Vue</a> эталонными — работать с таким сопровождением одно удовольствие. По сути для обучения достаточно документации с подробным описанием основных библиотек и инструментов.</p><h3>Обширное сообщество</h3><p>Глобальное коммьюнити предлагает пользователям обучающие ресурсы и полноценную поддержку, в том числе на русском языке. Если у начинающего прогера возникнет вопрос, он с высокой долей вероятности получит на него развернутый ответ на многочисленных форумах.</p><h3>Небольшой вес</h3><p>Приложения и сайты на Vue мгновенно загружаются и быстро работают. В современных условиях это существенное конкурентное преимущество. Шустрые сайты не только более удобны, но и лучше ранжируются поисковиками.</p><h3>Простое внедрение</h3><p>Фреймворк используют для модульной интеграции — не обязательно создавать всё приложение, можно обойтись его ключевыми элементами. Например, разработать на фреймворке только интерфейс для интерактивного чата или личный кабинет. При этом элементы на Vue беспрепятственно взаимодействуют с частями, сделанными на других библиотеках.</p><p>Более того, ядро на Vue.js можно без труда внедрить в действующий проект, созданный на другом фреймворке. Сайт продолжит работу, а его модули можно переписывать постепенно без остановки проекта.</p><h2>Минусы</h2><p>Несмотря на многочисленные плюсы, Vue.js, как и любая другая технология, несовершенна. Опытные разработчики выделяют следующие недостатки.</p><h3>Сложности в освоении при углубленном изучении</h3><p>На начальной стадии фреймворк действительно прост в освоении, но по мере углубления в экосистему программисты часто сталкиваются с трудностями по причине обилия библиотек и инструментов.</p><h3>Производительность</h3><p>В масштабных проектах со сложным функционалом могут возникать проблемы с производительностью. Требуется тщательное планирование и оптимизация ресурсов, чтобы справиться со сложными сайтами без ресурсных потерь.</p><h3>Совместимость</h3><p>В плюсах мы упоминали простую интеграцию фреймворка, но совместимость возможна не во всех случаях. Если мы взаимодействуем с разветвленной экосистемой, требующей индивидуальных решений, понадобятся глубокие знания разработки, чтобы модули Vue гармонично дополняли, а не перегружали технологический стек.</p><h2>Как развивается Vue</h2><p>В 2025 году Vue не собирается сдавать позиции и широко используется в разработке веб-продуктов. Интуитивно понятный синтаксис шаблонов и архитектура, состоящая из компонентов, делает этот инструмент предпочтительным выбором для многих программистов.</p><p>Эксперты выделяют ряд трендов в развитии фреймворка:</p><ul><li>Дальнейшая поддержка TypeScript. Этот язык программирования был создан с целью расширить возможности Java. Интеграция с Vue.js открывает новые перспективы для разработчиков.</li><li>Оптимизация производительности. Ведутся работы по ускорению приложений на фреймворке и повышению эффективности, что крайне важно для пользовательского опыта.</li><li>Работа над API. Предложены более гибкие варианты организации кода, что облегчает его сопровождение и повторное применение.</li><li>Расширение экосистемы. Библиотека плагинов пополняется новыми продуктами и инструментами — участники сообщества постоянно работают над обогащением ресурсной базы разработчиков.</li><li>Ориентация на инновации. Используются новейшие решения для работы над сложными проблемами.</li></ul><p>Сейчас разработчики применяют версии Vue 3.0 и 3.5. Эти продукты по ряду параметров превосходят предыдущие итерации:</p><ul><li>Улучшенная реактивность. Фреймворки нового поколения внедряются в действующие проекты еще быстрее и потребляют меньше ресурсов.</li><li>Упор на Composition API. Инновационный подход к организации компонентов фреймворка — отличный способ распространять логику приложения на другие продукты. Такая схема существенно упрощает повторное использование кода.</li><li>Применение Vue CLI — полноценной системы для ускорения разработки. Обеспечивает бесперебойную работу компонентов сборки, отвечает за настройку приложения и быстрое прототипирование.</li><li>Быстрота и мощность. Новые версии проще использовать для нативных приложений за счет модульности и оптимизации библиотек (автоматического удаления лишнего кода).</li><li>Повышенная производительность рендеринга — преобразования трехмерных образов из программ в изображения, которые видит пользователь.</li><li>Более эргономичный синтаксис. Экономия ресурсов и времени, потраченного на разработку.</li><li>Внедрены новые алгоритмы для сравнения виртуального DOM с «настоящим», что ускоряет рабочие процессы.</li></ul><p>В новых версиях улучшена масштабируемость, что позволяет разрабатывать более сложные и многофункциональные приложения. Оптимизирована также обработка ошибок, стали более гибкими возможности отладки.</p><h2>Альтернативы и конкуренты: сравнение Vue с другими фреймворками</h2><p>Ближайшие конкуренты Vue — это React, Angular, Svelte. Рассмотрим альтернативные фреймворки в сравнении с Vue.js.</p><h2>Vue.js vs React</h2><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-17/f14c4d5c-f6e9-43a9-8581-53b5f832e900.png" alt="vue.js аналоги" /></figure><p>Библиотека с открытым кодом React — не менее популярный инструмент для разработки, чем Vue. Технически ее нельзя назвать полноценным фреймворком, при этом выбор решений для создания сайтов и веб-приложений довольно обширный.</p><p>Спор о том, что лучше, Vue или React, ведется уже несколько лет — стороны до сих пор не пришли к консенсусу. Оба инструмента обладают гибкой архитектурой, высокой производительностью, обширным функционалом. У каждого обширное сообщество пользователей, готовых привести сотни аргументов в защиту своего выбора.</p><p>Однако руководствоваться стоит исключительно объективными различиями:</p><ul><li>Изучение React занимает больше времени. Это факт, с которым согласны обе стороны. Если вы новичок в разработке, вам больше подойдет Vue — он проще по синтаксису, его концепция более понятна.</li><li>Различный подход к реактивности. В React такие сайты создаются через виртуальный DOM — это усложняет изменение исходного хода. В Vue программист может работать с DOM напрямую, что ускоряет процесс изменений и упрощает работу программиста.</li><li>Vue лучше взаимодействует со сложно-синхронизированной анимацией. Это фреймворк более удобен для дизайнеров, которые могут виртуально представить шаблон. В React это реализуется только через JSX. Но зато такой код короче, что в некоторых ситуациях тоже важно.</li><li>Документация. У Vue она более подробная, со множеством ответов на сложные вопросы. Однако React компенсирует этот недостаток за счет более обширного сообщества, в котором можно найти ответ на любой вопрос.</li></ul><p>В числе преимуществ React — наличие совместимой с библиотекой платформы React Native, которая позволяет создавать кроссплатформенный мобильный софт на Android и iOS. В экосистеме Vue специальных продуктов для разработки приложений для смартфонов нет.</p><h2>Vue.js vs Angular</h2><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-17/99c80cdf-d0d7-40e8-a05d-e4bb3666042a.png" alt="angular аналоги" /></figure><p>Разработка компании Google для одностраничных веб-приложений Angular работает на Java, TypeScript, Dart. Как и Vue.js, это фреймворк с открытым исходным кодом с репозиторием на GitHub.</p><p>Ключевые отличия Angular и Vue.js:</p><ul><li>С помощью Angular пишут код, который можно легко адаптировать под другие среды — например, для мобильных ОС. В Vue такие задачи реализовать гораздо сложнее.</li><li>При этом Vue.js более гибок в применении. Его можно использовать как дополнительный инструмент для создания отдельных модулей. Angular потребуется внедрять целиком в весь проект.</li><li>Как и в случае с React, обучение на Vue проще. Angular требует более глубоких познаний в программировании, сам процесс освоения и внедрения в практику занимает больше времени.</li><li>Angular использует ajax — встроенную технологию взаимодействия с сервером без необходимости перезагружать страницу. Это упрощает передачу и получение данных. Реализован и механизм маршрутизации. В Vue эти функции реализуются только через сторонние библиотеки.</li><li>Vue больше подходит для динамических веб-продуктов, ориентированных на UI/UX и пользовательские интерфейсы.</li></ul><p>Выбор между фреймворками во многом зависит от целей и задач программиста, а также особенностей самого проекта. Для корпоративных и масштабных проектов Angular считается лучшим выбором, но у Vue преимущество в скорости и простоте применения.</p><h2>Vue.js vs Svelte</h2><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-17/d8b5eb92-bf1f-46e9-a40b-5415842585c6.png" alt="svelte и vue.js" /></figure><p>Фреймворк Svelte использует иной подход к разработке веб-интерфейсов, нежели React и Vue. У него другая организация кода и свой алгоритм реализации проектов.</p><p>Ключевые отличия Vue.js и Svelte:</p><ul><li>Реактивность в Svelte стала частью языка. С этим фреймворком обновлять контент при изменении состояния гораздо проще.</li><li>Svelte превосходит другие фреймворки по скорости и легкости. Поскольку логика обновлений полностью перемещена в код, нет необходимости использовать Virtual DOM, что делает приложения более быстрыми.</li><li>Сообщество Svelte не такое обширное, поэтому у малоопытных прогеров могут возникнуть проблемы с решением необычных задач.</li><li>Документация у Vue.js тоже более подробная. У Svelte доки лаконичные и содержат только основную информацию о функционале.</li></ul><p>В целом Svelte менее популярный фреймворк, поскольку проект относительно молодой и пока больше распространен в профессиональной среде, нежели в любительской.</p><h2>Итоги</h2><p>Главные плюсы Vue — простота, доступность и возможность точечного применения. Поскольку у фреймворка низкий порог входа, он часто становится инструментом первого проекта у начинающих разработчиков. Достаточно нескольких недель, чтобы начать использовать Vue.js.</p><p>Экспертное сообщество сходится во мнении, что в 2025 году фреймворк не только не утратит, но, вполне возможно, увеличит свою популярность. Развитие и улучшение функционала Vue — непрерывный процесс, интенсивность которого легко оценить по периодичности появления новых версий.</p><p>Наш вывод однозначен: в ближайшее время фреймворк точно не забудут. Это конкурентоспособный и перспективный инструмент веб-разработки, привлекательный как для частных, так и для корпоративных проектов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Фреймворки, меняющие игру: выбираем идеальный инструмент для ваших веб-проектов</title>
      <link>https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki</link>
      <comments>https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki</guid>
      <description><![CDATA[<p>Популярные фреймворки для веб-разработки. Показываем основные виды фреймворков. Рассматриваем пошаговую инструкцию по использованию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki">Фреймворки, меняющие игру: выбираем идеальный инструмент для ваших веб-проектов</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Jan 2025 09:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Выбор фреймворка влияет на скорость, удобство разработки, производительность, масштабируемость и поддержку приложения. Рассмотрим популярные варианты для веб-разработки фронтенда, бэкенда и фулстека и сравним их между собой.</p><h2>Frontend фреймворки</h2><h3>React</h3><p>Это самый популярный фреймворк для создания веб-приложений. React используется в лендингах, динамических веб-приложениях и даже мобильных приложениях (<a href="https://tproger.ru/articles/your-first-app-in-react-native">React Native</a>).</p><p>UI здесь разбивается на независимые и переиспользуемые блоки. Такие компоненты легко интегрировать, комбинировать в разных частях приложения или между проектами. Фреймворк ускоряет разработку и рефакторинг.</p><p>React обращается к DOM только для обновления изменившихся компонентов. За счет этого повышается производительность приложения.</p><p>Пример простого React компонента:</p><h4>Преимущества фреймворка:</h4><ul><li>Облегчает повторное использование кода и поддержку приложений;</li><li>Имеет множество дополнительных библиотек и инструментов;</li><li>Виртуальный DOM снижает прямые манипуляции с DOM и повышает производительность приложения;</li><li>Фреймворк пользуется популярностью в сообществе. Как результат  —  множество учебников, разборов документации и сторонних библиотек.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Концепции JSX и управления состоянием могут быть сложны для новичков;</li><li>Плохая кроссбраузерная поддержка;</li><li>Требует дополнительных библиотек для маршрутизации и управления состоянием.</li></ul><h3>Vue.js</h3><p>Vue используется для разработки простых лендингов и комплексных веб-приложений. Это гибкое решение, которое можно интегрировать в проекты постепенно.</p><p>Преимущество Vue в его простоте и низком пороге входа. При этом фреймворк сохраняет статус мощного инструмента для разработки сложных веб-приложений.</p><p>Vue автоматически отслеживает зависимости между блоками и обновляет DOM при их изменении, как React.</p><p>Компонентная архитектура Vue позволяет разбивать UI на переиспользуемые части. Разметка, стили и логика разделяются «оболочкой», а это облегчает поддержку и масштабирование приложения.</p><p>Пример простого компонента Vue:</p><p>Экосистема Vue включает множество библиотек и плагинов, расширяющих возможности фреймворка. Например, Vuex для управления состоянием, Vue Router, Nuxt.js и другие.</p><h4>Преимущества фреймворка:</h4><ul><li>Понятный синтаксис и подробная документация;</li><li>Может использоваться как библиотека или цельный фреймворк в зависимости от проекта;</li><li>Есть поддержка серверного рендера;</li><li>Автоматически обновляет интерфейс при изменении данных;</li><li>Имеет небольшой вес файлов.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Меньше ресурсов и сторонних библиотек по сравнению с React и Angular;</li><li>Неполная документация на русском языке.</li></ul><h3>Angular</h3><p>С помощью Angular разрабатывают клиентские части веб-приложений. Этот фреймворк сложнее Vue и React.</p><p>Angular чаще используют для крупных веб-приложений. Например, панели администрирования, системы управления контентом и т. д.</p><p>По аналогии с Vue и React, фреймворк разбивает приложение на независимые, переиспользуемые блоки кода. Компоненты: шаблон; класс, описывающий поведение; стили.</p><p>Освоение Angular требует больше времени и усилий по сравнению с Vue и React из-за архитектуры и специфических концепций. Нужны углубленные знания по внедрению зависимостей, декораторам и модулям.</p><p>Пример простого Angular-компонента:</p><h4>Преимущества фреймворка:</h4><ul><li>Богатый выбор инструментов, шаблонов, которые сокращают сроки реализации сложных приложений;</li><li>Angular CLI расширяется за счет shematics, поэтому его легко доработать под конкретные задачи;</li><li>Есть поддержка TypeScript: статическая типизация улучшает качество кода;</li><li>Встроенная утилита для обновления проекта при переходе на новую версию Angular.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Ангуляр сложнее, чем Вью и Реакт. Его изучение занимает больше времени, если это первый фреймворк в карьере разработчика.</li></ul><h2>Backend фреймворки</h2><h3>Django (Python)</h3><p>Django подходит для широкого спектра приложений — от блогов до высоконагруженных веб-сервисов. Админ-панель фреймворка упрощает управление контентом и пользователями. Django часто используют для разработки новостных сайтов, интернет-магазинов, социальных сетей и образовательных платформ.</p><p>Фреймворк содержит множество инструментов для решения общих задач веб-разработки. «В комплекте» готовые библиотеки для аутентификации пользователей, администрирования контента, работы с формами, маршрутизации URL.</p><p>Django следует архитектурному шаблону Model-View-Controller (MVC). Модели определяют структуру данных, представления обрабатывают логику и взаимодействие с моделями, а шаблоны отвечают за представление данных пользователю.</p><p>Сильная сторона Django — его ORM (Object-Relational Mapping). Интерфейс для работы с базой данных на Python используется для написания сырых SQL-запросов. Django поддерживает PostgreSQL, MySQL, SQLite, Oracle.</p><p>Если ищете универсальный фреймворк для бэкенд-разработки на Python, Django определенно заслуживает вашего внимания.</p><p>Пример модели Django:</p><p>В примере определяем модель Article с полями title, content и published_at. Метод __str__ возвращает строковое представление объекта:</p><p>Представление article_list получает объекты Article из базы данных и передает их в шаблон для отображения.</p><h4>Преимущества фреймворка:</h4><ul><li>Широкий набор инструментов: включает ORM, аутентификацию и админ-панель;</li><li>Фреймворк задаёт структуру проекта — помогает разработчикам понимать, как и где добавлять новую функцию;</li><li>Защищен от SQL-инъекции и подделки межсайтовых запросов;</li><li>Подходит для высоконагруженных приложений.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Django ORM уступает последней SQLAlchemy.</li></ul><h3>Ruby on Rails (Ruby)</h3><p>Rails подходит для быстрого прототипирования и проектов, ориентированных на работу с базами данных. Его используют для SaaS-платформ, CRM-систем, CMS, маркетплейсов и многого другого.</p><p>Rails применяет архитектурный паттерн MVC (Model-View-Controller). Фреймворк хорош с точки зрения бизнес-логики и взаимодействует с базой данных с помощью ActiveRecord ORM.</p><p>Rails поставляется со встроенными инструментами и библиотеками. Например, ActiveRecord для работы с базами данных, ActiveStorage для управления файлами, ActionMailer для отправки email.</p><p>В сообществе Rails огромное количество гемов (библиотек), расширяющих функциональность фреймворка.</p><p>Пример модели Rails (с использованием ActiveRecord):</p><p>Пример контроллера Rails:</p><p>В примере определяем модель Article с валидациями и связями. Контроллер ArticlesController содержит экшены для списка статей, отображения отдельной статьи, создания новой статьи.  Приватный метод article_params используется для фильтрации параметров.</p><h4>Преимущества фреймворка:</h4><ul><li>Продуманная структура, которая продвигает стандарты качества и лучшие практики веб-разработки;</li><li>Active Record ORM упрощает взаимодействие с базой данных;</li><li>Vue, Angular.js и React легко интегрируются с Ruby on Rails.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Ruby on Rails js медленнее Django и Node.js.</li></ul><h3>Node.js с Express (JavaScript)</h3><p>Express — фреймворк Node.js с набором функций для разработки веб-приложений и API. В нем реализован простой интерфейс для HTTP-запросов и маршрутизации.</p><p>Node.js + Express используется для сервисов, серверных приложений (например, чатов или игр).</p><p>Преимущество Node.js и Express состоит в возможности писать на JavaScript как клиентскую, так и серверную сторону. Можно вести разработку на одном языке и делиться кодом с фронтендом и бэкендом.</p><p>Пример простого приложения на Express:</p><h4>Преимущества фреймворка:</h4><ul><li>JavaScript на всем стеке — один язык для фронтенда и бэкенда;</li><li>Имеет минимальные ограничения, можно строить архитектуру как удобно.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Отсутствуют встроенные компоненты, требуются дополнительные настройки для безопасности и работы с базами данных;</li><li>Управление обратными вызовами усложняет код и его поддержку.</li></ul><h2>Full-Stack фреймворки</h2><h3>Laravel (PHP)</h3><p>Laravel — фреймворк для веб-разработки на PHP. Он использует архитектуру MVC: разделяет логику приложения и улучшает организацию кода.</p><p>Laravel выбирают для разработки CMS, SaaS-платформ, электронной коммерции и др. Встроенные библиотеки ускоряют работу.</p><p>В фреймворке реализована:</p><ul><li>Система миграций для управления структурой базы данных;</li><li>Eloquent ORM для работы с данными;</li><li>Система шаблонизации Blade;</li><li>Встроенная поддержка аутентификации и авторизации;</li><li>Очередь заданий и планировщик для выполнения асинхронных задач.</li></ul><p>Пример определения маршрута в Laravel:</p><p>Пример контроллера Laravel:</p><p>Пример модели Eloquent:</p><p>В примерах выше определяем маршрут, который принимает id и возвращает строку с идентификатором. Контроллер UserController методом show получает пользователя из базы данных по id и передает его в представление user.profile. Модель User представляет таблицу пользователей в базе данных и определяет заполняемые атрибуты.</p><h4>Преимущества фреймворка:</h4><ul><li>Шаблонизатор Blade упрощает создание представлений;</li><li>ORM Eloquent облегчает работу с базами данных;</li><li>Есть автоматизация задач с помощью встроенных инструментов и командной строки.</li></ul><h4>Недостатки:</h4><ul><li>Сложности с долгосрочной поддержкой версий.</li></ul><h3>Spring Boot (Java)</h3><p>Spring Boot применяется для разработки микросервисов и облачных приложений. Модульная архитектура используется в независимых сервисах, которые легко масштабировать.</p><p>Фреймворк имеет встроенный контейнер сервлетов (Tomcat, Jetty), чтобы запускать приложение как автономный JAR-файл без развертывания на внешнем сервере.</p><p>Фреймворк также предлагает:</p><ul><li>Автоконфигурацию библиотек (JPA, JDBC);</li><li>Встроенные метрики мониторинга;</li><li>Поддержку внешней конфигурации;</li><li>Интеграцию с базами данных.</li></ul><h4>Преимущества фреймворка:</h4><ul><li>Есть встроенные серверы Tomcat, Jetty и Undertow;</li><li>Облегчает управление зависимостями с помощью стартовых пакетов;</li><li>Оснащен встроенным контейнером сервлетов;</li><li>Автоматическая конфигурация экономит время на старте проекта.</li></ul><h4>Недостатки:</h4><ul><li>Spring Boot создает множество неиспользуемых зависимостей и  увеличивает размер файла развертывания.</li></ul><h3>Meteor (JavaScript)</h3><p>Особенность Meteor в том, что он синхронизирует данные в реальном времени. Фреймворк автоматически обновляет пользовательский интерфейс при изменении данных на сервере. Это возможно благодаря протоколу DDP (Distributed Data Protocol) и реактивным источникам данных, таких как MongoDB.</p><p>На JS + Meteor можно писать код, который работает как на клиенте, так и на сервере. Фреймворк также предоставляет интегрированную систему сборки, которая автоматически объединяет ресурсы приложения.</p><p>Meteor выбирают для разработки приложений, требующих обновления данных в реальном времени (чаты, приложения для совместной работы, панели мониторинга,  игровые проекты). Его реактивная архитектура и синхронизация данных облегчают создание интерактивных и отзывчивых пользовательских интерфейсов.</p><h4>Преимущества фреймворка:</h4><ul><li>Архитектура и синтаксис с понятным кодом упрощают обучение новичков и повышают производительность команды;</li><li>Есть мгновенная синхронизация данных между клиентом и сервером;</li><li>Возможна интеграция базы данных MongoDB.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Не предлагает широкого функционала для масштабирования и разделения логики на модули;</li><li>Сложности с масштабированием при увеличении числа пользователей из-за обработки данных в реальном времени.</li></ul><p>При выборе фреймворка важно учитывать долгосрочные перспективы проекта. Также следует принимать во внимание доступность обучающих ресурсов и поддержки. Помните, нет идеального решения. Выбор фреймворка зависит от конкретных требований, ресурсов и предпочтений команды.</p>]]></content:encoded>
    </item>
    <item>
      <title>Какой JS-фреймворк выбрать новичку во фронтенде</title>
      <link>https://tproger.ru/articles/kakoj-js-frejmvork-vybrat-novichku-vo-frontende</link>
      <comments>https://tproger.ru/articles/kakoj-js-frejmvork-vybrat-novichku-vo-frontende?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[МТС]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakoj-js-frejmvork-vybrat-novichku-vo-frontende</guid>
      <description><![CDATA[<p>Рассказываем про React, Angular и Vue.js — трёх слонов, на которых держится мир современной веб-разработки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakoj-js-frejmvork-vybrat-novichku-vo-frontende">Какой JS-фреймворк выбрать новичку во фронтенде</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 01 Feb 2024 09:07:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>В жизни каждого начинающего фронтендера наступает момент: вёрстка и ванильный JavaScript уже освоены, а значит, пришло время выбрать своего бойца, точнее — фреймворк для дальнейшей работы.</p><p>От этого выбора может зависеть то, как быстро вы найдёте первую работу, в какой сфере и с какой зарплатой. В этой статье разберём плюсы и минусы самых популярных фреймворков, чтобы вам было проще определиться.</p><h2>Чтотакое фреймворк и чем он отличается от библиотеки</h2><p><i>Фреймворк</i> — каркас программы, как готовое тесто для пиццы. Вам не нужно покупать яйца, муку и молоко, замешивать тесто, ждать несколько часов. Достаточно выбрать любимый соус и начинку — и отправить всё в духовку.</p><p>Это значит, что у фреймворка есть постоянная и переменная части — модули и элементы, которые можно добавлять по желанию для кастомизации программы.</p><p>Часто фреймворки путают с библиотеками.</p><p><i>Библиотека </i>— коллекция функций, классов и методов, которые вы можете использовать в коде. Она не определяет структуру вашего приложения, а предоставляет инструменты для выполнения конкретных задач.</p><p>Работая с фреймворком, вы можете использовать много разных библиотек. Во фронтенде это jQuery, Lodash, Moment.js, D3.js и другие.</p><p>По сути популярный React — это тоже библиотека, а не фреймворк. Так как он даёт узкоспециализированный функционал для создания пользовательских интерфейсов веб-приложений и не задаёт их чёткую структуру. Но всё же мы будем рассматривать React вместе с другими фреймворками, как это чаще бывает на практике.</p><h2>Популярные JS-фреймворки</h2><p>Чтобы выбрать фреймворки для этой статьи, мы заглянули на HeadHunter и проанализировали, какие технологии наиболее востребованы у работодателей.</p><p>На первом месте с 3 371 результатом оказался React, на втором — Angular (1 361 вакансия), на третьем — Vue.js с 1 161 упоминанием. Поэтому о них сегодня и пойдёт речь.</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-01-31/cf128db3-1ef9-432d-ba9b-849f75c5171f.png" alt="" /></figure><h2>React</h2><p>React — фреймворк/библиотека JavaScript для разработки пользовательских интерфейсов. Это универсальное решение для создания небольших приложений.</p><p><b>Преимущества React:</b></p><ul><li>синтаксис JSX (JavaScript XML) делает код более читаемым и понятным</li><li>виртуальный DOM повышает скорость отрисовки компонентов</li><li>удобно создавать отдельные компоненты и переиспользовать их в других частях программы</li><li>используется направленный поток данных (дочерние элементы не влияют на родительские), за счёт чего в коде реже возникают баги</li></ul><p><b>Недостатки React:</b></p><ul><li>может показаться сложным для новичков, которые не знакомы с синтаксисом JSX</li><li>для создания сложных приложений необходимо использовать дополнительные библиотеки, что может усложнить поддержку проекта</li><li>для оптимальной работы с фреймворком надо знать такие инструменты, как Babel, Webpack, Redux</li></ul><p>Как выглядит программа Hello, world! на React:</p><h2>Angular</h2><p>Angular — фреймворк от компании Google для работы с интерфейсами.</p><p>Его первая версия AngularJS увидела свет в 2010 году, но после выхода React стали хорошо видны её недостатки, поэтому в компании решили переработать фреймворк. Так, в 2016 году появился Angular, который сейчас применяют во многих крупных компаниях для создания сложных корпоративных приложений.</p><p><b>Преимущества Angular:</b></p><ul><li>использует TypeScript, который добавляет статическую типизацию к JavaScript, что упрощает обнаружение ошибок</li><li>предоставляет всю необходимую инфраструктуру для разработки веб-приложений, включая маршрутизацию, управление состоянием, HTTP-запросы, валидацию форм и другие инструменты</li><li>включает в себя инструменты для оптимизации производительности, что улучшает скорость отрисовки интерфейса</li><li>удобный синтаксис для тех, кто переходит из бэкенда во фронтенд или фулстек-разработку</li></ul><p><b>Недостатки Angular:</b></p><ul><li>сложность освоения TypeScript для новичков в программировании, из-за этого высокий порог входа во фреймворк</li><li>не подходит для небольших приложений, так как весит 550-600 Кб</li><li>предлагает только один способ построения архитектуры ПО</li></ul><p>Как выглядит программа Hello, world! на Angular:</p><h2>Vue.js</h2><p>Vue.js — фреймворк для создания интерактивных пользовательских интерфейсов от разработчика Эвана Ю, более простая и лёгкая альтернатива другим фреймворкам и библиотекам.</p><p><b>Преимущества Vue.js:</b></p><ul><li>обладает интуитивно понятным синтаксисом, что делает его лёгким в освоении даже для новичков в веб-разработке</li><li>компонентная архитектура способствует переиспользованию кода, модульности и упрощает разработку</li><li>небольшой размер библиотеки (для архивированной версии — до 20 Кб), что обеспечивает быструю загрузку и меньшие требования к пропускной способности сети</li><li>подробная и понятная документация, в том числе на русском языке</li></ul><p><b>Недостатки Vue.js:</b></p><ul><li>редко используется крупными компаниями, что ограничивает возможности для поиска работы</li><li>имеет ограниченную экосистему, что может усложнить поиск решений для специфических задач</li></ul><p>Как выглядит программа Hello, world! на Vue.js:</p><h2>Какой фреймворк подойдёт вам</h2><p>Советуем найти бесплатные видео в интернете, которые рассказывают о синтаксисе и других особенностях фреймворков, и попробовать поработать с ними на практике.</p><p>Так вы сможете понять, что же вам ближе: React, Angular или Vue.js. Но не спешите и помните про базу — прежде чем переходить на фреймворки, хорошо разберитесь в работе JavaScript. Эти знания и умение гуглить правильные вопросы помогут разобраться в любой технологии.</p>]]></content:encoded>
    </item>
    <item>
      <title>Angular 17: что нового</title>
      <link>https://tproger.ru/news/angular-17--chto-novogo</link>
      <comments>https://tproger.ru/news/angular-17--chto-novogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/angular-17--chto-novogo</guid>
      <description><![CDATA[<p>Расшифровка видео об обновлениях в Angular 17, в котором разработчики рассказали о новых фичах фреймворка и изменениях в синтаксисе и рендеринге. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/angular-17--chto-novogo">Angular 17: что нового</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 30 Jan 2024 10:22:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>На официальном YouTube-канале Angular вышло видео, в котором разработчики рассказывают о новых фичах фреймворка в 17 версии.</p><p>Вот, о чём идёт речь в видео:</p><ol><li>Последняя версия Angular включает улучшения такие как управление потоком, отложенные представления и более быструю сборку.</li><li>На мероприятии для разработчиков Angular V17 был представлен новый сайт Angular.dev, который станет будущим домом для разработчиков Angular.</li><li>Angular.dev предлагает обновленную документацию, новую систему учебных пособий в браузере и площадку для кодирования, где можно изучать Angular, работая в браузере.</li><li>Angular обновил свою визуальную идентичность и логотип, отражающий текущие усилия и приоритеты в будущем.</li><li>Гидратация (hydration) в Angular, представленная в предварительной версии в v16, теперь стабильна и готова к использованию в производственных приложениях.</li><li>Введены важные обновления для гибридного рендеринга в Angular, позволяющие рендерить приложения на стороне клиента, сервера или предварительно рендерить их (SSG).</li><li>С версии v17 можно создавать приложения с гибридным рендерингом с помощью команды ng new и нового флага SSR.</li><li>Поддержка ESM для серверных сборок, ускорение сборок для серверных пакетов и улучшения для сервера разработки SSR.</li><li>Новый синтаксис управления потоком в шаблонах находится в предварительном просмотре и позволяет использовать встроенные конструкции if, for и switch.</li><li>Использование нового синтаксиса for может значительно увеличить производительность, в некоторых случаях до 90% быстрее.</li><li>Выпущены новые миграции для облегчения перехода на новый синтаксис.</li><li>Приложения, созданные с помощью CLI, по умолчанию будут независимыми, без необходимости использования флага.</li><li>ESBuild и Vite теперь включены по умолчанию, что обеспечивает улучшение производительности ‘из коробки’ для новых приложений.</li><li>Некоторые партнеры сообщили об улучшении времени сборки на 67%.</li><li>Сочетание SSR и SSG может привести к улучшению скорости сборки ngBuild на 87% и ускорению цикла редактирования-обновления для ngServe на 80%.</li><li>DevTools получили долгожданную функцию – возможность проверки графа внедрения зависимостей.</li><li>Теперь можно выполнять пользовательские преобразования ввода, а также доступны некоторые встроенные преобразования, такие как Boolean attribute и number attributes.</li><li>Добавлены новые свойства styles и styleUrls для принятия строк, так как разработчики редко используют более одного стилевого файла.</li><li>Для получения дополнительной информации можно обратиться к заметкам о выпуске и блогу Angular на blog.angular.io.</li><li>Команда Angular призывает разработчиков оценить новые функции и поделиться своими отзывами.</li></ol><p>Ниже представлен транскрибированный перевод ролика на русский язык.</p><p>Подождите, что? Управление потоком, виды, отложенные представления, быстрые сборки. Я не могу поверить, я не могу поверить, что вы получаете все это и еще намного больше в последней версии Angular.</p><h2>Новый сайт для Angular</h2><p>Давайте обсудим это. Во время мероприятия для разработчиков Angular V17, команда Angular представила Angular.dev, новый будущий дом для разработчиков Angular. Новый сайт предлагает обновленную документацию, новую систему интерактивных учебных пособий и даже общую площадку для кодирования, где вы можете попробовать Angular прямо в браузере во время обучения.</p><p>Теперь, что если я вам скажу, что есть еще? Надеюсь, вы мне поверите, потому что, ну, Angular стремительно развивался за последние несколько лет, и мы решили отразить это современным визуальным стилем и логотипом. Теперь этот новый четкий логотип отражает наши текущие усилия и будущие приоритеты. Чтобы узнать больше, зайдите на angular.dev, но, слушайте, не трогайте стены.</p><p>Мы только что закончили покраску места. В версии 16 мы начали улучшать серверную часть Angular, представив гидратацию в режиме предварительной версии для разработчиков. С тех пор мы приложили все усилия, чтобы еще больше улучшить этот опыт. И сегодня я очень рад объявить, что гидратация в Angular теперь стабильна и готова к использованию ваших приложениях в производстве.</p><h2>Гибридный рендеринг Angular 17</h2><p>Но подождите, вот что действительно потрясающе. Мы также внесли важные обновления в опыт гибридного рендеринга Angular. Гибридный рендеринг позволяет вам рендерить ваши приложения на стороне клиента, рендерить их на сервере или предварительно рендерить. Это также известно как SSG. Начиная с v17, вы можете создавать приложения с гибридным рендерингом с самого начала, используя ng new и новый флаг SSR.</p><p>Но мы не остановились на этом. Если вы забыли использовать флаг, не волнуйтесь, мы также обновили CLI, чтобы подсказать вам. Также добавлена поддержка ESM для серверных сборок. Сборки становятся быстрее для серверных пакетов, и мы не можем забыть, что мы даже проявили немного любви к dev-серверу для SSR.</p><h2>Изменения в синтаксисе</h2><p>Готовьтесь взять управление потоком в ваших шаблонах на новый уровень с новым синтаксисом управления потоком, который сейчас находится в режиме предварительной версии. Разработчики Angular теперь могут использовать встроенный синтаксис для if, for и switch. Хотя ничего не нужно импортировать, просто готово к использованию в ваших шаблонах. Теперь, что здесь еще потрясающе, это то, что использование нового синтаксиса for может значительно увеличить производительность, серьезно, до 90% быстрее в определенных случаях. Мы также выпустили новые миграции, чтобы облегчить ваш путь к использованию этого нового синтаксиса.</p><p>Запустите ng generate в angular forward slash core colon control dash flow. Подождите, что? Есть еще. Есть еще функции, о которых нужно рассказать.</p><p>К моменту окончания этого видео, оно будет длиться целый час, но это нормально, друзья. Давайте проведем молниеносный обзор некоторых других обновлений, доступных в этом выпуске. Новые приложения, созданные с помощью CLI, будут автономными по умолчанию.</p><h2>Прочие улучшения</h2><p>Не требуется флаг. ESBuild и Vite теперь включены по умолчанию, так что вы сразу получаете преимущества производительности для ваших новых приложений. Некоторые корпоративные партнеры сообщили о 67% улучшении времени сборки. Это действительно потрясающе, верно?</p><p>Я тоже так думаю. Но подождите, в сочетании с SSR и SSG, вы можете получить до 87% улучшения скорости в ngBuild и 80% более быстрый цикл редактирования и обновления для ngServe.</p><p>DevTools получают очень запрашиваемую функцию. Теперь вы можете проверить граф внедрения зависимостей с последними обновлениями, что делает отладку намного лучше.</p><p>Теперь вы можете выполнять пользовательские преобразования ввода, и мы даже предоставляем вам несколько встроенных, таких как логический атрибут и числовые атрибуты, экономя ваше драгоценное время, не приходится реализовывать их самостоятельно.</p><p>Мы добавили новое свойство styles и style URL для принятия строк, потому что, ну, разработчики редко используют более одной таблицы стилей. Но мы сохраняем оба формата на всякий случай, если вам понадобится.</p>]]></content:encoded>
    </item>
    <item>
      <title>Angular vs Vue: что выбрать в 2024 году</title>
      <link>https://tproger.ru/articles/angular-vs-vue--chto-vybrat-v-2024-godu</link>
      <comments>https://tproger.ru/articles/angular-vs-vue--chto-vybrat-v-2024-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/angular-vs-vue--chto-vybrat-v-2024-godu</guid>
      <description><![CDATA[<p>Сравнили фреймворки Angular и Vue. Рассмотрели преимущества и недостатки, сходства и различия, возможности карьерного роста.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/angular-vs-vue--chto-vybrat-v-2024-godu">Angular vs Vue: что выбрать в 2024 году</a>»</p>]]></description>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Jan 2024 11:55:19 GMT</pubDate>
      <content:encoded><![CDATA[<p>Англоязычный IT-блогер Daniel Dan сравнил фреймворки Angular и Vue. Он рассмотрел такие темы, как преимущества и недостатки, сходства и различия, возможности карьерного роста, и выяснил, какой из фреймворков лучше использовать для вашего проекта.</p><p>Вот, о чём идёт речь в видео:</p><ol><li>Даниэль обсуждает выбор между фреймворками Angular и Vue для разработки пользовательских интерфейсов.</li><li>Angular, созданный Google в 2010 году, предпочтителен для корпоративных проектов, имеет встроенные инструменты и библиотеки, а также поддерживает динамическую и двустороннюю привязку данных.</li><li>Angular использует TypeScript, обеспечивает высокую производительность благодаря иерархической инъекции зависимостей и другим функциям, поддерживается Google и легко интегрируется с сторонними приложениями.</li><li>Vue, созданный на основе вдохновения от Angular, отличается простотой и элегантностью, предлагает гибкость и прогрессивное развитие, позволяя легко добавлять пользовательские модули и компоненты.</li><li>Vue обеспечивает гибкость интеграции, простоту использования и функциональное расширение с помощью мощных API.</li><li>Angular и Vue имеют схожие черты: компонентно-ориентированную архитектуру, реактивную привязку данных и декларативный стиль программирования, а также большие сообщества разработчиков.</li><li>Основные различия между Angular и Vue включают архитектуру (Angular – MVVM, Vue – только ViewModel), реактивность, обработку ошибок, встроенные функции и производительность.</li><li>Выбор между Angular и Vue зависит от конкретных потребностей проекта и целей разработки.</li><li>Vue лучше подходит для динамических приложений, проектов, ориентированных на UI/UX, портфолио и одностраничных приложений.</li><li>Angular лучше подходит для кроссплатформенной и гибридной веб-разработки, крупных проектов и предприятий, требующих серверной отрисовки.</li><li>Angular и Vue обеспечивают высокооплачиваемые рабочие места, с зарплатами до $125,000 и $156,000 в год соответственно, а также возможности для фриланса.</li></ol><p>Ниже представлен транскрибированный перевод видео на русский язык.</p><p>Вы наверняка слышали о Angular и Vue. Это два суперпопулярных фреймворка, которые разработчики используют для создания полноценных пользовательских интерфейсов.</p><p>Но вам, как разработчику, может прийтись принять непростое решение. Какую из этих двух технологий использовать в конкретном проекте? Меня зовут Даниэль, и сегодня мы поговорим о противостоянии Angular и Vue. Мы изучим их плюсы и минусы, сходства и различия. Мы постараемся понять, какой из этих фреймворков лучше подходит для различных типов проектов.</p><h2>Преимущества Angular</h2><p>Итак, приступим. Vue против Angular, но для чего они хороши? Ребята, прежде чем мы начнем сравнивать эти два фреймворка, давайте обсудим, для чего они были созданы. Как вы знаете, каждая технология создается с определенной целью.</p><p>И когда вы понимаете, какая эта цель, легче принимать правильное решение. Angular, Angular, созданный Google в 2010 году. Это лучший выбор для корпоративных проектов благодаря своим обширным функциям и высокой производительности. В отличие от других фреймворков, Angular не замедляет приложения. Он предлагает встроенные инструменты и библиотеки. Его код может быть использован на различных платформах, что делает разработку гибкой.</p><p>Плюс, у него есть динамическое связывание пользовательского интерфейса и двустороннее связывание данных, важные элементы его дизайна. И ребята, у Angular есть множество преимуществ, которые делают его таким популярным среди разработчиков. Основанный на TypeScript. Прежде всего, ребята, это TypeScript, язык программирования, созданный Microsoft, который является бесплатным и с открытым исходным кодом. Он добавляет статическую типизацию с возможностью использования типовых аннотаций к JavaScript.</p><p>TypeScript, надмножество JavaScript, улучшает качество кода с помощью надежной навигации, рефакторинга и функций автодополнения, что уменьшает ошибки в масштабных приложениях. Поддерживается Google. Еще одно преимущество заключается в том, что фреймворк поддерживается Google. Это включает в себя подробную документацию и возможности для будущего расширения фреймворка. Следующее – высокая производительность. Благодаря иерархической инъекции зависимостей, IV-рендерингу, AOT-компилятору, дифференциальной загрузке и поддержке Angular Universal, производительность фреймворка выдающаяся.</p><p>Обновленное руководство. Angular CLI предлагает своевременные рекомендации по зависимостям, загрузчикам и плагинам. Благодаря этому разработчики остаются в курсе последних рекомендаций. Бесшовные интеграции. Angular позволяет легко интегрировать сторонние приложения. Это дает разработчикам гибкость и множество инструментов для упрощенной разработки. Наконец, возможность настройки. Разработчики могут интегрировать элементы и модули из других фреймворков, адаптируя их под свои потребности. Дело в том, что элементы HTML Angular могут быть легко повторно использованы и управляемы путем обертывания их в качестве элементов DOM.</p><h2>Преимущества Vue</h2><p>Итак, как вы видите, ребята, есть много преимуществ у Angular. Но теперь давайте посмотрим на Vue. Vue, также называемый Vue.js, это все о чистом и элегантном дизайне. Представьте себе фреймворк, который объединяет мощные веб-инструменты с простотой. Вот что такое Vue.</p><p>Теперь вот интересный факт. Создатель Vue был вдохновлен Angular. Он взял это вдохновение и создал Vue, фреймворк, который позволяет легко создавать современные веб-проекты. Одной из выдающихся особенностей Vue является его прогрессивный характер. Он динамичен, что означает, что вы можете настраивать код вашего приложения, не нарушая основной функциональности. Плюс Vue предлагает невероятную гибкость. Вы можете легко добавлять пользовательские модули и визуальные компоненты, настраивая ваши веб-приложения до совершенства.</p><p>Другими словами, ребята, есть много преимуществ, которыми можно наслаждаться. Во-первых, Vue – это все о гибкости. Он позволяет вам плавно интегрировать его в ваш существующий код без нарушения вашего рабочего процесса.</p><p>Традиционный подход. Еще одна крутая часть заключается в том, что Vue придерживается традиционного подхода. Он не усложняет вещи ненужным шаблонным кодом.</p><p>Вместо этого он оптимизирует процесс, делая разработку приложений быстрее и более простой. И, наконец, функциональное расширение. Vue предлагает функциональное расширение, предоставляя набор мощных API.</p><p>Эти функциональные возможности позволяют вам создавать гибкую и обширную логику компонентов. Так что, ребята, судя по всему, Vue не уступает Angular.</p><h2>Сходства между Angular и Vue</h2><p>Ребята, прежде чем я продолжу, я стараюсь делать образовательный контент в увлекательной форме, делать его интересным вместо скучным.</p><p>И взамен я прошу просто лайкнуть это видео и подписаться на мой канал, если вам нравится контент, который я делаю. Вот и все. Люди, помните, что создатель Vue использовал Angular в качестве своего вдохновения. Это означает, что у этих двух фреймворков JavaScript много общего.</p><p>Итак, давайте поговорим о самых больших сходствах между ними. Архитектура на основе компонентов.</p><p>И Angular, и Vue работают как строительные блоки. Они разбивают пользовательские интерфейсы на более мелкие части, называемые компонентами. Эти компоненты похожи на логические кирпичи, которые можно создавать индивидуально. Реактивное связывание данных привязывает ваши данные непосредственно к тому, что видят пользователи. Поэтому, когда ваши данные меняются, ваш дисплей автоматически обновляется, без дополнительной работы. И Vue, и Angular делают это в реальном времени. Декларативное программирование. Vue и Angular могут выглядеть по-разному, но они оба имеют замечательную особенность – декларативный стиль программирования. Вместо перечисления пошаговых инструкций, вы просто описываете, что хотите достичь. Сообщество. У Angular и Vue есть большие сообщества разработчиков, где люди предлагают улучшения и поддерживают фреймворки. Они формируют функции, исправляют проблемы и часто помогают другим разработчикам.</p><h2>Различия между Angular и Vue</h2><p>Хорошо, друзья. Vue.js и Angular – это оба инструмента для создания фронтенда приложений с использованием JavaScript. Однако во многих аспектах они отличаются. Эти области, например, включают основную архитектуру, производительность, реактивность и другие.</p><p>Но давайте поговорим об этом более подробно.</p><p>Архитектура. Angular похож на полноценного архитектора, модель MVVM. Отлично подходит для создания детальных и сложных приложений. Кроме того, он поддерживает все виды серверных языков. Это делает Angular универсальным. Vue похож на декоратор фронтенда, только модель Vue.</p><p>Он отлично улучшает внешний вид, но не является универсальным инструментом для всего процесса создания. Проще говоря, Angular – это все в одном. Vue – только для фронтенда. Реактивность. Angular полностью основан на JavaScript. Он отлично подходит для приложений в реальном времени. Vue также использует HTML и CSS и идеально подходит для создания одностраничных приложений.</p><p>Он автоматически отображает любые обновления. Обработка ошибок. Angular обрабатывает ошибки во время компиляции. Vue заботится о них на лету во время выполнения. Функции. Angular поставляется с встроенными функциями, такими как маршрутизация, формы и внедрение зависимостей.</p><p>Он идеально подходит для крупных проектов. Vue более легковесен и отлично подходит для одностраничных проектов. Производительность. Когда речь идет о скорости, Vue намного быстрее.</p><p>Почему? Дело в том, что Vue остается легким с акцентом на слое Vue. Vue также получает ускорение от виртуального DOM, обеспечивая дополнительную скорость на различных платформах. Angular с его многочисленными встроенными функциями немного тяжелее и требует больше времени на выполнение задач.</p><p>Хорошо, ребята, и теперь мы подходим к главному вопросу.</p><h2>Какой фреймворк следует выбрать для вашего проекта? Vue или Angular?</h2><p>Итак, принимая во внимание все вышесказанное, что лучше, Vue или Angular?</p><p>Честно говоря, как часто бывает с такими технологиями, здесь нет однозначного ответа. Я могу сказать, что у обоих фреймворков есть свои преимущества. Angular надежен и прошел проверку временем, а Vue быстр и прост в использовании. Выбор между ними зависит от ваших конкретных потребностей и целей вашего проекта.</p><p>А когда речь идет о Vue, я думаю, что имеет смысл использовать его для. Динамических приложений, проектов, сосредоточенных на пользовательском интерфейсе, портфолио и сайтов с большим количеством изображений, а также одностраничных приложений. С другой стороны, Angular более подходит для приложений, требующих надежной функциональности, особенно для крупных команд и масштабируемых проектов. Поэтому лучше использовать его для кросс-платформенной и гибридной веб-разработки. Больших проектов и предприятий, требующих серверного рендеринга. Но, ребята, это также зависит от стратегии разработки проекта и возможностей вашей команды разработчиков. Поэтому все зависит от поиска подходящего решения для целей вашего проекта. Возможности карьеры.</p><p>Конечно, есть еще один важный вопрос.</p><h2>Поможет ли изучение этих технологий получить высокооплачиваемую работу?</h2><p>Если вы планируете стать разработчиком на Angular или Vue, вам не о чем беспокоиться. Согласно недавнему опросу Stack Overflow, Angular входит в топ-5 самых популярных веб-фреймворков.</p><p>И Vue не сильно отстает. Это означает, что спрос на разработчиков Angular и Vue остается высоким. По данным Glassdoor, разработчики на Angular в Соединенных Штатах могут зарабатывать до $125,000 в год. В то же время разработчики на Vue могут зарабатывать до $156,000 в год. Фрилансеры на Angular зарабатывают от $16 до $30 в час. И фрилансеры на Vue зарабатывают около $19-35 в час.</p><p>Итак, как вы можете видеть, здесь существенная разница в отношении офисных работ и не так много в плане фриланса. Ладно, мои уважаемые разработчики, это все, что у меня есть по сравнению Angular и Vue.</p><p>https://www.youtube.com/@Daniel-Dan./videos</p>]]></content:encoded>
    </item>
    <item>
      <title>Как я создал CRM-систему</title>
      <link>https://tproger.ru/articles/kak-ya-sozdal-crm-sistemu-243764</link>
      <comments>https://tproger.ru/articles/kak-ya-sozdal-crm-sistemu-243764?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Dmitrii Starikov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ya-sozdal-crm-sistemu-243764</guid>
      <description><![CDATA[<p>Знакомим вас с личным опытом создания такой CRM-системы, которая позволила компании увеличить число закрываемых сделок почти в 3 раза.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ya-sozdal-crm-sistemu-243764">Как я создал CRM-систему</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Jul 2023 12:41:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всем привет, меня зовут Дмитрий Стариков, я веб-разработчик с 10-ти летним опытом работы. CRM программы – это незаменимый инструмент для бизнеса — они значительно облегчают работу, структурируют взаимодействие сотрудников и клиентов внутри крупных компаний. Я познакомлю вас с личным опытом создания такой CRM-системы, которая позволила компании увеличить число закрываемых сделок почти в 3 раза!</p><h2>Предыстория</h2><p>Проект начался в ИТ-отделе одного крупного риэлтерского агентства. На момент моего трудоустройства там уже существовала CRM-система. Она позволяла вести внутренний учет сотрудников, документооборот, базы сделок и клиентов и самое важное — вести базу объектов и автоматически выгружать их в рекламу на различные площадки. Система имела устаревший интерфейс на ExtJS, а бэкенд строился на связке PHP (Yii и значительная часть самописного legacy-кода), MySQL. В целом, проект устраивал руководство в техническом плане (за исключением интерфейса), но была серьезная проблема для бизнеса — многие объекты недвижимости не выходили в рекламу из-за ошибок программы. По этой причине компания теряла клиентов, а как следствие, прибыль.</p><p>Руководство поставило программистам четкие задачи:</p><ul><li>добиться качественного роста выхода рекламы объектов;</li><li>получать обратную связь по ним от рекламных площадок и предоставлять ее агентам для исправления.</li></ul><p>После исследования отчетов о выгрузках на рекламные площадки оказалось, что ситуация на самом деле плачевна — в рекламу выходило всего-лишь 20% всех объектов! Такие показатели возникли на фоне того, что разные рекламодатели предъявляли разные требования к полям и их структуре, содержимому и взаимосвязям.</p><p>Около года я работал над этой системой, и за это время ситуация кардинально изменилась — не выходило в рекламу уже всего лишь около 15% объектов, зачастую из-за невнимательности самих агентов. У компании увеличилось число закрываемых сделок, появились свободные средства для инвестиций в технологичность, и отсюда уже начинается история новой CRM. Набравшись экспертности в сфере риэлтинга и хорошо зарекомендовав себя, как разработчик, мне поручают заняться созданием новой CRM-системы.</p><h2>Начало работы</h2><p>Работа началась с большого комплекса задач, определивших развитие будущего проекта: общение с директором, руководителями отделов и будущими пользователями системы, формулирование задач с точки зрения бизнеса, анализ требований и формирование технического задания. Мы пришли к финальному результату за несколько итераций с рисованием схем, макетов, мозговыми штурмами. Параллельно я изучал опыт и ошибки других разработчиков со схожими задачами и стеком, чтобы еще на стадии проектирования разрешить потенциальные проблемы — повезло, что руководство позволило инвестировать в это время, а не требовало MVP на следующий день, как это зачастую бывает.</p><p>Под наши задачи я выбрал архитектуру SPA (одностраничное приложение). То есть фронтенд подгружался при первом заходе, а дальше просто подгружал данные и позволял агенту с ними работать без перезагрузки страницы. Бэкенд же отвечал непосредственно за авторизацию, получение, изменение и выдачу данных, ничего не зная о шаблонах и представлении данных для пользователя. Такое разделение удобно тем, что при необходимости можно просто заменить любой из модулей (или же использовать уже готовый backend/API, например, для мобильного приложения), каждый модуль может писаться раздельно разными разработчиками и при этом они никак не будут друг другу мешать. Кроме того, JS-фреймворки (вроде AngularJS, React, VueJS) позволяют на порядок проще сделать фронтенд, чем в известных мне MVC-фреймворках на PHP.</p><p>Был выбран следующий стек:</p><ul><li>frontend на AngularJS;</li><li>backend на легковесном PHP-фреймворке FlightPHP;</li><li>отдельно был создан микросервис на Python, отслеживающий изменения в объектах и создающий файлы для автоматической выгрузки в API рекламных порталов;</li><li>MariaDB.</li></ul><p>Выбор был продиктован отчасти архитектурными решениями, отчасти опытом и пожеланиями разработчиков, которые занимались проектом. Так как системе по самой сути решаемой задачи не суждено было стать нагруженной, то, руководствуясь принципом YAGNI, я не стремился вкладывать много ресурсов в подготовку системы к таким нагрузкам, а делал ставку на ее легкость и гибкость. На первый план выходили:</p><ul><li>скорость и удобство разработки;</li><li>современный интерфейс;</li><li>гибкая реализация требований;</li><li>архитектура, способная к гибкой интеграции новых фич и расширению старых;</li><li>решение всех накопившихся в старой CRM проблем.</li></ul><h2>Хранилища</h2><p>Из-за некоторых бизнес-ограничений мы использовали только собственные серверы для хранения данных и развертки системы (из-за ограничений бизнес-стороны мы не могли использовать облачные файловые хранилища для загружаемых документов и фотографий).</p><p>Про проектирование базы данных, не вдаваясь глубоко в бизнес логику, рассказать сложно. Если коротко, то с учетом прошлого опыта, мною были спроектированы новые таблицы с необходимым набором полей, убрана излишняя нормализация, где она приводила к путанице. В других местах, наоборот, проведена нормализация, названия таблиц и полей приведены к единому стилю, созданы таблицы для новых сущностей и т.д.</p><p>Отдельно можно выделить описание ролей. Думаю, многим знакома ситуация, когда менеджмент просит добавить условную кнопку “вот здесь”, при этом кнопка должна делать “вот это”, должна быть видна одним, другим не видна вообще и т.д. Натерпевшись подобных пожеланий при разработке прошлой системы, мне удалось избежать таких проблем в новой.</p><p>Первая таблица с перечислением всех возможных прав (например, создавать/читать/обновлять/удалять объекты определенного типа, доступ к разделам и т.д., но позже там могли появляться и специфические права, которые вписываясь в архитектуру, не становились костылями). Вторая таблица была набором строк, в которых связывался идентификатор пользователя, группы (отделы) или роли (администратор, начальник отдела и т.д.), идентификатор права и к кому это право применяется (ко всему, к своему, или даже по идентификатору и типу). Таким образом, можно настроить любые права: понадобилось внутри отдела в обход начальника назначить человека, который может утверждать объекты для выхода в рекламу? Пожалуйста. Может быть какой-то из отделов хочет новую фичу? Без проблем. Еще в трех таблицах перечислялись те самые пользователи, роли и отделы — тут все стандартно. Также мы хранили фотографии и документы по сделкам. Файлы загружались на отдельный сервер, который просто подключался через символическую ссылку в директории проекта.</p><h2>Интерфейс</h2><p>AngularJS из коробки или с минимальными доработками предоставлял почти все необходимое: быстро появилась красивая архитектура, был прописан роутинг, создана авторизация через JWT-токены и поддержка прав пользователя, о которых рассказывалось выше. Сам UI создавали на основе Angular Material, что колоссально сэкономило время — был создан шаблон, куда постепенно включались все новые и новые разделы. Различные модули по возможности переиспользовали уже готовые представления.</p><p>Отдельное внимание уделю формам. Так как одна из основных задач — это дать агенту инструмент, при помощи которого он единожды опишет объект по всем параметрам и будет уверен, что он будет рекламироваться, то большое внимание было уделено именно этому, и снова AngularJS приятно удивил, буквально одним условием в атрибуте тэга проводилась валидация не только этого поля, но и других, выводились подсказки и ошибки, скрывались лишние опции в селектах, отображались и скрывались поля, которые актуальны именно для описываемого объекта — и все это в одной форме, разделенной для удобства на 3 экрана в слайдере. Забегая вперед, скажу, что такой подход полностью хоть и потребовал изрядно попотеть над документацией API рекламных площадок, совмещая различные описания полей, все же полностью себя окупил — после запуска новой CRM в продакшн были единичные случаи ошибок выгрузки, потому что агент уже на стадии заполнения вынужден был оформить все правильно. Немногочисленные ошибки касались в основном ситуаций, которые невозможно отловить программным путем: например, на фотографиях указывались контакты (что запрещено большинством площадок), в описании был какой-то фрагмент, приводящий к блокировке.</p><figure><img src="https://media.tproger.ru/uploads/2023/07/3528411e-450f-4839-9712-e4be56bffc98.jpg" alt="" /></figure><p>Так как агенты немалую часть рабочего времени проводят вне офиса, то крайне полезным оказалась и возможность без больших трудозатрат создать адаптивный дизайн на базе того же шаблона. Конечно, заполнять огромные формы с телефона неудобно, да и не нужно, но вот посмотреть контакт, информацию по объекту или сделке — вполне.</p><figure><img src="https://media.tproger.ru/uploads/2023/07/32824652-0f3e-40f2-9dbd-e71abd53e8d2.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2023/07/a9dbdd36-2fdf-441b-a6a4-c6f3ccf615fb.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2023/07/35360184-6a25-407a-bef0-f340b931258f.jpg" alt="" /></figure><h2>Backend</h2><p>На фреймворке FlightPHP реализовали REST API с около сотни методов, осуществляющих CRUD-операции по всем сущностям, а также генерацию отчетов, PDF файлов с корпоративным оформлением т.д. Flight конечно не сравнится с Yii или Symfony в плане построения сложных систем. Простейший шаблонизатор и валидатор запросов, роутинг, работа с входящими данными, кэширование, вывод ошибок, триггеры позволили полностью покрыть задачи проекта. Кроме самого API к бэкенду можно отнести и микросервис по выгрузке в рекламу, задача которого в том, чтобы сформировать корректные XML-файлы, транслируя модель наших данных на модель данных конкретной площадки, а затем парсящий ответные отчеты от площадок и заносящий информацию об ошибках в систему.</p><figure><img src="https://media.tproger.ru/uploads/2023/07/8c0e03b9-baf0-4602-b3fd-73a3cb9c9a7e.jpg" alt="" /></figure><h2>Выводы</h2><p>Если вам доведется создавать CRM, то постарайтесь на стадии проектирования пообщаться со всеми интересантами разрабатываемого продукта, выявить проблемы и пожелания. Изучите возможные инструменты, взвесьте их плюсы и минусы, оцените насколько они подойдут именно под ваши задачи. Постарайтесь предугадать развитие событий, что может понадобиться в будущем. Грамотное начало проекта окупится в дальнейшем, когда не придется переписывать компонент за компонентом, хаотично добавлять “временные” таблицы, новые столбцы и постоянно заниматься правками ошибок.</p><p>Результатом работы стала система, позволившая большому числу сотрудников работать в едином информационном поле, создавать в нем объекты для рекламы, которые в дальнейшем автоматически выставлялись на различных порталах, не требуя лишних затрат времени от агента. Сама компания получила удобный инструмент для объективного контроля за развитием, всю необходимую статистику для дальнейшего анализа и принятия решений, рост числа клиентов и прибыли. В дальнейшем проект получил свое развитие, стал обрастать множеством дополнительных функций, которые довольно гладко интегрировались в существующую архитектуру — и даже спустя несколько лет на этот получившийся код приятно посмотреть с эстетической точки зрения.</p><p>Это был большой и сложный проект, можно сказать, мой дебют. Здесь потребовалось не только быть рядовым разработчиком, а занимать критически важную роль: пройти весь путь от проектирования до запуска, управлять командой и процессом разработки. Надеюсь, что какие-то мысли из этого рассказа будут полезны для других компаний и разработчиков.</p>]]></content:encoded>
    </item>
    <item>
      <title>XSS- и CSRF-атаки — разбираем уязвимости</title>
      <link>https://tproger.ru/articles/xss-i-csrf-ataki-razbiraem-ujazvimosti</link>
      <comments>https://tproger.ru/articles/xss-i-csrf-ataki-razbiraem-ujazvimosti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Ржевская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/xss-i-csrf-ataki-razbiraem-ujazvimosti</guid>
      <description><![CDATA[<p>Рассказываем об уязвимостях #frontend-приложений XSS и CSRF, разбираем дефолтную политику браузера и пути её обхода или настройки</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/xss-i-csrf-ataki-razbiraem-ujazvimosti">XSS- и CSRF-атаки — разбираем уязвимости</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 13 Jul 2021 12:52:35 GMT</pubDate>
      <content:encoded><![CDATA[<p>В контексте веб-безопасности есть два основных вектора атаки, которые необходимо учитывать:<a href="https://en.wikipedia.org/wiki/Cross-site_scripting"> XSS</a> и<a href="https://developer.mozilla.org/en-US/docs/Glossary/CSRF"> CSRF</a>. Прежде чем рассказать о них, необходимо понимать дефолтную политику браузера насчёт взаимодействия между вкладками — точнее, взаимодействия между скриптами с разным origin’ами. Эта политика называется<a href="https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy"> Same Origin Policy</a> (SOP). Её центральное понятие — <b>Origin</b> (~ источник) скрипта/документа. Он определяется комбинацией трёх понятий: протокола (http/https, etc.), <b>хоста</b> (my-website.com) и <b>порта</b> (например, 443 для https и 80 для http).</p><p>Вот примеры, которые браузер будет интерпретировать как скрипты с <b>одинаковым</b> origin’ом. Если на открытой вкладке присутствует 3 скрипта, origin’ы которых отличаются подобным образом, то браузер будет воспринимать их как скрипты с одним origin’ом:</p><p>А такие origin’ы будут считаться <b>разными</b>:</p><p>https://melicious-website/home</p><p>Важная особенность SOP: скрипт с одним origin’ом может посылать запросы на другой origin. Однако не сможет прочитать ответ на него. Чтение ответа будет заблокировано <b>на уровне браузера</b>. Если требуется заблокировать в том числе отправку запросов (скажем, вы не хотите, чтобы скрипты, загруженные на вашем сайте с других origin’ов, могли делать запрос на origin сайта), это тоже возможно реализовать посредством указания<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP"> Content Security Policy</a>. Но дефолтная политика (SOP) работает именно так.</p><figure><img src="https://media.tproger.ru/uploads/2021/07/Screenshot-2021-06-07-at-11.07.31.png" alt="" /></figure><h2>XSS / JS-Injections</h2><p>Наиболее часто встречающейся атакой является Cross-Site Scripting («Межсайтовый скриптинг»), или более удачное, на мой взгляд, название — <b>JS-инъекции</b> (по аналогии с SQL-инъекциями).  Если в html-документ вставить строку, в которой будут использоваться элементы, похожие на html-теги, то браузер будет интерпретировать их как валидный html-код и исполнять его. Например, можно прописать <img /> с пустым src и добавить onerror=“alert(‘hacked’)” (так как src пустой, то браузер сразу перейдет к вызову onerror), внутри которого выполнить любой JS-код (имея доступ к localStorage и так далее).  Также можно поместить вредоносный скрипт внутрь запроса query params в следующем виде:</p><figure><img src="https://media.tproger.ru/uploads/2021/07/Screenshot-2021-06-04-at-16.25.44.png" alt="" /></figure><h2>Предотвращение JS-инъекций</h2><p>В современных фреймворках (вроде Angular/React) изначально действует<a href="https://en.wikipedia.org/wiki/HTML_sanitization#:~:text=HTML%20sanitization%20is%20the%20process,code%20submitted%20by%20a%20user."> санитизация</a>, которую в случае необходимости (если вы хотите запустить inline-скрипт из строки и уверены, что там не содержится ничего вредоносного) можно отключить. В React’е это делается посредством атрибута, подчеркивающего опасность вставки inline-скриптов:<b> </b></p><figure><img src="https://media.tproger.ru/uploads/2021/07/Screenshot-2021-06-04-at-11.07.27.png" alt="" /></figure><p>В Angular’е можно за’inject’ить санитайзер и выбрать тот уровень санитизации, который подходит под ситуацию. Например, можно разрешить чтение стилей, но при этом экранировать любые скрипты.</p><figure><img src="https://media.tproger.ru/uploads/2021/07/Screenshot-2021-06-07-at-01.05.26.png" alt="" /></figure><p>Выглядит это так:</p><p>Помимо санитизации существует<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy"> Content Security Policy</a> (CSP) Header. Через него можно явно задать, скрипты с каким origin’ом могут исполняться браузером на текущей странице. По дефолту Content Security Policy содержит значение *. То есть браузеру разрешено запускать скрипты с любым origin’ом, включая inline-скрипты без origin’а. Такие настройки считаются очень <b>небезопасными</b>, и рекомендуется всегда явно указывать, скрипты с каким origin’ом можно запустить на сайте.  Явное указание ограниченного набора origin’ов заодно предотвращает исполнение inline-скриптов. Чтобы разрешить их исполнение, требуется явно это прописывать.</p><p>Пример того, как может выглядеть CSP Header:</p><p>Такие настройки означают, что изображения могут подгружаться с любого источника (*), media только с двух источников (<a href="http://media1.com">media1.com</a> &amp; media2.com). А скриптам позволено запускаться, если они имеют только один origin (userscripts.example.com). default-src ‘self’  позволяет запускать скрипты с текущего origin’а, но не его поддоменов.</p><p>Посредством CSP-заголовка можно очень тонко настраивать исполнение скриптов на сайте.</p><p><b>content-security-policy Header</b> и<b> access-control-allow-origin</b> немного похожи. CSP позволяет обходить SOP, а access-control-allow-origin позволяет получать разрешение на CORS. То есть отвечать (response) на запросы скриптов с другим origin’ом.</p><p>В начале статьи я упоминал, что SOP позволяет скриптам с одним origin’ом делать запросы на другой origin, однако SOP заблокирует ответ. Посредством access-control-allow-origin можно получить доступ к этому ответу, если на сервере явно прописан origin, который имеет право получать ответы.</p><p>Если кратко и утрированно, то SCP — это про SOP и frontend-часть системы. А access-control-allow-otigin — про CORS и backend-часть.</p><h2>CSRF (XSRF)</h2><figure><img src="https://media.tproger.ru/uploads/2021/07/Screenshot-2021-06-07-at-01.16.23.png" alt="" /></figure><p>Второй по распространённости тип уязвимости — это <b>Cross-Site Request Forgery</b> («<a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D0%BB%D0%BA%D0%B0_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0">Межсетевая подделка запроса</a>»). Этот вектор атаки использует склонность браузера неявно добавлять куки к любому запросу. Например, вы авторизовались на сайте, где используются куки, и в какой-то момент некий скрипт делает запрос на origin этого банка — то есть открыли почтовый клиент и перешли по вредоносной ссылке. Браузер автоматически добавит куки к запросу, даже если сам запрос происходит с другой вкладки.</p><p>Из-за SOP этот скрипт не будет иметь доступа к response. Но он сможет выполнять запросы <b>на правах авторизованного</b> пользователя. Например, сделать запрос на перевод денег или просто на удаление любой возможной информации.</p><p>Для предотвращения этой атаки в первую очередь рекомендуется использовать явные системы аутентификации. Например, session token / jwt в header или session token в body param. Также, если на сайте используется какая-то форма, то рекомендуется реализовывать <b>anti-csrf token</b>’ы. Их суть в том, что сервер в response отдаёт два случайных токена. Один предназначен для куков, другой прячется в скрытом поле формы. Когда клиент submit’ит форму, то должен отправить оба токена обратно на сервер. В случае, если они отличаются от того, что сервер выпустил изначально, сервер блокирует запрос.</p><h2>Integrity</h2><figure><img src="https://media.tproger.ru/uploads/2021/07/Screenshot-2021-06-06-at-21.55.23.png" alt="" /></figure><p>В контексте информационной безопасности существует понятие CIA triad, объединяющее три аспекта:</p><ul><li>конфиденциальность; доступ к информации должен иметь только тот, кому она предназначается;</li><li>доступность: информация должна быть доступна в нужном объеме и в нужное время;</li><li>связность: то, насколько части системы могут доверять передаваемым друг другу сообщениям, и не произошло ли в процессе передачи нарушения данных.</li></ul><p>В web’е это можно представить в виде отношений между frontend’ом и backend’ом. В html есть специальный атрибут<a href="https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity"> integrity</a>, позволяющий запускать скрипт только в том случае, если он не отличается от того, что изначально подразумевали его разработчики.</p><p>Предположим, что вы используете<a href="https://developer.mozilla.org/ru/docs/Glossary/CDN"> cdn</a> (content delivery network) для оптимизации скорости доставки приложения, однако вы хотите быть уверены, что приложение, которое вы сбилдили сами, и то, которое получаете из cdn, — одно и то же. В этом случае можно в процессе прод-билда приложения сгенерировать integrity-хеш, который указывается следующим образом:</p><p>И когда браузер попытается загрузить скрипт из cdn, то, используя указанный алгоритм (в данном примере sha384) сгенерирует новый хеш на основе загруженного скрипта, произведет сравнение и позволит его запустить только в том случае, если хеши не отличаются.</p><p>В случае Angular’а включить генерацию таких хешей можно с помощью флага</p><p><a href="https://angular.io/cli/build">—subresource-integrity</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Реактивные формы в Angular</title>
      <link>https://tproger.ru/articles/reaktivnye-formy-v-angular</link>
      <comments>https://tproger.ru/articles/reaktivnye-formy-v-angular?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Danil Sabirov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/reaktivnye-formy-v-angular</guid>
      <description><![CDATA[<p>Разработка форм в Angular остаётся трудозатратным процессом, который вызывает сложности. Разбираемся, как работать с реактивными формами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/reaktivnye-formy-v-angular">Реактивные формы в Angular</a>»</p>]]></description>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Reactive Forms]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 17 Mar 2021 13:56:35 GMT</pubDate>
      <content:encoded><![CDATA[<p>Несмотря на появление фронтенд-фреймворков, разработка форм в Angular остаётся трудозатратным процессом, который вызывает сложности<b>. </b>Зайдите на Stackoverlow и проверьте количество запросов по «‎Angular forms» — увидите более 48 тысяч. Почему так много? На мой взгляд, одна из проблем — два подхода реализации форм в Angular<b> </b>из коробки. Это шаблонный подход (Template-Driven Form) и реактивные формы (Reactive Form). Новички могут смешивать их в коде — отсюда и значительная часть вопросов.</p><p>Для создания форм в Angular<b> </b>я рекомендую Reactive Forms<b>. </b>Так можно использовать реактивную парадигму программирования, что более естественно для языка.</p><h2>Работа с реактивными формами</h2><p>Кратко работу с реактивными формами можно описать так: вы явно описываете форму в контроллере, включая валидацию и маппите свою модель данных на модель формы. А все необходимые операции с данными производите явно через методы формы. Также можно зарефакторить переиспользуемую логику. Модель формы описывается отдельно, благодаря этому модель данных останется неизменной во время работы пользователей с формой.</p><p>Для наглядности возьмём пример по Template-Driven Form из <a href="https://github.com/dansabirov/toh-reactive-forms">туториала Tour of Hero</a> и перепишем его на реактивные формы. В результате получим следующий код контроллера <b>hero-form.component.ts</b>:</p><p>Первое на что стоит обратить внимание: помимо модели данных, мы создали объект класса FormGroup. С ним мы сможем описать модель представления формы и затем передать ее непосредственно форме.</p><p>Из примера выше, можно заметить, что наша FormGroup создается через другой класс FormBuilder. По сути, это класс-помощник, позволяющий создать объекты формы: FormGroup, FormControl и FormArray. К тому же наша модель формы сейчас почти идентично повторяет модель данных model.</p><p>Операция маппинга модели данных на модель формы (и в последующем обратный маппинг) требует дополнительный код. Но несмотря на это нашего подхода есть один очень большой плюс. Модель данных на время работы с формой остаётся неизменной. Это позволяет сделать логику более гибкой. Плюс к вашему коду будет проще написать тесты. Замечу, что в своём примере, я пока намеренно не маппил модель данных на модель формы, чтобы осветить этот вопрос подробнее чуть ниже.</p><p>Примечание Несмотря на то, что в Template-Driven Form работа с формой происходит с директивой ngForm, «под капотом» она тоже неявно создаст объект FormGroup (советую для общего понимания ознакомится с <a href="https://github.com/angular/angular/blob/master/packages/forms/src/directives/ng_form.ts#L100">исходниками</a>).</p><p>Теперь рассмотрим код получившегося шаблона <i>hero-form.component.html</i>:</p><p>Первое, что замечаем — это передача нашей модели формы heroForm директиве [formGroup]. Angular для инициализации реактивной формы использует директивной подход с помощью селектора [formGroup], тем самым создавая <a href="https://github.com/angular/angular/blob/master/packages/forms/src/directives/reactive_directives/form_group_directive.ts#L57">объект FormGroupDirective</a> c обязательным параметром типа FormGroup. Второе, на что стоит обратить внимание — мы подписываемся на событие ngSubmit, которое вызовется в случае сабмита формы (в нашем случае по нажатию по кнопке Submit<b>)</b>.</p><p>Третий пункт нашей формы — это атрибуты formControlName, по которым сработает другая реактивная директива <a href="https://github.com/angular/angular/blob/master/packages/forms/src/directives/reactive_directives/form_control_name.ts#L65">FormControlName</a>. Она принимает в качестве параметра названия поля формы и создаёт объект FormControl. А также привязывает его к родительскому FormGroup и связывает контрол по указанному полю с html элементом.</p><p>Опционально можно описать для каждого из контролов элементы валидации. Так, в нашем примере в разметке пользователю мы показываем что поля Name и Power обязательные. Делается это довольно просто:</p><ol><li>Получаем необходимый FormControl с помощью метода get формы;</li><li>Далее получаем стандартный набор состояний контрола: valid, invalid, pending, disabled, enabled, dirty, pristine, touched, untouched (см. более подробно <a href="https://angular.io/api/forms/FormControl">официальное API</a>);</li><li>Реализуем нужное поведение элемента валидации, поверяя необходимые свойства контрола.</li></ol><p>В качестве финального шага, проверяем факт валидности нашей формы с помощью valid. И не даём засабмитить форму до тех пор, пока форма не валидна.</p><p>Если запустить код проекта, мы увидим, что форма пустая. Дело как раз в том, что мы незамаппили нашу модель. Попробуем сделать это через метод setValue:</p><p>Вместо того, чтобы увидеть нашу форму в браузере, в консоли получим ошибку:</p><p>Проблема в том, что setValue ищет для каждого поля модели соответствующее поле в модели формы. Мы не описали поле id, так как оно излишне в  представлении. Есть три пути решения проблемы. Самый верный — вручную замаппить модель данных на модель формы:</p><p>Также нам ничего не мешает создать у нашей формы поле id, но в шаблоне не создавать для него контрол. Тогда мы сможем маппить нашу модель сразу на форму:</p><p> Примечание resetForm сбросит все поля в дефолтные.</p><p>Наконец, можем воспользоваться методом patchValue, который для каждого найденного поля объекта в форме перепишет значение. А если не найдёт, то просто пропустит его. Это допустимо, если вы точно знаете, что модель данных всегда придёт со всеми необходимыми полями для формы:</p><h2>Дочерние группы</h2><p>Следующий пункт, который я хочу осветить — создание внутри объекта модели дочерние группы или одной FormGroup внутри другой. В реальных проектах это необходимо, потому что формы, как правило, составные. Рассмотрим добавление подгрупп на нашем примере. Сначала создадим класс Phone  и добавим поле phone в нашу модель данных:</p><h3>phone.ts:</h3><h3>hero.ts:</h3><p>Теперь добавляем в модель формы поле phone:</p><p>В шаблоне добавляем разметку для отображения телефона:</p><p>Как видим, логика проставления здесь похожа, за исключением того, что мы связываем группу по директиве formGroupName. Остальное на себя возьмёт Angular, который свяжет её с родительской формой.</p><p>На практике вложенные формы обычно вынесены в отдельные компоненты, чтобы их можно было переиспользовать. Поэтому для нашего примера создадим отдельный компонент phone. Шаблон оставим таким же, а контроллер сделаем так:</p><p>Строка viewProviders нужна  директиве FormGroupName, которая будет искать форму внутри host-элемента. В нашем случае у группы нет формы, и мы передаём провайдер, который найдёт родительскую форму. Если этого не сделать, мы получим ошибку:</p><h2>Подводим итоги</h2><p>Реактивные формы в Angular создаются так:</p><ol><li>Создаём объект формы FormGroup, которая описывает вашу модель данных и правила валидации;</li><li>Маппим модель данных на модель формы;</li><li>Angular создаст реактивную форму, когда найдёт директиву [formGroup] с переданной ей моделью формы в шаблоне</li><li>Дочерние элементы формы в шаблоне связываются по следующим атрибутам formGroupName, formControlName и formAttayName  ;</li><li>Объект формы FormGroup содержит все необходимые <a href="https://angular.io/api/forms/FormGroup">методы</a> для того, чтобы получить отдельный контрол и проверить его состояние и состояние всей формы. А также для того, чтобы установить или обновить значение контролов формы. И ещё включает событие ngSubmit, чтобы отловить сабмит формы.</li></ol><h2>Рекомендуемые материалы</h2><ol><li>Исходный <a href="https://github.com/dansabirov/toh-reactive-forms">код проекта</a></li><li>Общее описание реализации форм с официального сайта <a href="https://angular.io/guide/forms-overview">Angular</a></li><li>Более <a href="https://angular.io/guide/reactive-forms">подробное описание</a> <i>Reactive Forms</i> с примерами на сайте Angular</li><li><a href="https://angular.io/api/forms">Api</a> по формам с сайта Angular</li><li>Исходники Angular, где вы можете более подробно изучить <a href="https://github.com/angular/angular/tree/master/packages/forms/src">код форм</a></li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Angular 5 Material для начинающих</title>
      <link>https://tproger.ru/translations/angular-5-beginners-guide</link>
      <comments>https://tproger.ru/translations/angular-5-beginners-guide?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Кирилл Поздеев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/angular-5-beginners-guide</guid>
      <description><![CDATA[<p>Знакомство с Angular 5 Material: установка Angular CLI, создание проекта и работа с компонентами библиотеки на практическом примере.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/angular-5-beginners-guide">Angular 5 Material для начинающих</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jul 2018 07:20:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Данный материал посвящен изучению Angular 5 Material. В примере будет использоваться именно пятая версия, потому что с новыми релизами появляются все новые и новые возможности в фреймворке. Так, например, переход с AngularJS на Angular 2 ознаменовался полной переработкой всего фреймворка.</p><h2>Начало работы с Angular 5 Material</h2><p>Для начала необходимо установить Angular CLI глобально во всей системе. Для этого нужно выполнить следующую команду:</p><p>Также вы можете ознакомиться с полной документацией по установке на <a href="https://angular.io/guide/quickstart">сайте разработчиков</a>.</p><h2>Создание проекта</h2><p>В командной строке выполните следующую команду:</p><p>С её помощью мы создадим новый проект. Все нужные компоненты приложения будут сгенерированы автоматически.</p><h2>Установка Angular Material и Angular CDK</h2><p>В командной строке введите команду для установки компонентов и их зависимостей:</p><h2>Установка модуля Animations</h2><p>Для работы с Angular Material нужно установить модуль Animations:</p><p>Теперь надо импортировать модули в файле app.module.ts:</p><p>Затем нужно добавить новый модуль, который будет отвечать за Angular Material Components. Для этого создется файл в src/app с именем ngmaterial.module.ts:</p><p>Теперь модуль MatButtonModule добавлен в приложение. Далее надо<br />зарегистрировать MaterialAppModule в app.module.ts:</p><h2>Подключение тем оформления</h2><p>Для корректной работы тем оформления требуется подключение всех стилей темы глобально в приложении.</p><p>Для примера будем использовать заранее подготовленную тему Angular Material Indigo-Pink. Подключим ее в приложение, добавив следующую строку в style.css:</p><p>Также подключим поддержку иконок в стиле material. Для этого добавим следующую строку в index.html:</p><h2>Поддержка жестов</h2><p>Некоторые элементы (mat-slide-toggle, mat-slider, matTooltip) используют HammerJS для обработки жестов. Для полной поддержки возможностей этих элементов надо подключить HammerJS в приложение.</p><p>Это можно сделать несколькими способами: через npm, с использованием CDN (например Google CDN) или же напрямую из приложения.</p><p>Рассмотрим способ подключения через npm. Для этого введем следующую команду:</p><p>После установки импортируем компонент в наше приложение, добавив следующие строки в src/main.ts:</p><p>Теперь, когда все модули подключены, добавим новый элемент в app.component.html:</p><p>Удалим лишний HTML-код и запустим приложение следующей командой:</p><p>Теперь приложение запущено и доступно по ссылке http://localhost:4200.</p><p>Если всё сделано правильно, то на странице отобразится кнопка, при нажатии на которую будет воспроизводиться анимация.</p><h2>Добавление новых элементов интерфейса</h2><p>На примере ToolBar разберемся, как добавлять новые элементы интерфейса в приложение. Для этого добавим следующие строки в app.component.html:</p><p>Также пропишем следующие строки и в ngmaterial.module.ts:</p><p>Таким образом мы добавили ToolBar в приложение.</p><h2>Заключение</h2><p>Мы рассмотрели построение простейших интерфейсов на Angular 5 Material. Если вы только начали знакомство с frontend, то вам стоит обратить внимание на наш <a href="https://tproger.ru/curriculum/intro-to-frontend-development/">материал</a> для начинающих разработчиков.</p>]]></content:encoded>
    </item>
    <item>
      <title>Только выпустив Angular 2, Google объявила о начале создания 3.0, а теперь заявила, что скоро выпустит сразу четвертую версию фреймворка</title>
      <link>https://tproger.ru/news/angular-4</link>
      <comments>https://tproger.ru/news/angular-4?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тарас Сереванн]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/angular-4</guid>
      <description><![CDATA[<p>Игорь Минар на конференции NG-BE 2016 объяснил смену планов числом изменений и новой системой роутинга, посоветовав называть фреймворк просто Angular.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/angular-4">Только выпустив Angular 2, Google объявила о начале создания 3.0, а теперь заявила, что скоро выпустит сразу четвертую версию фреймворка</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 16 Dec 2016 12:23:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>Месяц назад Google <a href="https://tproger.ru/news/angular-3-is-around-the-corner/">удивила</a> разработчиков внезапным анонсом Angular 3 — обновления, которое должно было значительно улучшить структуру и качество генерируемого кода.</p><p>Но вместо перехода на обновления 2 раза в год, как было обещано, корпорация решила пропустить версию 3.0 и выпустить сразу Angular 4.0.</p><p>Сотрудник Google Игорь Минар на конференции NG-BE 2016 <a href="http://www.itnews.com/article/3150716/application-development/forget-angular-3-google-skips-straight-to-angular-4.html">рассказал</a>, что всё дело в большем количестве изменений, чем планировалось, и новой системе роутинга.</p><p>«Впрочем, я вообще не советую говорить о версиях Angular. Не называйте это AngularJS, не называйте Angular 2. Зовите просто — Angular — ведь с выходом новых версий путаница будет становиться всё сильнее» — заявил Игорь.</p><p>Подробнее почитать о причинах такого версионирования можно в <a href="http://angularjs.blogspot.ru/2016/12/ok-let-me-explain-its-going-to-be.html">официальном блоге</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>