co je to asset pipeline?
pokud stavíte aplikaci Rails, pravděpodobně jste slyšeli o potrubí aktiv. Potrubí aktiv lze považovat za nástroje a mechanismy, kterými jsou soubory JavaScriptu, styly a obrázky zpracovávány a připravovány pro použití prohlížečem. Tyto procesy mohou minifikovat a komprimovat aktiva, stejně jako aktiva před zpracováním, která jsou napsána v jiných jazycích, jako je Coffeescript nebo Sass.
potrubí aktiv bylo vytvořeno pro řešení různých problémů souvisejících se statickými aktivy. Jedním z takových problémů je, že každé aktivum specifikované Samostatně v označení HTML musí být načteno samostatně, což má za následek vyšší počet požadavků HTTP a nakonec delší dobu načítání. Raw Javascript a CSS soubory mohou také ztrácet spoustu šířky pásma s komentáři, extra prázdné místo, a dlouhé názvy proměnných. Dalším problémem, který přichází, je ukládání do mezipaměti. Když například servírujete soubor Javascript ze serveru, prohlížeč tento soubor automaticky uloží do mezipaměti po určitou dobu. To zlepšuje čas načítání stránky, ale co když se toto aktivum změní později? Prohlížeč o tom nebude vědět, takže bude i nadále používat aktivum uložené v mezipaměti, dokud nevyprší jeho životnost mezipaměti. Konečně, jazyky jako Coffeescript, Sass, Less, a Erb dělal to jednodušší organizovat a psát Javascript a CSS, ale prohlížeč neumí interpretovat přímo, takže pre-procesor je potřeba převést tyto soubory do jejich příslušné protějšky před jejich odesláním do prohlížeče.
potrubí aktiv může ve své benevolenci vyřešit všechny výše uvedené problémy při správném použití. To může sestavit více aktiv do jednoho, minify a obklad aktiv, poskytnout trávení aktiv, aby se zabránilo problémy ukládání do mezipaměti, a můžete pre-proces, alternativní jazyky a proměnit je v Javascriptu a CSS.
tento příspěvek pokrývá celou řadu témat souvisejících s ropovodem aktiv:
- základy toho, jak používat asset pipeline
- osvědčených postupů pro strukturování, kam dát vaše aktiva
- jak používat precompile pole určit, jaké soubory jsou zpracovány asset pipeline
- jak Sass a Coffeescript může být hybnou silou,
- jak používat Kolejnice aktiv pomocné metody, a
- některé gotchas
Základní Použití
Existují dva základní způsoby, že aktivum potrubí se používá:
- Při spuštění serveru v režimu rozvoje, automaticky pre-procesy a připravuje svůj majetek on-the-fly.
- v produkčním režimu jej pravděpodobně použijete k předběžnému zpracování, verzování a kompresi a kompilaci vašich aktiv. Můžete tak učinit spuštěním následujícího příkazu:
1 |
|
To bude vytvořit (výchozí nastavení) assets
adresář public/
složka. Poté přidá všechny komprimované a kompilované soubory do tohoto adresáře, v příslušných formátech a s novými strávenými verzemi. Pak můžete nastavit Nginx nebo Apache na server tyto soubory přímo tak, že Rails nemusí dodávat (a spustit on-the-fly předzpracování, atd.) sám.
nezapomeňte, že výchozí hodnoty lze změnit, takže pokud věci nefungují podle očekávání, zkontrolujte konfigurační soubor aplikace v config/application.rb
. V kolejnicích 4 je manipulace s aktivy obvykle konfigurována v config/initializers/assets.rb
.
Struktura Souboru
je důležité, aby organizovat svůj majetek způsobem, který je pochopitelný, a usnadňuje stávající funkčnost aktiv potrubí. První věc, kterou byste měli vědět, je, že všechny vaše vlastní Javascript, styly a obrázky by měly jít do adresáře app/assets/
. Ve výchozím nastavení existuje složka pro javascripts
, stylesheets
a images
. Můžete také přidat fonts
, audios
a videos
do adresáře app/assets/
pro tyto typy aktiv. Všechny kódy třetích stran, které používáte (např.js, atd.) by měl být umístěn v adresáři vendor/assets/
:
1234567891011 |
|
Protože váš webový server bude automaticky server statické soubory z public/
directory, proč by ne všechny Javascriptu, image a styl aktiva být umístěny tam? Pro jednoho, nic v public
složka bude mít předem zpracovány, sestaveny, nebo komprimován automaticky, tak tím, že majetek tam, ty jsou zcela obcházet asset pipeline a ztrácí všechny jeho výhody. Když tam vložíte aktiva, ztratíte také schopnost snadno je odkazovat v kódu Rails. Můžeš mít názor, například, který má následující kód:
12345678910 |
|
Ve druhém scénáři (public/images/logo.png
), stránky budou fungovat pouze tehdy, pokud je doručen od základní adresář. Nemůže také využít verzování souboru pomocí asset pipeline.
Precompilation
možná se nyní ptáte, zda vše, co vložíte do složky app/assets/javascripts/
, bude automaticky předkompilováno pro vaši aplikaci. Naštěstí potrubí aktiv poskytuje způsob, jak určit, které soubory jsou kompilovány a v jakém pořadí. Ve výchozím nastavení aplikace.css a aplikace.JS (nebo jejich ekvivalenty sass/coffeescript), spolu se všemi non-Javascript, non-CSS aktiva jsou zahrnuty. Chcete-li zahrnout soubor CSS nebo Javascript jiný než aplikace.css a aplikace.js, budete muset vyžadovat to v jednom ze dvou způsobů:
- Přidat do precompile pole v
config/initializers/assets.rb
Lišty (4), nebo své žádosti config (např.config/application.rb
) nebo - Patří souboru ve vašem aktiva manifest nebo jeden z jeho sub-soubor manifest.
první možnost vypadá takto:
12 |
|
Tato možnost je nejlepší pro soubory, které to dává smysl, aby zahrnovalo pouze na určité stránky, a neměly by být zahrnuty na ostatní. Pokud máte například část vašeho webu, která bude použita jako vložený widget iframe, můžete na této stránce použít pouze widget.js
a widget.css
nebo podobné. Tyto soubory by musely být přidány do pole precompile, jak je uvedeno výše.
druhá možnost je to, co by mělo být používáno většinu času, a umožňuje kompilaci souborů Javascript a CSS do jedné aplikace.js a jedna aplikace.soubor css. Manifest je napsán v horní části příslušného aktiva.
V coffeescript, vypadá jako tento:
12345 |
|
výše uvedený manifest bude zahrnovat jQuery, Rails jQuery nenápadný skriptování adaptér (jquery_ujs), a všechny soubory v aktuálním stromu (např. app/assets/javascript/*
). Všimněte si, že require_tree
nekompiluje aktiva rekurzivně prostřednictvím adresářů. Pokud máte složku souborů, které chcete zahrnout, budete muset dodat, že do projevovat stejně:
1 |
|
Jeden manifest směrnice je require_self
, který se používá k obsahovat aktuální soubor Javascript v tomto bodě v řetězci. Výše uvedené, s require_self
lze zapsat do souboru .js
následovně:
1234567 |
|
Sass/CSS projevuje použít stejný základní formát, ale s odpovídající komentář styl:
123456 |
|
Všimněte si, že při použití Sass, budete muset použít své @import
pravidlo využít proměnné a mixins, protože každý soubor, který sestavil manifest má svůj vlastní prostor.
buďte opatrní při používání směrnice require_tree
. Majetek ve stromu budou zahrnuty v abecedním pořadí, což znamená, že pokud soubor, který začíná s „a“ závisí na souboru, který začíná „z“, můžete narazit na problémy, kde potřebné kusy nejsou k dispozici, když Javascript je hodnocena prohlížeče. Tomuto problému se lze vyhnout použitím příslušných jQuery(document).ready()
, nebo window.onload
stráže, zadáním pořadí ručně, nebo být prefixování souborů s čísly jako 01_
, 02_
:
12345 |
|
Pamatujte si, že žádné předkompilovaný Javascript nebo CSS soubor může obsahovat manifest na vrcholu, takže můžete použít podsložky se soubory zjednodušit své nejvyšší úrovni projevovat.
Sass a Coffescript, a Kolejnice Aktiv Pomocníci
jsem se zmínil, Sass a Coffeescript trochu ve výše uvedených oddílech, ale ještě jsem šel do toho, co oni jsou. Pokud jste již obeznámeni s nimi, neváhejte přeskočit na dolů do sekce“ Rails Asset Helpers“.
Sass a Coffeescript
Sass a Coffeescript jsou jazyky, které používají troffu transformovat jejich syntaxe do CSS a Javascript, respektive. Existuje několik dalších předzpracovaných jazyků, jako je Typescript a Less, ale Sass a Coffeescript jsou standardně zahrnuty s Rails a jsou pravděpodobně nejoblíbenější. Nebudu jít do rozsáhlých detailů zde na těchto jazycích, tak prosím podívejte se na odkazy výše pro více informací.
Z mé zkušenosti, zatímco Sass a Coffeescript poskytnout spoustu syntaktického cukru (celkem kód funkce), skutečnost, že výjimky jsou vyvolána neplatný kód ve fázi předzpracování je dost ospravedlnit jejich použití. Coffeescript automaticky zabalí váš kód do souboru a přidá Klíčové slovo var
do místních proměnných, čímž zabrání mnoha bolestem hlavy, které se mohou ve vanilkovém JavaScriptu stát snadněji.
například následující kód Coffeescript:
12345 |
|
je převeden na následující Javascript:
1234567891011 |
|
Když preprocesor zpracovává souboru, je to automaticky zábaly kód v anonymní funkce ((function() {}).call(this)
) a přidá var
klíčové slovo na první použití state
. Všimněte si, že pokud chcete použít globální rozsah, musíte to zadat prefixem window.
.
existuje mnohem více Coffeescript, ale automatický rozsah byl velmi užitečné pro mě osobně v prevenci těžko k nalezení chyby.
Rails Asset Helpers
další skvělou funkcí, kterou můžete získat pouze pomocí Sass v projektu Rails, jsou asset path helpers. Při odkazování jiných aktiv ve vašem Sass, můžete použít následující syntaxi získat vhodné cesty:
123 |
|
pomocníci image-path
, asset-url
, a asset-path
mohou být také použity. Pomocníci -url
zabalí cestu url()
.
Erb v aktivech
potrubí aktiv umožňuje vyhodnotit kód erb ve vašich aktivech CSS a Javascript pomocí přípony názvu souboru .application.js.erb
nebo application.scss.erb
). I když to může být užitečné pro přidání cesty aktiv do vašeho JavaScriptu, v celku nedoporučuji používat tuto funkci. Přidává další krok předzpracování do souboru, čímž se zvyšuje čas potřebný k předkompilaci. Může také vést ke špatným návykům. Můžete být v pokušení přidat kód, který nedává smysl v době kompilace, jako je překlad řetězců. Tyto řetězce by byly přeloženy pouze v době kompilace, čímž by byl vyvrácen celý účel jejich překladu. Jediným důvodem pro použití Erb v souboru Javascript by mělo být použití pomocníka asset_path
, jak je popsáno v příručce.
Asset Pipeline Gotchas
níže jsou uvedeny některé gotchas a tidbits, které mohou být užitečné při vývoji aktiv aplikace Rails.
- Jak mohu přidat globální data pro můj Javascript používat?
- Gon gem lze použít k vložení globálně zaměřených dat na stránku, aby váš Javascript mohl spotřebovat. To je skvělé pro věci, jako je poskytování ID aktuálního uživatele nebo nastavení webu.
- kde bych měl rozšířit předkompilní pole?
- v Rails 4 byste měli rozšířit pole v
config/initializers/assets.rb
a v Rails 3 byste to měli udělat vconfig/application.rb
. Použití aktiv.rb nebo aplikace.rb nastaví precompile pole pro všechny prostředí, tak, že přidáte prostředí (možnástaging
), nebudete muset rozšířit precompile pole speciálně pro to nové prostředí.- aktiva.rb:
Rails.application.config.assets.precompile += %w( widget.css widget.js )
- aplikace.rb:
config.assets.precompile += %w( widget.js widget.css )
- aktiva.rb:
- v Rails 4 byste měli rozšířit pole v
- Když mám precompile aktiva samostatně rozšiřovat precompile pole?
- to by se mělo provádět jen zřídka. Většinu času, jediný důvod, proč byste to chtěli udělat, je, pokud je aktivum zahrnuto Samostatně na speciální stránce, kde nechcete zbytek aktiv, jako je widget vložený do iframe. Použijte svou aplikaci.js a aplikace.css se projevuje, aby vytáhl vaše aktiva.
- mám povolit, aby kolejnice sloužily statickým souborům?
- Ano. Následuje Dvanáct-Faktor Aplikace pokyny a zabraňuje chybám, pokud jste zapomněli zahrnout soubor v precompile pole, nebo, pokud jste zapomněli precompile.
- nastavit
config.serve_static_assets = true
v kolejnicích 3 aconfig.serve_static_files = true
v kolejnicích 4.
- Jak mohu zajistit, aby byl můj Javascript / CSS dobře napsán?
- Psát kvalitní Javascript a CSS (nebo Coffeescript a Sass) může trvat hodně času a zkušeností, ale jedna věc, která výrazně pomohla mi je pomocí linter). Některé IDE, například Sublime Text, mají pluginy, které integrují lintery. Já osobně používám balíček SublimeLinter. Pokud se chystáte psát obyčejný Javascript a CSS, určitě byste měli používat linter.
- Jak mohu změnit adresář, kde jsou umístěny mé předkompilované prostředky?
- můžete změnit nastavení
config.asset.prefix
do jiného adresáře, například/static
. - změňte předponu aktiva v
development.rb
, pokud chcete sledovat předkompilovaná aktiva v gitu pro výrobní použití. - změňte předponu aktiva globálně, pokud chcete pro své řadiče použít jmenný prostor cesty
/assets
.
- můžete změnit nastavení
- Jak mohu sloužit statická aktiva s Nginx?
- základní nginx směrnice by měla vypadat takto (viz Precompiling Aktiva části Kolejnice průvodce pro více informací):
1234567 |
|
- to, Co je zjevné.yml nebo manifest-.json?
- manifest.yml (kolejnice 3) nebo manifest-.json (Rails 4) soubory jsou vytvořeny automaticky, když si předkompilovat svůj majetek s
rake assets:precompile
. Obsahují informace o tom, které soubory mají být použity vaší aplikací.
- manifest.yml (kolejnice 3) nebo manifest-.json (Rails 4) soubory jsou vytvořeny automaticky, když si předkompilovat svůj majetek s
- jaké typy souborů by neměly být zahrnuty do potrubí aktiv?
- obvykle budete chtít uchovávat velké soubory (videa, velké množství Stažení PDF atd.) v samostatném úložišti nebo ve Správci cloudových souborů, jako je AWS S3. Soubory pak lze odkazovat z vaší aplikace, ale nemusíte bažin dolů git úložiště.
- Jak mohu získat mé Rails 3 aktiva kompilovat rychleji?
- použijte
turbo-sprockets-rails3
drahokam.
- použijte
- Mohu pro svá aktiva použít CDN (content delivery network)?
- Ano! Digest, nebo otisk prstu, s příponou na každé aktivum dělá je skvěle pracovat s CDN. Nastavte CDN tak, aby sloužil aktivům z aplikace Rails, a poté nastavte konfiguraci
config.action_controller.asset_host
na příslušnou doménu pro vaše CDN (např.config.action_controller.asset_host = 'mycdn.fictional-cdn.com'
). K nastavení tohoto nastavení doporučuji použít proměnné prostředí:config.action_controller.asset_host = ENV
.
- Ano! Digest, nebo otisk prstu, s příponou na každé aktivum dělá je skvěle pracovat s CDN. Nastavte CDN tak, aby sloužil aktivům z aplikace Rails, a poté nastavte konfiguraci
Balení
Pomocí asset pipeline správně, může zlepšit celkovou kvalitu aplikace z hlediska výkonu, odolnosti a kód čistoty. Pomocí funkcí asset pipeline můžete automaticky překonat některé z největších problémů souvisejících s kódováním a doručováním statických aktiv.