Minifikace — proces odstraňování všech nepodstatných znaků ze zdrojového kódu: mezer, tabulátorů, zalomení řádků a komentářů. Minifikace zmenšuje velikost JavaScript, CSS a HTML souborů bez změny logiky provádění programu. Podle MDN Web Docs může minifikace zmenšit velikost souboru o 50–70%, což přímo ovlivňuje rychlost načítání aplikací a First Contentful Paint (FCP).
Hlavní body
Minifikace — automatická transformace zdrojového kódu, při které jsou odstraněny všechny znaky, které neovlivňují provádění programu. Mezery, tabulátory, znaky nového řádku, komentáře a nadbytečné závorky jsou odstraněny nebo zkráceny. Minifikace se aplikuje na JavaScript, CSS, HTML a méně často na JSON konfigurace před nasazením do produkce.
Hlavním cílem minifikace je zmenšení velikosti souborů přenášených přes síť. JavaScriptový soubor o velikosti 300 KB může po minifikaci zabírat 120–150 KB, což zkracuje dobu načítání o 200–400 ms při pomalém 3G připojení. Google PageSpeed Insights a Lighthouse přímo doporučují minifikaci kódu: je to jedno z kritérií hodnocení výkonu a Core Web Vitals.
Minifikace je nedílnou součástí build pipeline. Po transpilaci TypeScriptu nebo Babelu kód prochází Tree Shakingem (odstranění nepoužívaných funkcí), poté minifikátorem a teprve poté je sestaven do konečného bundle. V moderních bundlerech (Webpack, Rollup, esbuild) se minifikace provádí pomocí pluginů v závěrečné fázi sestavení.
| Prvek | Příklad (před) | Příklad (po) | Úspora |
|---|---|---|---|
| Mezery a tabulátory | let x = 5; | let x=5; | ~10–20% |
| Zalomení řádků |
mezi řádky | vše na jednom řádku | ~2–5% |
| Komentáře | // comment | odstraněno | ~5–30% |
| Nadbytečné závorky | if ((x > 0)) | if(x>0) | ~1–3% |
Odstraňování mezer a zalomení řádků — nejjednodušší a nejzřejmější technika. Analyzátor minifikátoru prochází AST (Abstract Syntax Tree) a odstraňuje všechny bílé znaky, které nejsou součástí řetězcových literálů. Většina minifikátorů navíc spojuje operátory na jeden řádek, což poskytuje další úsporu při kompresi pomocí GZip nebo Brotli.
Nahrazování názvů proměnných krátkými názvy (mangling) — agresivnější technika. Lokální proměnné a parametry funkcí jsou přejmenovány na jednopísmenné identifikátory: a, b, c. To snižuje velikost o dalších 15–30%. Terser a esbuild podporují mangling s možností zachování určitých názvů (například veřejného API pomocí mangle.props.reserved).
Dead code elimination (DCE) — odstraňování větví kódu, které se nikdy neprovedou. Minifikátor analyzuje podmínky, které jsou vždy false (if (false)), a odstraňuje odpovídající bloky. Pokročilejší analýza se provádí ve fázi Tree Shaking před minifikací, ale DCE na úrovni minifikátoru zachycuje lokální případy mrtvého kódu nezjištěné na úrovni modulů.
Mangling — přejmenovávání lokálních proměnných a parametrů funkcí na krátké identifikátory (jedno-dvě písmena). Terser provádí mangling na základě rozsahu: proměnné uvnitř jedné funkce získávají jedinečná krátká jména, která nekolidují s vnějšími rozsahy. Volba mangle.reserved umožňuje zachovat určité názvy — například veřejné API knihoven.
Mangling neovlivňuje globální proměnné, vlastnosti objektů (pokud není zapnut mangle.props) a názvy tříd používané s new. Pro ochranu veřejného API knihoven před manglingem použijte mangle.props.reserved s regulárními výrazy: reserved: ["_prop", /^private_/]. Bez tohoto nastavení může mangling knihovnu poškodit, pokud externí kód přistupuje k vlastnostem objektu podle názvu.
// Zdrojový kód
function calculateTotal(price, tax) {
var result = price + (price * tax);
// Vracíme konečný součet
return result;
}
var total = calculateTotal(100, 0.2);
console.log(total);// Po minifikaci Terserem
function calculateTotal(a, b){return a + a * b}
var c = calculateTotal(100, .2);
console.log(c);Ve druhém příkladu Terser odstranil komentáře, mezery a zalomení řádků, přejmenoval price na a, tax na b, result na c. Velikost se zmenšila ze 197 znaků na 79 — úspora 60%. Funkčnost kódu je přitom plně zachována: calculateTotal(100, 0.2) vrací 120.
Terser — standardní JavaScript minifikátor v ekosystému Webpacku a většiny moderních bundlerů. Terser podporuje syntaxi ES6+ (šipkové funkce, async/await, spread), mangling s ochranou veřejného API, source maps a paralelní spouštění podle počtu CPU. Od verze 5.16 obsahuje Terser optimalizace pro TypeScript — odstraňování type-only importů a rozhraní.
esbuild — minifikátor v Go, integrovaný do stejnojmenného bundleru. esbuild provádí minifikaci 10–100krát rychleji než Terser díky nativnímu kódu a paralelnímu zpracování. esbuild však podporuje méně optimalizací: neprovádí mangling se zachováním vlastností, neodstraňuje type-only importy a optimalizuje výrazy méně agresivně.
// webpack.config.js — konfigurace 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,
}),
],
},
};Konfigurace TerserPlugin zahrnuje tři klíčové bloky. compress je odpovědný za optimalizaci výrazů: drop_console odstraňuje console.log, drop_debugger odstraňuje debugger, dead_code odstraňuje nedosažitelné větve. mangle řídí přejmenovávání proměnných s reserved pro ochranu veřejných názvů. parallel zapíná vícevláknovost podle počtu CPU.
// esbuild: CLI příkaz pro minifikaci JS a 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));esbuild API přijímá konfiguraci na jeden řádek. minify: true zapíná minifikaci pro JS i CSS. sourcemap: true generuje mapy kódu pro ladění. target určuje minimální úroveň ES — esbuild automaticky transpiluje moderní kód na vybranou verzi. esbuild je obzvláště účinný v projektech, kde je doba sestavení kritická: CI/CD pipeline, Hot Module Replacement a rychlé prototypování.
React Native používá Metro Bundler — vlastní bundler, který zahrnuje minifikaci založenou na Terseru. V produkčním režimu Metro automaticky aplikuje minifikaci na JavaScript bundle aplikace. Konfigurace minifikace v Metru se nastavuje přes metro.config.js v sekci transformer.minifierConfig. Dále lze vypnout inline-require pro zmenšení velikosti bundle na iOS.
WebView v mobilních aplikacích také těží z minifikace. HTML, CSS a JS načítané do WebView musí projít minifikací před vložením do aplikace nebo načtením ze serveru. Pro místní zdroje (Assets) je minifikace obzvláště důležitá — velikost APK/IPA přímo ovlivňuje konverzi instalací v obchodech s aplikacemi.
Hermes — JavaScript engine pro React Native, vyvinutý Facebookem. Hermes provádí Ahead-of-Time (AOT) kompilaci bajtkódu, což snižuje dobu spouštění aplikace o 30–50%. Pro Hermes se minifikace JavaScript bundle provádí před kompilací do bajtkódu pomocí Terseru. Hermes podporuje vlastní formát HBC (Hermes Bytecode), ale fáze JS minifikace zůstává nezbytná.
// metro.config.js — konfigurace minifikace
const defaultConfig = require("metro-config/src/defaults");
module.exports = require("metro-config").mergeConfig(
defaultConfig,
{
transformer: {
minifierConfig: {
compress: {
drop_console: true,
},
mangle: {
safari10: true,
},
},
},
}
);Metro s minifierConfig.drop_console odstraňuje všechny console.log z produkčního bundle React Native. Parametr mangle.safari10 zabraňuje přejmenovávání identifikátorů, které poškozují Safari 10 (iOS 10). To je obzvláště důležité pro aplikace podporující stará zařízení iPad a iPhone 5s s iOS 10/11.
Minifikace a komprese (gzip, brotli) jsou různé fáze optimalizace. Minifikace pracuje na úrovni zdrojového kódu a snižuje počet znaků před odesláním na server. Komprese pracuje na úrovni transportního protokolu a je aplikována serverem (nginx, Apache, CDN) při přenosu souboru klientovi. Minifikace snižuje velikost před kompresí, což poskytuje dvojitý efekt: gzip komprimuje již zkrácená data.
Velikost JavaScript souboru 300 KB po minifikaci — 120 KB, po gzip — 35–40 KB. Pokud je gzip aplikován pouze na neminifikovaný soubor, velikost bude 55–70 KB. Minifikace + gzip poskytuje o 30–40% lepší výsledek než samotný gzip. Brotli (úroveň 6) komprimuje po minifikaci o 15–20% účinněji než gzip.
| Metoda | Úroveň | Velikost souboru | Snížení |
|---|---|---|---|
| Původní soubor | — | 300 KB | 0% |
| Po minifikaci | Kód | 120 KB | 60% |
| Po gzip (bez minifikace) | Transport | 65 KB | 78% |
| Minifikace + gzip | Kód + Transport | 38 KB | 87% |
| Minifikace + Brotli | Kód + Transport | 30 KB | 90% |
Často kladené otázky
UglifyJS — zastaralý nástroj pro minifikaci, který nepodporuje syntaxi ES6+. Terser je fork UglifyJS s podporou moderního JavaScriptu. Všechny moderní bundlery (Webpack 5, Rollup, esbuild) používají Terser nebo vlastní minifikátory, zatímco UglifyJS se uplatňuje pouze v legacy projektech.
Source maps — samostatné .map soubory, které nejsou zahrnuty do produkčního bundle. Server by měl poskytovat source maps pouze autorizovaným vývojářům (přes hlavičku Authorization). V produkci source maps nejsou načítány prohlížečem uživatele, a proto neovlivňují velikost bundle.
Riziko poškození existuje při agresivním manglingu s transformací názvů vlastností objektů. Pokud kód přistupuje k DOM elementům přes data-atributy nebo používá JSON řetězce pro pojmenování polí, mangling může přejmenovat veřejné vlastnosti. Řešení — exclude pomocí mangle.reserved nebo vypnutí manglingu pro určité jmenné prostory.
Minifikace CSS přináší menší zisk (15–25%) než minifikace JS, ale je povinná pro soulad s Core Web Vitals. CSS minifikátory odstraňují mezery, slučují identické selektory, zkracují hex barvy (#ff0000 → #f00) a odstraňují nepoužívané @keyframes. CleanCSS a esbuild jsou populární nástroje pro minifikaci CSS.
Source maps (.map soubory) spojují minifikovaný kód s původním. V Chrome DevTools a Safari Web Inspector se zapnutými source maps se zobrazují původní soubory. Pro správnou funkci musí být source maps nahrány na server (i v produkci) a povoleny prostřednictvím vývojářských nástrojů.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také