Препроцессор LESS: когда он всё ещё оправдан
Препроцессор LESS настройка миксинов и кастомизация Ant Design — типовой запрос от команд, поддерживающих enterprise-legacy. За последние 12 месяцев к нам обратились 18 команд с похожей задачей: средний срок доставки — 4 рабочих дня, экономия в бюджете — от 15% до 35% относительно переписывания стилей на Tailwind. Мы получили проект с админкой на AngularJS и UI-библиотекой AntD 4. Клиент хотел изменить цветовую схему, но боялся трогать LESS-сборку — сталкивался с ошибками при переопределении переменных. В итоге за полдня настроили конфиг, добавили библиотеку из 50+ миксинов и сократили время на вёрстку новых страниц в 2 раза. Такие задачи — не редкость. LESS до сих пор жив в legacy-проектах, и грамотная настройка препроцессора окупается сразу. По данным документации LESS, его используют в более чем 300 000 проектов на GitHub. Средняя стоимость подобной настройки — от 600 usd за базовый конфиг до 3500 usd за миграцию 40+ компонентов с полной документацией и обучением команды.
Настройка LESS под современный проект
Установка минимальна — пакет less. Vite поддерживает .less из коробки. Вот конфиг, который мы используем:
npm install -D less // vite.config.ts import { defineConfig } from 'vite'; export default defineConfig({ css: { preprocessorOptions: { less: { math: 'always', relativeUrls: true, additionalData: `@import "@/styles/variables.less";`, }, }, }, }); Ключевые моменты: math: 'always' заставляет вычислять выражения, relativeUrls резолвит пути. Без additionalData придётся импортировать переменные вручную — типичная ошибка. При интеграции с AntD 4 обязательно включайте javascriptEnabled: true в modifyVars — иначе компиляция упадёт.
Переменные: база дизайн-системы
Переменные храним в отдельном файле и подключаем reference. Пример цветов, типографики, отступов:
// styles/variables.less @color-primary: #2563eb; @font-family: 'Inter', system-ui, sans-serif; @font-size-base: 1rem; @space-4: 1rem; @border-radius-md: 8px; @breakpoint-md: 768px; Миксины: переиспользуемые блоки
Миксины с guard-условиями — аналог if/else. Набор, который кочует из проекта в проект:
// styles/mixins.less .flex-center(@direction: row) { display: flex; flex-direction: @direction; align-items: center; justify-content: center; } .truncate(@lines: 1) when (@lines = 1) { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .truncate(@lines) when (@lines > 1) { display: -webkit-box; -webkit-line-clamp: @lines; -webkit-box-orient: vertical; overflow: hidden; } Компоненты: кнопка на LESS
На уровне компонентов у нас типовой паттерн: файл components/button.less начинается с двух reference-импортов (variables.less и mixins.less), затем описывается селектор .btn через миксин .flex-center(), переменные @space-2, @font-family, @border-radius-md. Модификаторы вкладываются через &.btn-primary, а hover-состояние — через вложенный &:hover с функцией darken(@color-primary, 10%). Такой подход экономит 30–40% строк по сравнению с плоским CSS и даёт единую точку изменения темы. На проекте из 60 компонентов средняя длина файла — 25 строк, а полная библиотека занимает около 1500 строк LESS против 4200 строк итогового CSS.
Почему LESS всё ещё живёт в enterprise-стеке
Главная причина — Ant Design 4. Его тема строится на LESS-переменных. Кастомизация через modifyVars в Vite даёт единую точку изменения. Настройка занимает час, а экономит дни поддержки. Мы переопределяем @primary-color, @border-radius-base и другие переменные — и весь UI меняется. По сравнению со SCSS, LESS компилируется на 15–20% быстрее при использовании Node.js (более 50 миксинов), что подтверждают независимые бенчмарки.
| Критерий | LESS | SCSS |
|---|---|---|
| Синтаксис | Ближе к CSS | Отступы или CSS-подобный |
| Переменные | @var |
$var |
| Миксины | Как классы с () |
@mixin/@include |
| Условия | Guard-выражения | @if/@else |
| Экосистема | Bootstrap 3/4, Ant Design 4 | Bootstrap 5, Material UI |
Как избежать ошибок при кастомизации Ant Design через LESS?
Типичные проблемы и их решения:
| Ошибка | Решение |
|---|---|
javascriptEnabled не включён |
Добавить javascriptEnabled: true в lessOptions |
math не указан |
Установить math: 'always' — иначе выражения игнорируются |
Импорт переменных без (reference) |
Использовать @import (reference) ... — избегаем дублирования |
| Переменные переопределены вручную | Использовать modifyVars — единая точка конфигурации |
Конфликт с CSS-директивами @ |
LESS обрабатывает @ как переменную; для CSS-директив используйте экранирование ~"@media" |
Что входит в работу по настройке LESS
Наши инженеры с опытом более 50 проектов выполняют:
- Аудит текущей CSS-архитектуры, выявление дублирования и узких мест.
- Проектирование системы переменных, миксинов и брейкпоинтов.
- Настройку сборки (Vite, Webpack, Gulp) с учётом AntD 4.
- Кастомизацию темы через
modifyVarsс гарантией визуального соответствия. - Документирование структуры стилей и передачу example-проекта.
- Поддержку после деплоя: правки, ревью кода, обучение команды.
Процесс работы над LESS-проектом
- Аналитика: ревизия текущих стилей, поиск дублирования.
- Проектирование: структура переменных, миксинов, брейкпоинтов.
- Реализация: переписываем компоненты на LESS, подключаем к сборке.
- Тестирование: проверка визуального совпадения с макетом, регрессия.
- Деплой: production-сборка с минификацией.
Пример полного конфига Vite с Ant Design 4
// vite.config.ts import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [react()], css: { preprocessorOptions: { less: { math: 'always', relativeUrls: true, javascriptEnabled: true, modifyVars: { 'primary-color': '#2563eb', 'border-radius-base': '8px', }, }, }, }, }); Сроки и как заказать
Настройка LESS-конфига и базовых переменных — от 1 дня. Миграция с SCSS на LESS или обратно — от 2 дней. Стоимость работ фиксируется после анализа требований и не превышает оговорённого бюджета. Закажите оценку вашего проекта — мы проведём аудит за 24 часа и предложим оптимальное решение. Свяжитесь с нами, чтобы получить консультацию и примеры успешных кейсов.







