Рефакторинг CSS: введение (часть 1)

Опубликовано: 2022-03-10
Краткое резюме ↬ Рефакторинг CSS — непростая задача — его нужно выполнять так, чтобы не создавать проблем. Сначала нам нужно проанализировать существующую кодовую базу, проверить работоспособность кодовой базы CSS, обнаружить слабые места, согласовать подход и убедить руководство вкладывать время и ресурсы в процесс.

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

Такой технический долг, если его не оплатить вовремя, может накопиться и привести к серьезным проблемам в будущем. Чаще всего это может привести к неожиданным побочным эффектам при добавлении новых компонентов пользовательского интерфейса и усложнению поддержки кодовой базы. Вы, вероятно, уже работали над проектом с плохой кодовой базой CSS и думали, как бы вы написали код по-другому, если бы у вас была возможность провести рефакторинг или переписать все с нуля.

Рефакторинг больших частей кода CSS — непростая задача по любым меркам. Иногда может показаться, что это всего лишь случай «удаления некачественного кода, написания лучшего CSS и развертывания блестящего улучшенного кода». Однако необходимо учитывать множество других факторов, таких как сложность рефакторинга работающей кодовой базы, ожидаемая продолжительность и использование команды, установление целей рефакторинга, отслеживание эффективности и прогресса рефакторинга и т. д. Также необходимо убедить руководство или заинтересованные стороны проекта в том, чтобы инвестировать время и ресурсы в процесс рефакторинга.

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

Часть: Рефакторинг CSS

  • Часть 1: Рефакторинг CSS: Введение
  • Часть 2: Рефакторинг CSS: стратегия, регрессионное тестирование и сопровождение
  • Часть 3: Рефакторинг CSS: оптимизация размера и производительности
  • Подпишитесь на нашу электронную рассылку, чтобы не пропустить следующие.

Побочные эффекты некачественного CSS

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

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

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

  • Снижение качества кода по мере добавления дополнительных функций из-за разного уровня навыков CSS в команде разработчиков и отсутствия внутренних правил, соглашений и лучших практик.
  • Добавление новых функций или расширение существующих селекторов вызывает ошибки и неожиданные побочные эффекты в других частях кода (также известные как регрессия ).
  • Несколько разных селекторов CSS с повторяющимися блоками кода или фрагментами кода CSS можно разделить на новый селектор и расширить его вариантами.
  • Остатки неиспользуемых фрагментов кода удаленных функций . Команда разработчиков потеряла представление о том, какой код CSS используется, а какой можно безопасно удалить.
  • Несоответствие в структуре файла, именовании классов CSS, общем качестве CSS и т. д.
  • «Ад специфики», когда новые функции добавляются путем переопределения вместо существующей кодовой базы CSS.
  • Отмена CSS , где селекторы с более высокой специфичностью «сбрасывают» стиль селектора с более низкой специфичностью. Разработчики пишут больше кода, чтобы иметь меньше стилей. Это приводит к избыточности и большому количеству отходов в коде.
Наличие большого количества перечеркнутых стилей (в инспекторе стилей браузера) в нескольких селекторах (без медиа-запросов или псевдоклассов) может указывать на отмену CSS, вызванную плохой структурой CSS. Эти классы CSS переопределяются несколькими другими классами без медиа-запросов и псевдоклассов, что приводит к большему количеству кода для достижения меньшего количества стилей. (Большой превью)

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

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

Недавно я проводил аудит веб-сайта, который загрузил 2,2-мегабайтный файл минимизированного кода CSS. Необычно большой файл, подобный этому, может быть потенциальным индикатором того, что код CSS нуждается в рефакторинге или даже переписан с нуля. (Большой превью)

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

«(…) то, что началось с организованного PostCSS, постепенно превратилось в сложную и запутанную глобальную архитектуру CSS с множеством особенностей и переопределений. Как и следовало ожидать, есть момент, когда дополнительный технический долг, который он вводит, затрудняет поддержание быстрой доставки без добавления каких-либо регрессий. Кроме того, по мере роста числа фронтенд-разработчиков, вносящих свой вклад в кодовую базу, работать с такой архитектурой CSS становится еще труднее».
Еще после прыжка! Продолжить чтение ниже ↓

Рефакторить или переписать?

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

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

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

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

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

Подытожим плюсы и минусы каждого подхода.

Рефакторинг Переписать
Плюсы
  • Инкрементный и гибкий процесс
  • Работа с единой кодовой базой
  • Команда не заблокирована задачами рефакторинга
  • Легче убедить заинтересованное лицо и руководителей проекта провести рефакторинг
  • Может решить основные проблемы; устаревший технический стек, соглашения об именах, архитектурные решения, внутренние правила и так далее.
  • Независимость от текущей кодовой базы (существующие функции и недостатки...)
  • Долгосрочные планы по расширяемости и ремонтопригодности кодовой базы
Минусы
  • Зависит от текущей кодовой базы и базовой архитектуры
  • Не может решить основные проблемы
  • Архитектурные решения, существующие внутренние правила и лучшие практики, широкомасштабные проблемы и т. д.
  • Может быть сложно выполнить, в зависимости от настройки проекта и работоспособности кодовой базы.
  • Дорого и долго
  • Необходимо полностью внедрить перед запуском
  • Поддержание текущей кодовой базы при разработке новой кодовой базы
  • Сложнее убедить стейкхолдеров и руководителей проекта полностью переписать

Когда проводить рефакторинг CSS?

Рефакторинг — это рекомендуемый подход для постепенного улучшения кодовой базы CSS при сохранении текущего внешнего вида (дизайна). Члены команды могут работать над решением этих проблем с кодовой базой, когда нет задач с более высоким приоритетом. Постепенное улучшение текущей кодовой базы в большинстве случаев не повлияет на работу пользователей напрямую, однако более чистая и удобная кодовая база приведет к более простой реализации функций и меньшему количеству непредвиденных ошибок и побочных эффектов.

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

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

Ведущий разработчик внешнего интерфейса или разработчик с наибольшим опытом работы с CSS должен поднимать проблемы и создавать задачи рефакторинга для обеспечения соблюдения стандартов качества кода CSS в кодовой базе.

Когда переписывать CSS?

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

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

Аудит работоспособности кодовой базы CSS

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

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

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

Мой личный инструмент — CSS Stats, бесплатный инструмент, который предоставляет полезный обзор качества кодовой базы CSS с множеством полезных показателей, которые могут помочь разработчикам выявить некоторые трудно обнаруживаемые проблемы.

Часть отчета статистики CSS для случайного веб-сайта, показывающая общий размер файла CSS, количество правил, селекторов, объявлений, свойств и т. д. (большой предварительный просмотр)
Часть отчета CSS Stats для случайного веб-сайта с плохой кодовой базой CSS и высокоспецифичными селекторами, что затрудняет поддержку кодовой базы. это еще одна полезная метрика для отслеживания и использования для целей рефакторинга. (Большой превью)

Еще в 2016 году компания trivago провела крупномасштабный рефакторинг своей кодовой базы CSS и использовала метрики из статистики CSS, чтобы установить некоторые конкретные, измеримые цели, такие как снижение специфичности и уменьшение количества цветовых вариаций. Всего за три недели им удалось улучшить общее состояние кодовой базы CSS, уменьшить размер файла CSS, улучшить производительность рендеринга на мобильных устройствах и т. д.

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

Что касается инструментов CLI, Wallace — это удобный инструмент, который предоставляет базовую, но полезную статистику и обзор CSS, которые можно использовать для выявления проблем, связанных с размером файла, количеством правил и селекторов, типами и сложностью селекторов и т. д.

Пример отчета Wallace CLI для моего личного веб-сайта (большой предварительный просмотр)

Уоллес также предлагает бесплатный инструмент-анализатор на веб-сайте Project Wallace, который использует, по-видимому, более продвинутую версию Wallace в серверной части, чтобы обеспечить некоторые полезные визуализации данных и еще несколько показателей, которые недоступны в CLI Wallace.

Часть примера инструмента анализатора Project Wallace для случайного веб-сайта. Обратите внимание, сколько выводов можно сделать из этих нескольких статистических данных: слишком много правил и селекторов, большой размер файла, слишком много повторяющихся объявлений цветов и шрифтов и т. д. (Большой предварительный просмотр)

Project Wallace также предлагает полное платное решение для аналитики кодовой базы CSS . Он содержит еще больше полезных функций и метрик, которые могут помочь разработчикам выявлять некоторые трудно обнаруживаемые проблемы и отслеживать изменения статистики CSS для каждого коммита. Хотя платный план включает в себя больше функций, бесплатный план и базовый инструмент анализа CSS более чем достаточны для аудита качества кодовой базы CSS и получения общего обзора для планирования рефакторинга.

Написание высококачественного CSS

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

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

Например, задав слишком много селекторов, один разработчик может серьезно ограничить удобство использования, что приведет к тому, что другим разработчикам придется дублировать код, чтобы использовать его для других подобных компонентов с другой разметкой. Эти проблемы часто возникают, когда разработчикам не хватает понимания и неиспользования базовых механизмов CSS (каскадность, наследование, производительность браузера и специфичность селектора). Эти ранние решения могут привести к серьезным последствиям в будущем , поэтому работоспособность и ремонтопригодность кодовой базы CSS зависят от знаний, навыков и понимания основ CSS разработчиком.

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

Говоря из личного опыта, я обнаружил, что следующее помогло мне значительно улучшить работу с CSS:

  • Изучение архитектурных моделей.
    Руководство по CSS содержит обширную базу знаний и лучшие практики для написания высококачественного CSS на основе общих шаблонов программирования и архитектурных принципов.
  • Практикуйтесь и совершенствуйтесь.
    Работайте над личными проектами или решайте задачи от Frontend Mentor, чтобы улучшить свои навыки. Начните с простых проектов (один компонент или раздел) и сосредоточьтесь на написании наилучшего CSS, пробуйте различные подходы, применяйте различные архитектурные шаблоны, постепенно улучшайте код и научитесь эффективно писать высококачественный CSS.
  • Учимся на ошибках.
    Поверьте мне, вы напишете действительно некачественный CSS, когда начнете. Вам потребуется несколько попыток, чтобы сделать это правильно. Найдите минутку и подумайте, что пошло не так, проанализируйте слабые места, подумайте, что и как вы могли бы сделать по-другому, и постарайтесь избежать тех же ошибок в будущем.

Также важно установить правила и внутренние стандарты CSS внутри команды или даже для всей компании. Четко определенные общекорпоративные стандарты, стиль кода и принципы могут дать множество преимуществ, таких как:

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

Кирби Ярдли работал над рефакторингом системы дизайна Sundance Institute и CSS и указал на важность установления внутренних правил и лучших практик.

«Без надлежащих правил и стратегии CSS — это язык, который можно использовать неправильно. Часто разработчики пишут стили, специфичные для одного компонента, не задумываясь критически о том, как этот код может быть повторно использован в других элементах (…) После долгих исследований и размышлений о том, как мы хотели подойти к архитектуре нашего CSS, мы решили использовать методологию под названием ITCSS. “

Возвращаясь к предыдущему примеру от команды trivago, установление внутренних правил и инструкций оказалось важным шагом в их процессе рефакторинга.

«Мы представили библиотеку шаблонов, начали использовать атомарный дизайн в нашем рабочем процессе, создали новые рекомендации по кодированию и адаптировали несколько методологий, таких как BEM и ITCSS, чтобы поддерживать нас в поддержке и развитии нашего CSS/UI в больших масштабах».

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

Заключение

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

Полезные инструменты, такие как CSS Stats и Wallace, могут предоставить общий высокоуровневый обзор кодовой базы CSS и дать подробное представление о состоянии и работоспособности кодовой базы. Эти инструменты также предоставляют измеримую статистику , которую можно использовать для определения целей процесса рефакторинга и отслеживания хода рефакторинга.

После определения целей и объема рефакторинга важно установить внутренние рекомендации и лучшие практики для кодовой базы CSS — соглашение об именах, архитектурные принципы, структуру файлов и папок и т. д. Это обеспечивает согласованность кода, создает основу проекта, которую можно задокументировать. и который можно использовать для адаптации и проверки кода CSS. Использование инструментов линтинга, таких как Stylelint, может помочь применить некоторые распространенные передовые методы CSS для частичной автоматизации процесса проверки кода.

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

Часть: Рефакторинг CSS

  • Часть 1: Рефакторинг CSS: Введение
  • Часть 2: CSS-стратегия, регрессионное тестирование и сопровождение
  • Часть 3: Оптимизация размера и производительности
  • Подпишитесь на нашу электронную рассылку, чтобы не пропустить следующие.

использованная литература

  • «Управление проектами CSS с помощью ITCSS», Гарри Робертс
  • «Крупномасштабный рефакторинг CSS в Trivago», Кристоф Рейнартц
  • «Система проектирования Sundance.org и рефакторинг CSS», Кирби Ярдли.
  • «От семантического CSS до Tailwind: рефакторинг кодовой базы пользовательского интерфейса Netlify», Чарли Джерард и Лесли Кон-Вейн.
  • «Инструменты аудита CSS», Ирис Лешнянин