Фаулер описывает разные способы ветвления в гит и объясняет зачем они придуманы и как работают. Статья особенно полезна тем, что показывает базовые принципы работы с ветками. Рассказывается почему **branching is easy, merging is harder**, как побороть страх интеграции, и зачем интегрироваться часто
Автор описывает как применить чистую архитектуру относительно фронтенда для получения масштабируемого и гибкого кода. Сущности в подходе: - Модели - хранят данные приложения - DTO - DomainModel - ViewModel - Репозитории - позволяют получить данные - Сервисы - Используют репозитории для получения данных - Контроллер - логика компонента - Компонент - сам компонент
Опыт использования MobX в большом приложении https://habr.com/ru/company/tinkoff/blog/503136/ Рассказывает про то, как не наступить на грабли лишнего ререндера при использовании react+mobx. Обсуждаются способы передачи колбеков в компоненты так, чтобы не было лишних ререндеров: 3 Способа: - ` model.doSomething()} />` - создает новую функцию на каждый рендер - `onClickHandler = () => model.doSomething()` - только в класс-компонентах - `useCallback(() => model.doSomething())` - в компонентах-функциях При использовании mobx можно использовать декоратор `@action.bound`, который решает ту же проблему. Изменять observable-поля только из action-функций — хорошая практика, но не обязательная. Чтобы включить строгий режим для всего приложения, в mobx есть настройка enforceActions. Ее достаточно указать в корне проекта. ``` import { configure } from "mobx" configure({ enforceActions: "always" }) ``` В комментариях есть достаточно интересные обсуждения и другие трюки для работы с mobx. Например в комментарии https://habr.com/ru/company/tinkoff/blog/503136/#comment_21686016 вместо строгого режима предлагают хак для автоматического батчинга изменений стейта mobx. Я попробовал, но не ощутил каких-либо изменений ``` import { configure } from 'mobx'; setTimeout(() => configure({ reactionScheduler: f => setTimeout(f, 1) }), 1) ``` В комментарии https://habr.com/ru/company/tinkoff/blog/503136/#comment_21686016 говорят, что не нужно откладывать исполнение изменений в mobx. > NB! Вот [тут](https://github.com/mobxjs/mobx/pull/2311#issuecomment-599042383) Мишель (автор MobX) отмечает, что он как раз by design стремился к синхронному исполнению реакций, так что откладывание на микротаску (и тем более на макротаску) скорее будет усложнять жизнь. На самом деле комментарии очень интересные, советую прочитать
Get Rid of if-statements in your Angular App with OOP
Короткая история о том, как избавиться от if-else блоков в вёрстке, используя базовые приемы ООП, на примере ангуляра. Но никто не запрещает использовать полиморфизм и фабрики и вне ангуляра.
The Clear Architecture на TypeScript и React. Часть 1: Основы
Добрый день, уважаемые читатели. В этой статье мы поговорим об архитектуре программного обеспечения в веб-разработке. Довольно долгое время я и мои коллеги исп...
Всем привет! Меня зовут Артур, я работаю frontend-разработчиком в Exness. Не так давно мы перевели один из наших проектов на веб-компоненты. Расскажу, с какими...
Тут чувак сделал новый фреймворк и он достаточно интересный. https://crank.js.org/blog/introducing-crank Сайт 10 из 10 по дизайну, поэтому опишу своими словами что там написано: Суть не в том что его фреймворк крутой\удобный\убийца реакта, а в том, какие подходы он использует. Чуваку изначально не нравилась реализация React Suspense. Типа компонент должен throw'нуть thenable объект, это перехватит Suspence, дождется резолва промиса и вызовет компонент ещё раз. > If this mechanism sounds wild to you, that’s because it is. При этом будет вызван новый инстанс компонента, а значит функция, которая throw'ает thenable должна как-то уметь понимать что новый инстанс-это тот же самый компонент в том же месте, просто вызваный второй раз. А значит нам нужно уметь делать cache > The cache is necessary because there is no component instance on which to store the thrown promise, so when the component attempts to render a second time, it needs to make the same calls to whatever API threw and hope that a promise is not thrown again > in fact, cache invalidation is one of two problems which we joke about as being “the two hardest problems in computer science.” Suspense сложный, а сделан ровно для одной цели - асинхронный рендер. Но в JS уже есть способы делать асинхронные вызовы и даже несколько - async function, function *, async function * - и все они достаточно хороши, но не подходят под догму реакта потому что они impure. Вот вокруг идеи использования нативных возможностей JS и построен новый фреймворк - тип нам не надо изобретать велосипеды, потому что все уже есть в стандарте.
Браузер на страже API-запросов: строим безопасное общение фронтенда с бэкендом
Команде разработчиков, создающей одностраничное приложение (SPA), рано или поздно придётся столкнуться с ограничениями браузерной безопасности. С одной стороны,...