mi az eszköz pipeline?
ha Rails alkalmazást épít, akkor valószínűleg hallott már az eszközfolyamatról. Az asset pipeline olyan eszközöknek és mechanizmusoknak tekinthető, amelyekkel a Javascript fájlokat, stíluslapokat és képeket feldolgozzák és előkészítik a böngésző számára. Ezek a folyamatok kicsinyíthetik és tömöríthetik az eszközöket, valamint a más nyelveken írt előfeldolgozási eszközöket, például a Coffeescript vagy a Sass.
az eszközvezeték a statikus eszközökkel kapcsolatos különféle problémák megoldására jött létre. Az egyik ilyen probléma az, hogy a HTML-jelölésben külön-külön megadott minden egyes eszközt külön kell letölteni, ami nagyobb számú HTTP-kérést eredményez, és végül hosszabb betöltési időt eredményez. A nyers Javascript és CSS fájlok szintén sok sávszélességet pazarolhatnak megjegyzésekkel, extra fehér terekkel és hosszú változónevekkel. Egy másik felmerülő kérdés a gyorsítótárazás. Amikor például egy Javascript fájlt szolgál fel a szerverről, a böngésző automatikusan gyorsítótárazza ezt a fájlt egy ideig. Ez javítja az oldal betöltési idejét, de mi van, ha az eszköz egy későbbi időpontban megváltozik? A böngésző nem fog tudni róla, ezért továbbra is használja a gyorsítótárazott eszközt, amíg a gyorsítótár élettartama le nem jár. Végül az olyan nyelvek, mint a CoffeeScript, a Sass, a Less és az Erb megkönnyítették a Javascript és a CSS szervezését és írását, de a böngésző nem tudja közvetlenül értelmezni őket, ezért előprocesszorra van szükség ahhoz, hogy ezeket a fájlokat megfelelő megfelelőikké alakítsák, mielőtt elküldenék őket a böngészőbe.
az eszközvezeték jóindulatában képes megoldani a fenti problémákat, ha megfelelően használják. Több eszközt össze tud állítani egybe, kicsinyítheti és tömörítheti az eszközöket, biztosítja az eszközök emésztését a gyorsítótárazási problémák elkerülése érdekében, és előfeldolgozhatja az alternatív nyelveket, és Javascript és CSS formátumba fordíthatja őket.
ez a bejegyzés az eszközvezetékkel kapcsolatos különféle témákat ölel fel:
- az alapok, hogyan kell használni a asset pipeline
- legjobb gyakorlatok strukturálása hol tegye az eszközök
- hogyan kell használni az előfordított tömb, hogy milyen fájlokat dolgozza fel az asset pipeline
- hogyan Sass és Coffeescript lehet tőkeáttételes
- hogyan kell használni a Rails asset helper módszerek, és
- néhány gotcha
alapvető használat
az eszközvezeték használatának két alapvető módja van:
- amikor egy szervert fejlesztési módban futtat, automatikusan előre feldolgozza és előkészíti az eszközöket menet közben.
- termelési módban valószínűleg az eszközök előfeldolgozására, verziószámozására, tömörítésére és fordítására fogja használni. Ezt a következő parancs futtatásával teheti meg:
1 |
|
ez (alapértelmezés szerint) egy assets
könyvtárat hoz létre a public/
mappában. Ezután hozzáadja az összes tömörített és lefordított fájlt a könyvtárba, a megfelelő formátumokban és az új emésztett verziókkal. Ezután beállíthatja az Nginx-et vagy az Apache-t, hogy közvetlenül kiszolgálhassa ezeket a fájlokat, így a Rails-nek nem kell kézbesítenie őket (és futtatnia kell az on-the-fly előfeldolgozást stb.) magát.
ne feledje, hogy az alapértékek megváltoztathatók, ezért ha a dolgok nem a várt módon működnek, ellenőrizze az alkalmazás konfigurációs fájlját a config/application.rb
mezőben. A Rails 4-ben az Eszközkezelés jellemzően config/initializers/assets.rb
– ben van konfigurálva.
fájlszerkezet
fontos, hogy az eszközöket érthető módon rendezze, és megkönnyítse az eszközfolyamat meglévő funkcióit. Az első dolog, amit tudnod kell, hogy az összes egyéni Javascript, stíluslapok és képek kell menni a app/assets/
könyvtárban. Alapértelmezés szerint van egy mappa a javascripts
, stylesheets
és images
számára. Az ilyen típusú eszközök fonts
, audios
és videos
könyvtárához hozzáadhatja a app/assets/
könyvtárat is. Minden harmadik féltől származó kód, amelyet használ(pl.js, stb.) a vendor/assets/
könyvtárba kell helyezni:
1234567891011 |
|
mivel a webkiszolgáló automatikusan a public/
könyvtár statikus fájljait fogja kiszolgálni, miért ne helyezné oda az összes Javascript, kép és stíluslap kelléket? Először is, a public
mappában semmi sem lesz előre feldolgozva, lefordítva vagy tömörítve automatikusan, így az eszközök elhelyezésével teljesen megkerüljük az eszközvezetéket, és elveszítjük az összes előnyét. Amikor eszközöket tesz oda, elveszíti azt a képességét is, hogy könnyen hivatkozhasson rájuk a Rails kódjában. Lehet, hogy van egy nézete, például, amely a következő kóddal rendelkezik:
12345678910 |
|
a második forgatókönyvben (public/images/logo.png
) a webhely csak akkor működik, ha az alapkönyvtárból érkezik. Nem tudja kihasználni a fájl eszközfolyamatának verziószámozását sem.
Előfordítás
lehet, hogy most azon gondolkodik, vajon minden, amit a app/assets/javascripts/
mappába tesz, automatikusan előfordításra kerül-e az alkalmazásához. Szerencsére az eszközfolyamat lehetőséget ad arra, hogy meghatározza, mely fájlokat fordítja le, és milyen sorrendben. Alapértelmezés szerint az alkalmazás.css és alkalmazás.js (vagy azok sass/coffeescript megfelelői), valamint az összes nem Javascript, nem CSS eszközök szerepelnek. Az alkalmazástól eltérő CSS vagy Javascript fájl beillesztése.css és alkalmazás.js, kétféleképpen kell megkövetelnie:
- adja hozzá az előfordított tömbhöz a
config/initializers/assets.rb
(Rails 4) vagy az alkalmazás konfigurációs fájljához (pl.config/application.rb
), vagy a - tartalmazza a fájlt az eszköz jegyzékében vagy annak egyik alfájl jegyzékében.
az első opció így néz ki:
12 |
|
ez az opció a legjobb azoknál a fájloknál, amelyeket csak bizonyos oldalakon érdemes felvenni, másokon nem szabad szerepeltetni. Ha például a webhely egy részét iframe beágyazott widgetként fogja használni, akkor csak a widget.js
és widget.css
vagy hasonló elemeket szeretné használni az oldalon. Ezeket a fájlokat a fentiek szerint hozzá kell adni az előfordított tömbhöz.
a második lehetőség az, hogy mit kell használni a legtöbb időt, és lehetővé teszi a Javascript és CSS fájlokat kell fordítani egy alkalmazás.js és egy alkalmazás.css fájl. A jegyzék az alkalmazandó eszköz tetejére van írva.
a coffeescript-ben így néz ki:
12345 |
|
a fenti manifest tartalmazza a jQuery-t, a Rails jQuery diszkrét szkriptadaptert (jquery_ujs), valamint az aktuális fa összes fájlját (azaz app/assets/javascript/*
). Ne feledje, hogy a require_tree
nem fordítja az eszközöket rekurzív módon könyvtárakon keresztül. Ha van egy fájlmappája, amelyet fel szeretne venni, akkor azt is hozzá kell adnia a jegyzékbe:
1 |
|
még egy manifest direktíva a require_self
, amelyet arra használnak, hogy az aktuális fájl Javascript-jét a lánc azon pontján tartalmazza. A fentiek require_self
– vel .js
fájlba írhatók az alábbiak szerint:
1234567 |
|
a SASS / CSS manifesztek ugyanazt az alapformátumot használják, de a megfelelő megjegyzésstílussal:
123456 |
|
ne feledje, hogy a sass használatakor a @import
szabályt kell használnia a változók és a mixinek előnyeinek kihasználásához, mivel a manifest által összeállított minden fájlnak saját hatóköre van.
legyen óvatos a require_tree
irányelv használatával. A fa eszközei betűrendben szerepelnek, ami azt jelenti, hogy ha egy “a” betűvel kezdődő fájl egy “z” betűvel kezdődő fájltól függ, akkor olyan problémákba ütközhet, ahol a szükséges darabok nem állnak rendelkezésre, amikor a JavaScript a böngésző értékeli. Ez a probléma elkerülhető a megfelelő jQuery(document).ready()
vagy window.onload
őrök használatával, a sorrend manuális megadásával, vagy a fájlok előtagjával, például 01_
, 02_
:
12345 |
|
ne feledje, hogy bármely előre lefordított Javascript vagy CSS fájl tartalmazhat jegyzéket a tetején, így az almappák fájljaival egyszerűsítheti a legfelső szintű jegyzéket.
Sass és Coffescript, and Rails Asset Helpers
a fenti szakaszokban egy kicsit említettem a Sass-t és a Coffeescript-et, de még nem mentem bele, hogy mik azok. Ha már ismeri őket, nyugodtan ugorjon le a “Rails Asset Helpers” szakaszra.
a Sass és a CoffeeScript
a Sass és a Coffeescript olyan nyelvek, amelyek preprocesszorokat használnak a szintaxisuk CSS-re és Javascript-re történő átalakításához. Számos más előre feldolgozott nyelv létezik, mint például a Typescript és a Less, de a Sass és a Coffeescript alapértelmezés szerint a Rails-szel együtt szerepel, és valószínűleg a legnépszerűbbek. Nem megyek bele részletesen itt ezeken a nyelveken, ezért kérjük, nézze meg a fenti linkeket további információkért.
tapasztalatom szerint, míg a Sass és a Coffeescript sok szintaktikai cukrot (szép kódjellemzőket) szolgáltat, az a tény, hogy az előfeldolgozási szakaszban érvénytelen kódokat dobnak ki, elegendő a használatuk igazolásához. A Coffeescript automatikusan becsomagolja a kódot fájlonként, és hozzáadja a var
kulcsszót a helyi változókhoz, így megakadályozza a sok hatókör-fejfájást, amely könnyebben megtörténhet a Vanilla Javascript-ben.
például a következő Coffeescript kód:
12345 |
|
a következő Javascript-re konvertálódik:
1234567891011 |
|
amikor az előfeldolgozó feldolgozza a fájlt, automatikusan becsomagolja a kódot egy névtelen függvénybe ((function() {}).call(this)
), és hozzáadja a var
kulcsszót a state
első használatához. Vegye figyelembe, hogy ha a globális hatókört szeretné használni, akkor ezt a window.
előtaggal kell megadnia.
sokkal több van a Coffeescript-ben, de az automatikus hatókör számomra rendkívül hasznos volt a nehezen megtalálható hibák megelőzésében.
Rails Asset Helpers
egy másik nagyszerű funkció, amelyet csak a Sass használatával érhet el a Rails projektben, az asset path helpers. Ha más eszközökre hivatkozik a Sass-ban, a következő szintaxist használhatja a megfelelő útvonalak megszerzéséhez:
123 |
|
a helpers image-path
, asset-url
és asset-path
is használható. A -url
segítők az utat url()
– val tekerik be.
Erb eszközök
az eszköz csővezeték lehetővé teszi, hogy értékelje erb kódot a CSS és Javascript eszközök utótag a fájlnév.application.js.erb
vagy application.scss.erb
). Bár ez hasznos lehet az eszközútvonalak hozzáadásához a Javascript-hez, összességében nem javaslom ennek a funkciónak a használatát. Egy újabb előfeldolgozási lépést ad a fájlhoz, ezáltal növelve az előfordításhoz szükséges időt. Ez rossz szokásokhoz is vezethet. Lehet, hogy a kísértés, hogy adjunk kódot, hogy nincs értelme a fordítási időben, mint a fordítás Húrok. Ezeket a karakterláncokat csak fordításkor fordították le, így tagadva a fordítás teljes célját. Az ERB Javascript fájlban való használatának egyetlen oka a asset_path
helper használata, amint azt az útmutató tárgyalja.
Asset Pipeline Gotchas
az alábbiakban bemutatunk néhány gotchát és apróságot, amelyek hasznosak lehetnek a Rails alkalmazás eszközeinek fejlesztésében.
- Hogyan adhatok hozzá globális adatokat a Javascript használatához?
- a gon gem lehet használni, hogy helyezze globálisan hatókörű adatokat az oldalra a Javascript fogyasztani. Ez nagyszerű olyan dolgokhoz, mint például az aktuális felhasználói azonosító vagy a Webhely beállításainak megadása.
- hol kell növelni az előfordított tömböt?
- a Rails 4-ben a tömböt
config/initializers/assets.rb
– ben, a Rails 3-ban pedigconfig/application.rb
– ben kell kibővíteni. Eszközök használata.rb vagy alkalmazás.az rb úgy állítja be az előfordított tömböt minden környezethez, hogy ha hozzáad egy környezetet (esetlegstaging
), akkor nem kell az előfordított tömböt kifejezetten az adott új környezethez növelni.- eszközök.rb:
Rails.application.config.assets.precompile += %w( widget.css widget.js )
- alkalmazás.rb:
config.assets.precompile += %w( widget.js widget.css )
- eszközök.rb:
- a Rails 4-ben a tömböt
- mikor kell külön-külön előfordítanom az eszközöket az előfordított tömb bővítésével?
- ezt ritkán kell megtenni. Legtöbbször csak akkor szeretné ezt megtenni, ha az eszköz egyedül szerepel egy speciális oldalon, ahol nem szeretné a többi eszközt, például egy iframe-beágyazott widgetet. Használja az alkalmazást.js és alkalmazás.css nyilvánul meg, hogy húzza az eszközök.
- engedélyeznem kell a sínek statikus fájlok kiszolgálását?
- Igen. Ez követi a Tizenkét tényezős alkalmazás irányelveit, és megakadályozza a hibákat, ha elfelejtette felvenni a fájlt az előfordított tömbbe, vagy ha elfelejtette az előfordítást.
- állítsa be a
config.serve_static_assets = true
értéket a 3.sínben és aconfig.serve_static_files = true
értéket a 4. sínben.
- hogyan biztosíthatom, hogy a Javascript / CSS jól meg van írva?
- a jó minőségű Javascript és CSS (vagy Coffeescript és Sass) írása sok időt és tapasztalatot igényelhet, de egy dolog, ami sokat segített nekem, az a linter használata). Egyes IDE-k, például a Sublime Text, olyan bővítményekkel rendelkeznek, amelyek integrálják a lintereket. Én személy szerint a SublimeLinter csomagot használom. Ha egyszerű Javascript-et és CSS-t fogsz írni, akkor feltétlenül használnod kell egy lintert.
- Hogyan változtathatom meg a könyvtárat, ahol az előre lefordított eszközök kerülnek?
- a
config.asset.prefix
beállítást megváltoztathatja egy másik könyvtárra, például/static
. - módosítsa az eszköz előtagot a
development.rb
– ben, ha nyomon szeretné követni az előre lefordított eszközöket a GIT-ben termelési használatra. - módosítsa az eszköz előtagot globálisan, ha a
/assets
elérési út névteret szeretné használni a vezérlők számára.
- a
- hogyan szolgálhatok statikus eszközöket az Nginx segítségével?
- az alapvető nginx irányelvnek így kell kinéznie (további információkért lásd a Rails útmutató eszközök Előfordítása című részét):
1234567 |
|
- ami nyilvánvaló.YML vagy manifest-.json?
- a manifest.yml (sínek 3) vagy nyilvánvaló-.a JSON (Rails 4) fájlok automatikusan létrejönnek, amikor a kellékeket
rake assets:precompile
– val előfordítja. Információkat tartalmaznak arról, hogy mely fájlokat használja az alkalmazás.
- a manifest.yml (sínek 3) vagy nyilvánvaló-.a JSON (Rails 4) fájlok automatikusan létrejönnek, amikor a kellékeket
- milyen típusú fájlokat nem szabad belefoglalni az eszközfolyamatba?
- általában nagy fájlokat (videókat, nagyszámú PDF-letöltést stb.) egy külön adattárban vagy egy felhő fájlkezelőben, például az AWS S3-ban. A fájlokra ezután hivatkozni lehet az alkalmazásból, de nem kell lerázni a git adattárat.
- Hogyan érhetem el, hogy a Rails 3 eszközök gyorsabban fordítsanak?
- használja az
turbo-sprockets-rails3
drágakövet.
- használja az
- használhatok CDN-t (content delivery network) az eszközeimhez?
- Igen! A digest, vagy ujjlenyomat, utótagja minden eszköz teszi őket dolgozni nagy CDNs. Állítsa be a CDN-t a Rails alkalmazás eszközeinek kiszolgálására, majd állítsa be az
config.action_controller.asset_host
konfigurációt a CDN-nek megfelelő tartományra (példáulconfig.action_controller.asset_host = 'mycdn.fictional-cdn.com'
). A környezeti változók használatát javaslom ennek beállításához:config.action_controller.asset_host = ENV
.
- Igen! A digest, vagy ujjlenyomat, utótagja minden eszköz teszi őket dolgozni nagy CDNs. Állítsa be a CDN-t a Rails alkalmazás eszközeinek kiszolgálására, majd állítsa be az
csomagolása
az eszközvezeték megfelelő használata javíthatja az alkalmazás általános minőségét a teljesítmény, az ellenálló képesség és a kód tisztasága szempontjából. Az eszközvezeték funkcióinak használatával automatikusan leküzdheti a statikus eszközök kódolásával és kézbesítésével kapcsolatos legnagyobb problémákat.