Na navigaci | Klávesové zkratky

Kdy používat preprocesory a kdy ne?

Složitá otázka, těžké kodérovo dilema, které se pokusím rozseknout: používejte preprocesory vždy!

Jak se Internet přesunul do mobilů, staly se největší zabijáci rychlosti načítání stránek tyhlety úhledné sloupečky:

<link rel="stylesheet" href="/css/reset.css">
<link rel="stylesheet" href="/css/content.css">
<link rel="stylesheet" href="/css/layout.css">
<link rel="stylesheet" href="/css/screen.css" media=screen>
<link rel="stylesheet" href="/css/fancybox/jquery.fancybox.css" media=screen>
<link rel="stylesheet" href="/css/print.css" media=print>
<script src="/js/jquery.js"></script>
<script src="/js/jquery.autocomplete.js"></script>
<script src="/js/fancybox/jquery.fancybox.js"></script>
<script src="/js/tooltips/jquery.tooltips.js"></script>
<script src="/js/jquery.scrollspy.js"></script>
<script src="/js/main.js"></script>

To nechceš! Chceš tohle:

<head><link rel="stylesheet" href="/assets/combined.css"></head>

<body>
...
<script src="/assets/combined.js"></script>
</body>

Taky chceš, aby se ti všechny soubory posílaly zazipované a vypadaly hutně: combined.css a hustě: combined.js.

Byly doby, kdy se komprimované skripty psaly ručně. Vynechávaly se komentáře, v JavaScriptu používaly jednopísmenné proměnné atd.

Nedělejte to. Vaším úkolem je psát čitelný kód a komprimování JavaScriptu nechte na bedrech Google Closure Compiler, který to dokáže řádově lépe než vy a navíc upozorní na chyby, o minifikaci stylů se postará například Less.

Ten dokonce zvládá vychytávku, kdy u všech miniobrázků můžete nahradit:

textarea {
	background: #fff url("img/input.gif") repeat-x;
}

za

textarea {
	background: #fff data-uri("img/input.gif") repeat-x;
}

a preprocesor je přímo vloží do combined.css, čímž odpadne hromada HTTP requestů na 100bajtové drobky.

Preprocesory prostě a jednoduše chcete!

před 11 lety v rubrice Web | blog píše David Grudl | nahoru

Mohlo by vás zajímat

Komentáře

  1. Martin Michálek #1

    avatar

    Davide, máš tu data-uri() funkci nějak vyzkoušenou? IMHO to funguje jen při kompilaci přes node, tzn. na příkazové řádce, ne?
    https://web.archive.org/…0/functions/
    Nikoliv teda s kompilačními aplikacemi typu Prepros.

    před 11 lety | reagoval [3] David Grudl [7] Jan Panschab
  2. Tom Honek #2

    avatar

    To data-uri() ale nefunguje konzistentně přes všechny mobilní prohlížeče.

    před 11 lety | reagoval [3] David Grudl
  3. David Grudl #3

    avatar

    #1 Martine Michálku, jasně, třeba právě v textarea tady na blogu. Kompiluji to teda přes Node, vlastně ani jiný (produkční) způsob neznám.

    #2 Tome Honku, a ve kterém mobilním prohlížeči to nefunguje? Podle https://caniuse.com/datauri by neměl být problém.

    před 11 lety
  4. Tomáš Fejfar #4

    avatar

    Jen doplnění – na jednu věc je potřeba si s preprocessory dát pozor – pokud se moc rozlétnete s generováním jednotlivých pravidel a budete jich mít víc než 4095, tak vám je IE<9 zaříznou – prostě naimportují jen 4096 a zbylé zahodí. Takže je pak potřeba rozdělit výsledek na dva různé soubory. Více viz https://web.archive.org/…rules-limits

  5. Jakub Bouček #5

    avatar

    #4 Tomáši Fejfare, IE<9? S tím dokážu žít.

    před 11 lety | reagoval [8] Martin Hujer
  6. xxar3s #6

    avatar

    na CSS používam stylus, na JS som si napísal preprocessor (podporujúci aj ďalšie JS nadstavby ako livescript a coffescript). pri JS je premna dôležité aby som nemusel nič spúšťať a čakať ale mohol vydieť výsledok priamo v prehliadači, takže moj preprocesor ma aj watcher ktorý monitoruje zmeny v adresárovej štruktúre a pri každej zmene sa automaticky všetky súbory pospájajú do jedného následne sa livescriptový súbor prevedie do javascriptu.

    před 11 lety
  7. Jan Panschab #7

    avatar

    Naprostý souhlas, preprocesor je nutnost. A ještě jedna poznámka k data-uri. Opravdu to používejte pouze pro ikonky – https://www.salesforce.com/…ce-platform/?….

    #1 Martine Michálku, Používání aplikací typu Prepros je anti-pattern.

    před 11 lety | reagoval [10] Martin Michálek
  8. Martin Hujer #8

    avatar
    před 11 lety
  9. David Grudl #9

    avatar

    #4 Tomáši Fejfare, zkusil jsem to přepočítat na „fotbalová hřiště“ ;) Nevím, jak přesně pravidla spočítat, ale počet složených závorek by mohlo být dobré vodítko. Co jsem se tak díval na své weby, tak 4096 je naštěstí hodně vzdálená hranice, ale třeba celý Twitter Bootstrap už má cca 1400 pravidel.

    před 11 lety
  10. Martin Michálek #10

    avatar

    #7 Jane Panschabe, proč antipattern? Máš argumenty?

    před 11 lety | reagoval [11] Jan Panschab
  11. Jan Panschab #11

    avatar

    #10 Martine Michálku, Vždycky je lešpí použít buildovací nástroj jako třeba Grunt nebo Gulp, který lze přidat do repozitáře (resp. nastavení toho co se má sledovat a jak kompilovat). Jednotné nastavení pak můžu sdílet na více prostředích, s více uživateli.

    před 11 lety | reagoval [12] Martin Michálek
  12. Martin Michálek #12

    avatar

    #11 Jane Panschabe, To „Vždycky“ je ve webařině dost nebezpečné slovo. :) Vše je odvislé od situace.

    Pro spoustu typů pracovních postupů je Grunt/Gulp lepší, ano. Ale pak jsou frontendisti, kteří si s příkazovou řádkou úplně nerozumějí. A aplikace s UI typu Prepros mají opodstatnění i z pohledu přidaných vlastností typu live reload.

    před 11 lety | reagoval [13] Jan Panschab
  13. Jan Panschab #13

    avatar

    #12 Martine Michálku, A to je právě ta chyba, klást si malé cíle (nadsázka). Viz tento článek https://24ways.org/…rd-and-hard/. Livereload je součástí Grunt watch tasku (https://github.com/…ontrib-watch) už asi půl roku. Další výhoda Gruntu je ta, že je zdarma, dají se do něj lehce dopsat vlastní pluginy/tasky, a právě to, že běží na NodeJS – prostředí, ve kterém je psaná většina kompilátorů (LESS, Stylus) a lze tím pádem maximálně využít jejich potenciál – viz zmíněné embedování obrázků pomocí data-uri.

    před 11 lety
  14. Mark #14

    avatar

    automaticky tohle umí dělat modul PageSpeed od Googlu pro servery Apache … https://developers.google.com/…speed/module

    před 10 lety
  15. bubidubi #15

    Hehe, že jsou CSS a JS zabijákem načítání? :D Lol…
    Ono nemusí být vždy dobré VŠE tlačit do jednoho…
    Ano, určitě je lepší komprimovat a spojovat tam, kde to má význam, ale v drtivé většině případů hlavní load dělají nevhodně velké zdroje obrázků a zabržděná server strana (tip: output buffering).
    Další důležitá věc, co si musíte uvědomit, je, že některé věci je pro vás lepší načíst paralelně aby se obě 2 mohly začít zaráz používat co nejdříve a pak se teprv doloaduje zbytek…

    před 8 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.