惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
Arctic Wolf
WordPress大学
WordPress大学
月光博客
月光博客
J
Java Code Geeks
罗磊的独立博客
V
Visual Studio Blog
阮一峰的网络日志
阮一峰的网络日志
Y
Y Combinator Blog
GbyAI
GbyAI
The Cloudflare Blog
B
Blog
S
SegmentFault 最新的问题
T
Tenable Blog
P
Privacy International News Feed
爱范儿
爱范儿
V
Vulnerabilities – Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Scott Helme
Scott Helme
量子位
博客园 - 三生石上(FineUI控件)
The Hacker News
The Hacker News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Latest
Security Latest
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
D
DataBreaches.Net
T
Threatpost
C
Cisco Blogs
Project Zero
Project Zero
K
Kaspersky official blog
MongoDB | Blog
MongoDB | Blog
C
Check Point Blog
A
About on SuperTechFans
The Register - Security
The Register - Security
C
Cyber Attacks, Cyber Crime and Cyber Security
S
Schneier on Security
L
Lohrmann on Cybersecurity
T
Threat Research - Cisco Blogs
I
InfoQ
Simon Willison's Weblog
Simon Willison's Weblog
F
Fortinet All Blogs
Recorded Future
Recorded Future
AWS News Blog
AWS News Blog
The GitHub Blog
The GitHub Blog
C
CERT Recently Published Vulnerability Notes

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как я перешёл с React на Angular и не пожалел
Илья Королёв · 2026-06-18 · via Все публикации подряд на Хабре

Когда я говорю, что перешёл с React на Angular, на меня смотрят примерно так же, как если бы я сказал, что добровольно переехал из Амстердама куда-нибудь в Челябинск. С непониманием и вопросом «а зачем».

Если открыть типичный канал про разработку, там будет React, Next.js, React Native, снова React. Джуны учат его как первый фреймворк, мидлы обычно выносят в резюме жирным шрифтом. Angular воспринимается как что-то невероятно сложное, для мега-приложений масштаба «строим город на Луне» и бэкендеров, которым не повезло. Я тоже так думал. У меня за плечами был React, я понимал компонентный подход, умел работать с хуками, знал экосистему. И тут Angular.

Готовых инструкций, как перейти с React на Angular, в сети практически нет. Зато есть тысячи статей про обратный путь. Пришлось разбираться самому, и вот что из этого вышло.

Angular 2 versus React: There Will Be Blood | by Cory House | Medium

Источник

Проект, который всё решил

Я перешёл в компанию, которая занимается системами контроля за объектами крупного строительства вроде заводов, стадионов и т. д. На площадке сотни камер, дроны, которые облетают периметр и передают видео в реальном времени, геоданные, карты с метками, сценарии автоматического реагирования.

В интерфейсе это выглядит как интерактивный план объекта с метками камер. Оператор может просто задавать логику словами. Например, «если дрон заметит движение в секторе D после 22:00, пусть сам включает прожекторы и шлёт алерт охране».

Вот в этом работает фронтенд. Конструктор сценариев, геоинтерфейс и управление потоками видео от сотен источников одновременно.

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

Ну и плюсом это была возможность развиваться внутри Centicore Group, освоить относительно новый стек, а не просто делать то же самое на новом месте.

Пришлось перестраивать мышление

Коллега, который уже «совершил переход», предупредил, что первые дни будут странными. Не сложными в смысле «сиди и решай задачи», а именно странными. То есть ты смотришь на код и вообще не понимаешь, что у вас здесь происходит.

Angular — это и другой синтаксис, и другой способ думать о приложении. Когда открываешь компонент в React, видишь функцию, она возвращает JSX, внутри хуки. Логика и шаблон живут в одном месте, всё перед глазами.

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

Онбординг у меня был сразу на реальных задачах. Код-ревью от коллег по проекту поначалу было мягким: работает, и ладно. Потом постепенно требования ужесточались — сначала «работает», потом «работает и по-нашему», потом «работает, по-нашему, и объясни, почему именно так».

Теоретически за Angular можно сесть и за 10 дней курсов получить базовое понимание. Но на то, чтобы перестать каждый раз думать «а как это делается в Angular?» и начать просто делать, у меня ушло полтора месяца минимум.

Зачем плодить файлы, если всё и так работает

Самый большой сдвиг в голове — это переход от подхода, где компоненты несут всю нагрузку, к подходу, где архитектура строится на классах и ООП.

В React ты думаешь компонентами — вот кнопка, вот карточка. Каждый кусок интерфейса — это функция, которая принимает пропсы и возвращает разметку. Всё плоское и видно сразу.

В Angular надо больше думать объектами и иерархиями. И это меняет буквально всё.

Проект здесь организован по строгой структуре: libs → features → components. Сначала мы выделяем библиотеки, внутри них — фичи, и только внутри фич живут компоненты (их может быть от одного до пары десятков). В React всё обычно проще — просто папки с компонентами, которые как-то друг друга используют.

Структура либы (модуля) в Angular

Структура либы (модуля) в Angular

Структура небольшого проекта на React

Структура небольшого проекта на React

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

В React я бы, скорее всего, сделал несколько компонентов с похожей логикой, вынес общее в хук и где-то по дороге потерял бы нить, что откуда берётся. В Angular это решается через наследование классов. Есть базовый класс Camera с общими методами и свойствами. От него наследуется PTZCamera (поворотная), от неё — DroneCamera. Каждый класс добавляет своё, не трогая родительское. Когда нужно исправить что-то в базовой логике — правишь в одном месте, и это расходится по всей иерархии.

Когда я это понял, не прочитал, а именно понял в процессе работы, Angular перестал пугать и начал казаться умно спроектированным инструментом.

Разделение на файлы, которое поначалу раздражало, — HTML отдельно, TypeScript отдельно, — тоже встаёт на место. Когда шаблон большой и сложный, удобно работать с ним как с отдельным документом, не прокручивая мимо трёхсот строк логики. Минус в том, что переключаться между файлами нужно постоянно, и если IDE не настроена хорошо, это превращается в маленький ежедневный раздражитель.

Данные приходят сами

Поначалу сильнее всего пугает в Angular RxJS.

Если коротко, RxJS — это библиотека для работы с асинхронными потоками данных. В React ты запрашиваешь данные и ждёшь ответа, а в Angular подписываешься на поток и реагируешь на каждое изменение.

Интересно, что создатели RxJS явно вдохновлялись сантехникой. Все термины и операторы здесь работают в логике системы водоснабжения. Есть потоки (streams), трубы (pipes), разветвления и краны.

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

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

Первые недели я каждый раз, встречая незнакомый оператор, шёл в документацию. Потом это стало реже. Потом уже появился инстинкт. Вижу задачу и думаю — здесь нужен switchMap, а здесь takeUntilDestroyed, чтобы не было утечек памяти. Это похоже на изучение иностранного языка. Поначалу переводишь каждое слово, а потом уже сразу думаешь на другом языке.

За что я влюбился

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

Первое, что бросилось в глаза, — формы. В React работа с формами — это всегда сначала выбор: React Hook Form, React Final Form, Formik, что-то ещё. У каждой команды своё решение, и каждый раз приходишь в новый проект и разбираешься заново.

В Angular формы встроены в фреймворк и никуда не деваются. Есть два подхода — Template-driven и Reactive Forms, — оба задокументированы и стандартны. Реактивные особенно хороши: создаёшь объект FormGroup, прописываешь валидацию прямо в TypeScript, и форма сама отслеживает своё состояние. В нашем конструкторе сценариев формы бывают огромными, с вложенной логикой и зависимыми полями — и всё это решается средствами фреймворка, без поиска нужного пакета на npm.

Пример работы с формой в Angular

Пример работы с формой в Angular

Следом привыкаешь к CLI и понимаешь, что он не просто ускоряет работу, а буквально не даёт сделать что-то неправильно. Хочешь новый компонент — пишешь ng generate component camera-panel, и сразу появляются все файлы, компонент регистрируется в модуле, всё связано. Сервис — ng generate service camera-stream. Целый модуль с маршрутизацией — одна команда. То есть вероятность сгенерировать компонент «не по-ангуляровски» физически сводится к минимуму. Инструмент делает всё за тебя по единственному правильному шаблону, который ещё и можно настроить под свой проект (например, добавить префикс именования селекторов компонентов).

И есть совсем маленькая вещь, которая тем не менее каждый раз приятно удивляет, — декоратор @HostBinding. В React, чтобы добавить CSS-класс к элементу в зависимости от состояния, пишешь логику в JSX, возможно, отдельную функцию, передаёшь через props. В Angular вешаешь одну строчку над свойством класса — и класс сам появляется или исчезает на хост-элементе в зависимости от значения. Никаких лишних функций и шума в шаблоне. Можно открыть код через три месяца и сразу понять контекст.

Обратная сторона

Было бы нечестно говорить только о хорошем. Самая противная проблема в Angular — циклические зависимости. Это когда Сервис А зависит от Сервиса Б, а Сервис Б где-то по цепочке зависит от Сервиса А.

И Angular не всегда достаточно ясно указывает на эту зависимость. Он просто падает или ведёт себя непредсказуемо. Или вообще выводит в консоль ошибку, которая указывает куда угодно, только не на настоящую причину.

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

Оказалось, что в Nx есть встроенная команда nx dep-graph. Она открывает в браузере интерактивную карту всего твоего проекта. Там буквально нарисовано дерево: все либы, все связи между ними стрелочками. И если есть «цикл», он подсвечивается красным. Без этого инструмента найти такую ошибку в огромном проекте практически невозможно.

Вот такую интерактивную красоту зависимостей рисует nx graph

Вот такую интерактивную красоту зависимостей рисует nx graph

В React похожие проблемы решаются проще — там меньше неявных связей, и ошибка обычно ближе к своей причине. Это его честное преимущество.

Дебаг в Angular вообще требует другого подхода. Нужно уметь думать деревьями, и с непривычки это занимает время.

И ещё одна «особенность», которую уже затрагивал выше, — минимум три файла там, где в React хватило бы одного. Например, маленький компонент-иконка, который просто рендерит SVG, — это три файла в Angular. Можно, конечно, сделать инлайн-шаблон и обойтись одним, но это считается плохой практикой, и на код-ревью об этом напомнят. Поначалу это ощущается как бюрократия, но потом привыкаешь, и это уже просто порядок.

Тем, кто думает попробовать

По мне, Angular — это точно не для новичков. Это именно следующий шаг, если хочется двигаться в сторону фуллстека или бэкенда. Например, Java или Go также думают классами и объектами. Там строгая оптимизация, а dependency injection — это стандартная практика.

Angular обучает этим паттернам на знакомой территории фронтенда. Поработав год на Angular, открываешь Spring Boot и чувствуешь: «О, это же примерно то же самое, только на Java» (я несколько упрощаю, но суть именно такая).

Если задача — быстро сделать продукт, MVP, стартап, лендинг, небольшое приложение, то лучше взять React. Там меньше церемоний и меньше нужно знать на старте. Если предстоит сложная, долгоживущая система с большой командой, где через год другой человек должен понять код без объяснений, — Angular выигрывает.

По материалам — я начинал с курсов Ивана Чернякова. Они на русском, довольно практические и, главное, не пытаются объяснить весь Angular за выходные. Потом перешёл к официальной документации Angular, особенно важен раздел Overview. Но его надо читать прям вдумчиво и медленно, потому что там каждый абзац помогает понять концепцию.