Minification é o processo de remoção de todos os caracteres não essenciais do código-fonte: espaços, tabulações, quebras de linha e comentários. A minificação reduz o tamanho de arquivos JavaScript, CSS e HTML sem alterar a lógica de execução do programa. De acordo com MDN Web Docs, a minificação pode reduzir o tamanho do arquivo em 50–70%, o que afeta diretamente a velocidade de carregamento de aplicativos e o First Contentful Paint (FCP).
Pontos principais
Minification é uma transformação automática do código-fonte que remove todos os caracteres que não afetam a execução do programa. Espaços, tabulações, caracteres de nova linha, comentários e parênteses redundantes são removidos ou encurtados. A minificação é aplicada a JavaScript, CSS, HTML e, menos frequentemente, a configurações JSON antes da implantação em produção.
O principal objetivo da minificação é reduzir o tamanho dos arquivos transmitidos pela rede. Um arquivo JavaScript de 300 KB após a minificação pode ocupar 120–150 KB, o que reduz o tempo de carregamento em 200–400 ms em uma conexão 3G lenta. Google PageSpeed Insights e Lighthouse recomendam diretamente minificar o código: é um dos critérios de avaliação de desempenho e Core Web Vitals.
A minificação é parte integrante do pipeline de build. Após a transpilação com TypeScript ou Babel, o código passa por Tree Shaking (remoção de funções não utilizadas), depois por um minificador, e só então é montado no bundle final. Em bundlers modernos (Webpack, Rollup, esbuild), a minificação é realizada por plugins na etapa final da build.
| Elemento | Exemplo (antes) | Exemplo (depois) | Economia |
|---|---|---|---|
| Espaços e tabulações | let x = 5; | let x=5; | ~10–20% |
| Quebras de linha | \n entre linhas | tudo em uma linha | ~2–5% |
| Comentários | // comment | removido | ~5–30% |
| Parênteses redundantes | if ((x > 0)) | if(x>0) | ~1–3% |
Remoção de espaços e quebras de linha é a técnica mais simples e óbvia. O parser do minificador percorre a AST (Abstract Syntax Tree) e remove todos os caracteres de espaço em branco que não fazem parte de literais de string. A maioria dos minificadores adicionalmente combina operadores em uma única linha, o que proporciona economia adicional ao comprimir com GZip ou Brotli.
Substituição de nomes de variáveis (mangling) é uma técnica mais agressiva. Variáveis locais e parâmetros de funções são renomeados para identificadores de uma letra: a, b, c. Isso reduz o tamanho em 15–30% adicionais. Terser e esbuild suportam mangling com a opção de preservar certos nomes (por exemplo, API pública via mangle.props.reserved).
Dead code elimination (DCE) remove ramos de código que nunca são executados. O minificador analisa condições que são sempre falsas (if (false)) e remove os blocos correspondentes. A análise mais avançada é realizada na etapa de Tree Shaking antes da minificação, mas o DCE no nível do minificador detecta casos locais de código morto não detectados no nível de módulos.
Mangling renomeia variáveis locais e parâmetros de funções para identificadores curtos (uma ou duas letras). Terser realiza o mangling baseado no escopo: variáveis dentro de uma mesma função recebem nomes curtos únicos que não conflitam com escopos externos. A opção mangle.reserved permite preservar certos nomes — por exemplo, APIs públicas de bibliotecas.
Mangling não afeta variáveis globais, propriedades de objetos (a menos que mangle.props esteja habilitado) nem nomes de classes usados com new. Para proteger a API pública de uma biblioteca do mangling, use mangle.props.reserved com expressões regulares: reserved: [“_prop”, /^private_/]. Sem essa configuração, o mangling pode quebrar uma biblioteca se o código externo acessar propriedades de objeto pelo nome.
// Código-fonte
function calculateTotal(price, tax) {
var result = price + (price * tax);
// Retornar a soma total
return result;
}
var total = calculateTotal(100, 0.2);
console.log(total);// Após minificação com Terser
function calculateTotal(a, b){return a + a * b}
var c = calculateTotal(100, .2);
console.log(c);No segundo exemplo, o Terser removeu comentários, espaços e quebras de linha, renomeou price para a, tax para b, result para c. O tamanho reduziu de 197 caracteres para 79 — uma economia de 60%. Ao mesmo tempo, a funcionalidade do código é totalmente preservada: calculateTotal(100, 0.2) retorna 120.
Terser é o minificador JavaScript padrão no ecossistema Webpack e na maioria dos bundlers modernos. Terser suporta sintaxe ES6+ (funções arrow, async/await, spread), mangling com proteção de API pública, source maps e execução paralela usando o número de CPUs. Desde a versão 5.16, Terser inclui otimizações para TypeScript — remoção de imports somente de tipo e interfaces.
esbuild é um minificador escrito em Go, incorporado no bundler de mesmo nome. esbuild realiza a minificação 10–100 vezes mais rápido que o Terser devido ao código nativo e processamento paralelo. No entanto, esbuild suporta menos otimizações: ele não realiza mangling com preservação de propriedades, não remove imports somente de tipo e otimiza expressões de forma menos agressiva.
// webpack.config.js — configuração do TerserPlugin
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
dead_code: true,
},
mangle: {
reserved: ["React", "Component"],
},
output: {
comments: false,
},
},
parallel: true,
}),
],
},
};A configuração do TerserPlugin inclui três blocos principais. compress gerencia a otimização de expressões: drop_console remove console.log, drop_debugger remove debugger, dead_code remove ramos inalcançáveis. mangle controla a renomeação de variáveis com reserved para proteger nomes públicos. parallel habilita o multithreading com o número de CPUs.
// esbuild: comando CLI para minificação de JS e CSS
// esbuild app.js --bundle --minify --outfile=dist/app.min.js
// esbuild app.css --bundle --minify --outfile=dist/app.min.css
const esbuild = require("esbuild");
esbuild.build({
entryPoints: ["src/app.js", "src/styles.css"],
bundle: true,
minify: true,
sourcemap: true,
target: ["es2015"],
outdir: "dist",
}).catch(() => process.exit(1));A API do esbuild aceita configuração em uma linha. minify: true ativa a minificação de JS e CSS. sourcemap: true gera mapas de código para depuração. target define o nível mínimo de ES — o esbuild transpila automaticamente o código moderno para a versão selecionada. esbuild é especialmente eficaz para projetos onde o tempo de build é crítico: pipelines CI/CD, Hot Module Replacement e protótipos rápidos.
React Native usa Metro Bundler — seu próprio bundler que inclui minificação baseada em Terser. No modo de produção, o Metro aplica automaticamente a minificação ao bundle JavaScript do aplicativo. A configuração da minificação no Metro é definida através do metro.config.js na seção transformer.minifierConfig. Além disso, o inline-require pode ser desabilitado para reduzir o tamanho do bundle no iOS.
WebView em aplicativos móveis também se beneficia da minificação. HTML, CSS e JS carregados no WebView devem ser minificados antes de serem incorporados ao aplicativo ou carregados do servidor. Para recursos locais (Assets), a minificação é especialmente importante — o tamanho do APK/IPA afeta diretamente a conversão de instalações nas lojas de aplicativos.
Hermes é um motor JavaScript para React Native desenvolvido pelo Facebook. Hermes realiza compilação Ahead-of-Time (AOT) de bytecode, o que reduz o tempo de inicialização do aplicativo em 30–50%. Para Hermes, a minificação do bundle JavaScript é realizada antes da compilação para bytecode usando Terser. Hermes suporta seu próprio formato HBC (Hermes Bytecode), mas a etapa de minificação JS permanece necessária.
// metro.config.js — configuração de minificação
const defaultConfig = require("metro-config/src/defaults");
module.exports = require("metro-config").mergeConfig(
defaultConfig,
{
transformer: {
minifierConfig: {
compress: {
drop_console: true,
},
mangle: {
safari10: true,
},
},
},
}
);Metro com minifierConfig.drop_console remove todos os console.log do bundle de produção do React Native. O parâmetro mangle.safari10 impede a renomeação de identificadores que quebram o Safari 10 (iOS 10). Isso é especialmente importante para aplicativos que suportam dispositivos antigos como iPad e iPhone 5s com iOS 10/11.
Minification e compressão (gzip, brotli) são etapas diferentes de otimização. A minificação atua no nível do código-fonte e reduz o número de caracteres antes do envio ao servidor. A compressão atua no nível do protocolo de transporte e é aplicada pelo servidor (nginx, Apache, CDN) ao transmitir o arquivo ao cliente. A minificação reduz o tamanho antes da compressão, o que dá um efeito duplo: o gzip comprime dados já reduzidos.
Um arquivo JavaScript de 300 KB após a minificação — 120 KB, após gzip — 35–40 KB. Se apenas gzip for aplicado ao arquivo não minificado, o tamanho será de 55–70 KB. Minification + gzip dá um resultado 30–40% melhor que apenas gzip. Brotli (nível 6) comprime adicionalmente 15–20% mais eficientemente que gzip após a minificação.
| Método | Nível | Tamanho do arquivo | Redução |
|---|---|---|---|
| Arquivo original | — | 300 KB | 0% |
| Após minificação | Código | 120 KB | 60% |
| Após gzip (sem minificação) | Transporte | 65 KB | 78% |
| Minification + gzip | Código + Transporte | 38 KB | 87% |
| Minification + Brotli | Código + Transporte | 30 KB | 90% |
Perguntas frequentes
UglifyJS é uma ferramenta de minificação obsoleta que não suporta sintaxe ES6+. Terser é um fork do UglifyJS com suporte a JavaScript moderno. Todos os bundlers modernos (Webpack 5, Rollup, esbuild) usam Terser ou seus próprios minificadores, enquanto o UglifyJS é usado apenas em projetos legados.
Source maps são arquivos .map separados não incluídos no bundle de produção. O servidor deve fornecer source maps apenas para desenvolvedores autorizados (via cabeçalho Authorization). Em produção, os source maps não são carregados pelo navegador do usuário, portanto não afetam o tamanho do bundle.
Risco de quebra existe com mangling agressivo que transforma nomes de propriedades de objetos. Se o código acessa elementos DOM através de data-attributes ou usa strings JSON para nomear campos, o mangling pode renomear propriedades públicas. A solução é excluir via mangle.reserved ou desabilitar o mangling para certos namespaces.
A minificação CSS oferece menos ganho (15–25%) que a minificação JS, mas é obrigatória para conformidade com Core Web Vitals. Minificadores CSS removem espaços, mesclam seletores idênticos, encurtam cores hexadecimais (#ff0000 → #f00) e removem @keyframes não utilizados. CleanCSS e esbuild são ferramentas populares para minificação CSS.
Source maps (arquivos .map) vinculam o código minificado ao original. No Chrome DevTools e Safari Web Inspector, quando os source maps estão habilitados, os arquivos originais são exibidos. Para funcionamento correto, os source maps devem ser carregados no servidor (mesmo em produção) e habilitados através das ferramentas do desenvolvedor.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também