Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIntermediáriocódigo testado

Less em projeto legado: o que você precisa entender

A sintaxe do Less com @variável e mixin-classe, a divisão que mudou no Less 4, e por que o Ant Design continua preso nele.

Rodolfo Mori4 min de leitura

Less é outro pré-processador de CSS. Em projeto novo, você provavelmente encontrará mais Sass ou CSS moderno; em manutenção, Less ainda aparece em temas de Ant Design 4, Bootstrap 3 e produtos que acumularam anos de variáveis e mixins. O objetivo aqui é ler, compilar e mudar com segurança — não reescrever o projeto por gosto.

Se esta é sua primeira experiência com pré-processador, leia o que é Sass para fixar o fluxo fonte, compilador e CSS. A linguagem do exemplo muda, mas a obrigação de inspecionar a saída é a mesma. Num legado, registre o comando atual e uma amostra visual antes da primeira alteração; eles serão sua referência durante toda a migração.

lessc em um comando: compilar sem instalar nada

Execute a versão fixada por npx e confirme o runtime:

bash
npx --yes --package less@4.9.0 lessc --version
npx --yes --package less@4.9.0 lessc entrada.less saida.css
lessc 4.9.0 (Less Compiler) [JavaScript]

Em projeto permanente, instale less em devDependencies e coloque o comando num script npm. Instalação global cria diferença entre máquinas; lockfile e versão explícita tornam o build reproduzível.

@variavel: Less usa arroba onde Sass usa cifrão

A variável Less começa com @. Nesting e & são familiares para quem conhece SCSS:

css
@brand: #6d28d9;
.card {
  border-color: @brand;
  &__title { color: @brand; }
}
.card { border-color: #6d28d9; } .card__title { color: #6d28d9; }

O nome desaparece no CSS final. Ao contrário de uma custom property, @brand não muda no navegador. Less também faz avaliação preguiçosa: uma variável pode ser usada antes da declaração, e o valor final do escopo participa da resolução.

css
.card { color: @brand; }
@brand: #6d28d9;
.card { color: #6d28d9; }

Essa diferença para a leitura sequencial do Sass importa numa migração. Não mova linhas mecanicamente sem testar o valor efetivo de cada escopo.

Mixin no Less é uma classe — e isso muda o jeito de escrever

Um ruleset pode ser chamado como mixin. O sufixo () evita que a receita seja emitida como classe por si só:

css
.focus-ring() {
  outline: 3px solid #a78bfa;
  outline-offset: 2px;
}
.button:focus-visible { .focus-ring(); }
.button:focus-visible { outline: 3px solid #a78bfa; outline-offset: 2px; }

Mixins parametrizados também parecem chamadas de classe. Valores padrão ficam na assinatura:

css
.button(@bg, @color: white) {
  background: @bg;
  color: @color;
}
.save { .button(#6d28d9); }
.cancel { .button(#e5e7eb, #111827); }
.save { background: #6d28d9; color: white; } .cancel { background: #e5e7eb; color: #111827; }

Cada chamada copia declarações. Inspecione o CSS antes de extrair um mixin grande; a redução do fonte pode aumentar a saída.

Guards: o if do Less, escrito como when

Guards escolhem uma definição de mixin de acordo com argumentos. Um projeto legado pode usar sobrecargas como estas:

css
.contrast(@tone) when (@tone = dark) { color: white; }
.contrast(@tone) when (@tone = light) { color: #111827; }

.dark { .contrast(dark); }
.light { .contrast(light); }
.dark { color: white; } .light { color: #111827; }

Leia todas as definições com o mesmo nome antes de alterar uma. A chamada pode ativar uma ou várias candidatas. Ao migrar, transforme o conjunto em contrato explícito, não em cadeia de condicionais espalhada.

Divisão no Less 4: por que 16px / 2 não foi calculado

No modo padrão do Less 4, divisão fora de parênteses é preservada; dentro de parênteses é calculada. O mesmo arquivo provou os dois comportamentos:

css
.demo {
  width-a: 16px / 2;
  width-b: (16px / 2);
}
.demo { width-a: 16px / 2; width-b: 8px; }

O objetivo é evitar conflito com barras válidas do CSS. Existe --math=always, mas Less 4.9.0 avisou que esse modo será removido no Less 5. Não baseie uma migração nova nele:

bash
lessc --math=always entrada.less saida.css
Warning: --math=always is deprecated and will be removed in Less 5.x. Use --math=parens-division (default) or --math=parens. (math-always)

Coloque a operação pretendida entre parênteses e compare valores. Procure barras em font, grid e cores antes de fazer substituição global.

Onde Less ainda aparece: Ant Design, Bootstrap 3 e temas antigos

Ant Design 4.24 documenta Less como linguagem de estilos e expõe variáveis como @primary-color; modifyVars alimenta overrides pelo loader. Bootstrap 3.4 também publica fontes e mixins Less, embora a própria documentação marque a linha 3 como encerrada.

O presente precisa de precisão: Ant Design 5 usa tokens e CSS-in-JS, então não é correto dizer que toda versão atual depende de Less. Quem fica “preso” é o produto baseado na arquitetura de tema da versão 4 ou anterior. Migrar o framework e migrar os estilos são mudanças separadas, ambas protegidas por teste visual.

modifyVars: trocar tema sem tocar na biblioteca

Em um build legado com less-loader, a configuração substitui variáveis antes da compilação:

js
lessOptions: {
  modifyVars: {
    'primary-color': '#0f766e',
    'border-radius-base': '6px'
  },
  javascriptEnabled: true
}
@primary-color recebe #0f766e antes de os componentes do Ant Design 4 serem gerados.

Fixe versões de Less e loader. javascriptEnabled amplia o que o compilador executa; não habilite para fontes não confiáveis. Para Ant Design 5, siga a API de tokens da versão atual em vez de transportar modifyVars por hábito.

NameError: como Less aponta linha e coluna

Uma variável ausente encerrou o comando e marcou @missing:

css
.card { color: @missing; }
NameError: variable @missing is undefined in - on line 1, column 16: 1 .card { color: @missing; }

Confira typo, import, escopo e ordem efetiva. Não copie o valor literal apenas para calar o erro; isso cria duas fontes de verdade.

Traduzir o seu Less para SCSS, linha a linha

Variável @name costuma virar $name; mixin .name() vira @mixin name e a chamada vira @include name; guard precisa ser reescrito; divisão explícita usa math.div. Avaliação preguiçosa e importação não têm tradução cega.

diff
- @brand: #6d28d9;
- .button(@bg) { background: @bg; }
- .save { .button(@brand); }
+ $brand: #6d28d9;
+ @mixin button($bg) { background: $bg; }
+ .save { @include button($brand); }

Nesse caso isolado, as duas versões geram .save { background: #6d28d9; }. Migre uma fatia, compile as duas, compare CSS bruto e teste estados. O guia de Sass ajuda a decidir se o destino deve ser SCSS ou CSS moderno; @use e @forward mostram por que trocar @import exige arquitetura, não apenas sintaxe.

Não misture atualização do framework, troca de pré-processador e redesign no mesmo lote. Cada dimensão altera uma fonte de risco. Com passos independentes, um diff de CSS revela se a mudança veio da sintaxe, da biblioteca ou de uma decisão visual — e a reversão continua possível.

  • less
  • lessc
  • mixin
  • ant design
  • legado
  • migração

Perguntas frequentes

Less e Sass são compatíveis entre si?
Não. Ambos geram CSS, mas variáveis, mixins, módulos e funções usam contratos diferentes. Migração exige compilar e comparar a saída.
Ant Design atual ainda exige Less?
Ant Design 5 usa um sistema de tokens em CSS-in-JS. Bases Ant Design 4 e temas anteriores continuam ligadas a Less e modifyVars.
Por que a divisão do Less não calculou?
Desde Less 4, o padrão calcula divisão entre parênteses. A barra fora deles é preservada para não conflitar com sintaxe CSS.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em Less 4.9.0, Node 26.3.0, npm 11.8.0, macOS, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. Less — Language Features — lesscss.org
  2. Less — Using Less.js — lesscss.org
  3. Ant Design 4 — Customize Theme — 4x.ant.design
  4. Ant Design 5 — Customize Theme — ant.design
  5. Bootstrap 3.4 — CSS and Less — getbootstrap.com

Continue por aqui