What is the asset pipeline?
jos rakennat Rails-sovellusta, olet luultavasti kuullut omaisuusputkesta. Asset putki voidaan ajatella työkaluja ja mekanismeja, joilla Javascript tiedostoja, tyylisivut, ja kuvia käsitellään ja valmistetaan käytettäväksi selaimen. Nämä prosessit voivat minifioida ja pakata varoja sekä esiprosessiin liittyviä resursseja, jotka on kirjoitettu muilla kielillä, kuten Coffeescript tai Sass.
omaisuusputki luotiin ratkaisemaan erilaisia staattisiin omaisuuseriin liittyviä ongelmia. Yksi tällainen ongelma on, että jokainen HTML-merkinnässä erikseen määritelty omaisuuserä on haettava erikseen, jolloin HTTP-pyyntöjen määrä kasvaa ja lopulta latausaika pitenee. Raw Javascript-ja CSS-tiedostot voivat myös tuhlata paljon kaistanleveyttä kommentteja, ylimääräistä valkoista tilaa, ja pitkä muuttuja nimiä. Toinen esiin nouseva asia liittyy välimuistiin tallentamiseen. Kun syötät Javascript-tiedoston palvelimeltasi, selain esimerkiksi tallentaa tiedoston automaattisesti joksikin aikaa. Tämä parantaa sivun latausaikaa,mutta entä jos kyseinen ominaisuus muuttuu myöhemmin? Selain ei tiedä siitä, joten se jatkaa välimuistin käyttöä, kunnes sen välimuistin käyttöikä on päättynyt. Lopuksi, kielet kuten Coffeescript, Sass, Less, ja Erb ovat helpottaneet järjestää ja kirjoittaa Javascript ja CSS, mutta selain ei voi tulkita niitä suoraan, joten esiprosessori tarvitaan muuntaa nämä tiedostot sopiviksi kollegansa ennen kuin ne lähetetään pois selaimeen.
hyödykeputki voi oikein käytettynä ratkaista kaikki edellä mainitut ongelmat. Se voi koota useita varoja yhdeksi, minify ja pakkaa varat, tarjota sulattamalla omaisuuden välttää välimuistiin kysymyksiä, ja voi esikäsitellä vaihtoehtoisia kieliä ja muuttaa ne Javascript ja CSS.
tämä viesti kattaa useita omaisuuseräputkeen liittyviä aiheita:
- the basics of how to use the asset pipeline
- best practices for structuring where to put your assets
- how to use the precompile array to specify what files are processed by the asset pipeline
- how to use Rails asset helper methods, and
- how to use Rails asset helper methods, and
- jotkut gotchat
peruskäyttö
on kaksi perustapaa, joilla omaisuusputkea käytetään:
- kun suoritat palvelinta kehitystilassa, se automaattisesti esiprosessoi ja valmistelee omaisuutesi lennossa.
- tuotantotilassa käytät sitä todennäköisesti esiprosessointiin, versiointiin sekä paketointiin ja kokoamiseen. Voit tehdä sen suorittamalla seuraavan komennon:
1 |
|
tämä luo (oletuksena) assets
– kansion public/
– kansioosi. Se lisää sitten kaikki pakatut ja kootut tiedostot kyseiseen hakemistoon, sopivissa muodoissa ja uusilla sulatetuilla versioilla. Voit sitten määrittää nginx tai Apache palvelimelle nämä tiedostot suoraan niin, että Rails ei tarvitse toimittaa niitä (ja ajaa On-The-fly esikäsittely, jne.) itse.
muista, että oletuksia voidaan muuttaa, joten jos asiat eivät toimi odotetusti, Tarkista sovelluksen asetustiedosto kohdasta config/application.rb
. Rails 4: ssä omaisuudenkäsittely on tyypillisesti konfiguroitu config/initializers/assets.rb
.
tiedostorakenne
on tärkeää järjestää varat itselle ymmärrettävällä tavalla ja helpottaa omaisuusputken olemassa olevaa toimivuutta. Ensimmäinen asia, sinun pitäisi tietää, että kaikki mukautetun Javascript, tyylisivut, ja kuvat pitäisi mennä app/assets/
hakemistoon. Oletusarvoisesti jokaiselle on olemassa kansio javascripts
, stylesheets
ja images
. app/assets/
– hakemistoon voi myös lisätä fonts
, audios
ja videos
näiden omaisuustyyppien osalta. Kaikki käyttämäsi kolmannen osapuolen koodi (esim.jQuery, backbone.js jne.) sijoitetaan vendor/assets/
– kansioon:
1234567891011 |
|
koska www-palvelimesi palvelee automaattisesti staattisia tiedostoja public/
– hakemistosta, miksi kaikki Javascript -, image-ja tyylisivut eivät tulisi sijoittaa sinne? Ensinnäkään mitään public
– kansiossa ei saada esikäsiteltyä, koottua tai pakattua automaattisesti, joten laittamalla varat sinne ohitat täysin omaisuusputken ja menetät kaikki sen edut. Kun laitat varat siellä, menetät myös mahdollisuuden helposti viitata niihin Oman Rails koodi. Sinulla voisi olla esimerkiksi näkymä, jossa on seuraava koodi:
12345678910 |
|
toisessa skenaariossa (public/images/logo.png
) sivusto toimii vain, jos se toimitetaan perushakemistosta. Se ei myöskään voi hyödyntää asset pipeline versiointi tiedoston.
Esikompilaatio
saatat nyt miettiä, onko kaikki, mitä laitat app/assets/javascripts/
– kansioon, automaattisesti esikäännetty sovelluksellesi. Onneksi, asset putki tarjoaa tapa määrittää, mitkä tiedostot kootaan, ja missä järjestyksessä. Oletuksena sovellus.css ja sovellus.js (tai niiden Sass/coffeescript vastineet), sekä kaikki ei-Javascript, ei-CSS varat ovat mukana. Sisällyttää CSS-tai Javascript-tiedoston muu kuin sovellus.css ja sovellus.js, sinun täytyy vaatia sitä kahdella tavalla:
- lisää se precompile array in
config/initializers/assets.rb
(Rails 4) tai sovelluksen config tiedosto (esim.config/application.rb
), tai - Sisällytä tiedosto omaisuutesi manifestiin tai johonkin sen alitiedostoon manifestiin.
ensimmäinen vaihtoehto näyttää tältä:
12 |
|
tämä vaihtoehto on paras tiedostoille, jotka on järkevää sisällyttää vain tietyille sivuille, eikä niitä pitäisi sisällyttää muille. Esimerkiksi, jos sinulla on osa sivustostasi, jota käytetään Iframe embedded widget, saatat haluta vain widget.js
ja widget.css
, tai vastaava, voidaan käyttää kyseisellä sivulla. Nämä tiedostot olisi lisättävä precompile array kuten yllä.
toinen vaihtoehto on, mitä tulisi käyttää suurimman osan ajasta, ja mahdollistaa Javascript-ja CSS-tiedostojen kokoamisen yhdeksi sovellukseksi.js ja yksi hakemus.CSS-tiedosto. Manifesti on kirjoitettu sovellettavan hyödykkeen yläreunaan.
kahvinkeitossa se näyttää tältä:
12345 |
|
yllä oleva manifesti sisältää jQueryn, Rails jQueryn huomaamattoman skriptaussovittimen (jquery_ujs) ja kaikki nykyisen puun tiedostot (eli app/assets/javascript/*
). Huomaa, että require_tree
ei käännä varoja rekursiivisesti hakemistojen kautta. Jos sinulla on kansio tiedostoja, jotka haluat sisällyttää, sinun täytyy lisätä, että manifest samoin:
1 |
|
vielä yksi manifestidirektiivi on require_self
, jota käytetään nykyisen tiedoston JavaScriptin sisällyttämiseen kyseisessä vaiheessa ketjua. Yllä oleva, jossa require_self
voidaan kirjoittaa .js
– tiedostoon seuraavasti:
1234567 |
|
Sass/CSS manifestit käyttävät samaa perusmuotoa, mutta sopivalla kommentointityylillä:
123456 |
|
huomaa, että kun käytät Sassia, sinun on käytettävä sen @import
– sääntöä muuttujien ja mixinien hyödyntämiseksi, sillä jokaisella manifestin kokoamalla tiedostolla on oma soveltamisalansa.
ole varovainen require_tree
– direktiivin kanssa. Varat puu sisällytetään aakkosjärjestyksessä, mikä tarkoittaa, että jos tiedosto, joka alkaa ” A ”riippuu tiedoston, joka alkaa” z”, voit törmätä ongelmiin, joissa tarvittavat osat eivät ole saatavilla, kun Javascript arvioidaan selaimen. Tämä ongelma voidaan välttää käyttämällä asianmukaista jQuery(document).ready()
, tai window.onload
vartijat, määrittämällä käsky manuaalisesti, tai prefixing tiedostot numerot kuten 01_
, 02_
:
12345 |
|
muista, että kaikki valmiiksi käännetty Javascript-tai CSS-tiedosto voi sisältää manifestin yläosassa, joten voit käyttää alikansioiden tiedostoja yksinkertaistamaan ylätason manifestia.
Sass and Coffescript, and Rails Asset Helpers
olen maininnut Sassin ja Coffeescriptin hieman edellä mainituissa kohdissa, mutta en ole vielä mennyt siihen, mitä ne ovat. Jos olet jo perehtynyt niihin, hyppää vapaasti alas ”Rails Asset Helpers” – osioon.
Sass ja Coffeescript
Sass ovat kieliä, jotka käyttävät esiprosessoreita muuntaakseen syntaksinsa CSS: ksi ja JavaScriptiksi. On olemassa useita muita esikäsiteltyjä kieliä, kuten Typescript ja Less, mutta sass ja Coffeescript ovat oletuksena mukana kiskoilla, ja ovat luultavasti suosituimpia. En mene yksityiskohtaisesti täällä näitä kieliä, joten tutustu linkkejä yllä lisätietoja.
kokemukseni perusteella, vaikka Sass ja Coffeescript tarjoavat paljon syntaktista sokeria (pretty code features), se, että poikkeukset heitetään epäkelpoon koodiin esikäsittelyvaiheessa, riittää oikeuttamaan niiden käytön. Coffeescript käärii automaattisesti koodin tiedostoa kohti ja lisää var
– hakusanan paikallisiin muuttujiin, mikä estää paljon laajuuspäänsärkyä, joka voi tapahtua helpommin vanilla Javascriptissä.
esimerkiksi seuraava Coffeescript-koodi:
12345 |
|
muunnetaan seuraavaksi JavaScriptiksi:
1234567891011 |
|
kun esiprosessori käsittelee tiedostoa, se käärii koodin automaattisesti anonyymiin funktioon ((function() {}).call(this)
) ja lisää var
– hakusanan ensimmäiseen käyttöön state
. Huomaa, että jos haluat käyttää maailmanlaajuista soveltamisalaa, sinun täytyy määrittää se etuliitteellä window.
.
Coffeescriptissä on paljon muutakin, mutta automaattitarkistus on ollut minulle henkilökohtaisesti erittäin hyödyllinen vaikeasti löydettävien vikojen ehkäisyssä.
Rails Asset Helpers
toinen hieno ominaisuus, jonka voit saada vain käyttämällä Sassia Rails-projektissasi, on asset path helpers. Kun viitataan muihin omaisuuseriin Sass, voit käyttää seuraavaa syntaksia saada tarvittavat polut:
123 |
|
myös auttajia image-path
, asset-url
ja asset-path
voidaan käyttää. -url
auttajat käärivät polun url()
.
ERB in Assets
the asset pipeline allows you to evaluate erb CSS and Javascript assets by suffixing the filename with .erb (esim. application.js.erb
tai application.scss.erb
). Vaikka tämä voi olla hyödyllistä lisäämällä voimavara polkuja Javascript, kokonaisuutena en suosittele käyttämään tätä ominaisuutta. Se lisää toisen esikäsittelyvaiheen tiedostoon, mikä lisää aikaa, joka kuluu esikompilointiin. Se voi myös johtaa huonoihin tapoihin. Saatat tuntea kiusausta lisätä koodia, joka ei ole järkevää käännösaikaan, kuten merkkijonojen kääntäminen. Nämä merkkijonot käännettäisiin vasta käännösaikaan, mikä tekisi tyhjäksi koko niiden kääntämisen tarkoituksen. Ainoa syy käyttää ERB: tä Javascript-tiedostossa tulisi olla asset_path
Helperin käyttö oppaassa kuvatulla tavalla.
Asset Pipeline Gotchas
Seuraavassa on joitakin gotchoja ja makupaloja, joista voi olla apua Rails-sovelluksen varojen kehittämisessä.
- Miten lisään globaalia dataa JavaScriptiä varten?
- Gon-jalokivellä voidaan lisätä globaalisti scopattuja tietoja sivulle JavaScriptin kuluttamista varten. Tämä on hyvä asioita, kuten tarjoamalla nykyisen käyttäjän tunnus tai Sivuston asetukset.
- mihin minun pitäisi lisätä esikompile array?
- raiteilla 4 array pitäisi lisätä
config/initializers/assets.rb
, ja raiteilla 3 se pitäisi tehdäconfig/application.rb
. Varojen käyttäminen.rb tai sovellus.rb asettaa precompile array kaikille ympäristöille niin, että jos lisäät ympäristön (ehkästaging
), sinun ei tarvitse lisätä precompile array erityisesti että uusi ympäristö.- vastaavaa.rb:
Rails.application.config.assets.precompile += %w( widget.css widget.js )
- hakemus.rb:
config.assets.precompile += %w( widget.js widget.css )
- vastaavaa.rb:
- raiteilla 4 array pitäisi lisätä
- Milloin minun pitäisi precompile varat erikseen lisäämällä precompile array?
- näin tulee tehdä harvoin. Suurimman osan ajasta, ainoa syy, miksi haluat tehdä tämän on, jos omaisuuserä sisältyy yksin erityinen sivu, jossa et halua loput varat, kuten iframe-upotettu widget. Käytä sovellusta.js ja sovellus.css manifests vetää oman omaisuuden.
- annanko raiteiden palvella staattisia tiedostoja?
- Kyllä. Tämä noudattaa kaksitoista-Factor App ohjeita ja estää virheitä, Jos olet unohtanut sisällyttää tiedoston esikompile array tai jos olet unohtanut esikompile.
- Aseta
config.serve_static_assets = true
kiskoille 3 jaconfig.serve_static_files = true
kiskoille 4.
- Miten voin varmistaa minun Javascript/CSS on hyvin kirjoitettu?
- laadukkaan JavaScriptin ja CSS: n (tai Coffeescriptin ja Sassin) kirjoittaminen voi viedä paljon aikaa ja kokemusta, mutta yksi asia, joka on suuresti auttanut minua, on Linterin käyttö). Joissakin IDE: issä, kuten Sublime Textissä, on liitännäisiä, jotka integroivat linterit. Itse käytän SublimeLinter-pakettia. Jos aiot kirjoittaa tavallista Javascript ja CSS, sinun pitäisi ehdottomasti käyttää linteriä.
- Miten muutan hakemistoa, johon valmiiksi pakatut varat sijoitetaan?
- voit muuttaa
config.asset.prefix
– asetuksen toiseen hakemistoon, kuten/static
. - vaihda omaisuuserän etuliite kohdassa
development.rb
, jos haluat seurata GIT: n valmiiksi kasattuja omaisuuseriä tuotantokäyttöä varten. - vaihda asset-etuliite globaalisti, jos haluat käyttää
/assets
polku-nimiavaruutta ohjaimissasi.
- voit muuttaa
- Miten voin palvella staattisia resursseja Nginxillä?
- nginx-perusdirektiivin tulisi näyttää tältä (Katso lisätietoja kisko-oppaan kokoamista edeltävästä osiosta):
1234567 |
|
- mikä on ilmeistä.yml tai manifest-.jsonko?
- manifesti.yml (Rails 3) tai manifest-.JSON (Rails 4) – tiedostot luodaan automaattisesti, kun esikäännät omaisuuseräsi
rake assets:precompile
: llä. Ne sisältävät tietoa siitä, mitä tiedostoja sovellus käyttää.
- manifesti.yml (Rails 3) tai manifest-.JSON (Rails 4) – tiedostot luodaan automaattisesti, kun esikäännät omaisuuseräsi
- minkä tyyppisiä tiedostoja ei pitäisi sisällyttää omaisuuseräputkistoon?
- haluat yleensä säilyttää suuria tiedostoja (videoita, suuria määriä PDF-Latauksia jne.) erillisessä arkistossa tai pilvitiedostojen hallinnassa, kuten AWS S3. Tiedostoihin voi sitten viitata sovelluksestasi, mutta sinun ei tarvitse tunkea git-arkistoa alas.
- Miten saan Rails 3 varat koota nopeammin?
- käytä
turbo-sprockets-rails3
jalokiveä.
- käytä
- Voinko käyttää CDN: tä (content delivery network) omaisuuksilleni?
- Yes! Digest, tai sormenjälki, joka on liitetty kunkin hyödykkeen tekee niistä toimivat hyvin CDNs. Aseta CDN palvelemaan rails-sovelluksen resursseja ja aseta sitten
config.action_controller.asset_host
– määritys CDN: n asianmukaiselle toimialueelle (esim.config.action_controller.asset_host = 'mycdn.fictional-cdn.com'
). Suosittelen käyttämään ympäristömuuttujia tämän asettamiseen:config.action_controller.asset_host = ENV
.
- Yes! Digest, tai sormenjälki, joka on liitetty kunkin hyödykkeen tekee niistä toimivat hyvin CDNs. Aseta CDN palvelemaan rails-sovelluksen resursseja ja aseta sitten
pakkaaminen
käyttämällä hyödykeputkea oikein voi parantaa sovelluksesi yleistä laatua suorituskyvyn, kestävyyden ja koodin puhtauden osalta. Käyttämällä asset pipeline ominaisuuksia, voit automaattisesti ratkaista joitakin suurimmista ongelmista, jotka liittyvät koodaus ja tuottaa staattisia omaisuuseriä.