Hvad er Aktivrørledningen
mål
- forstå de 4 hovedtræk ved aktivrørledningen.
- Identificer Aktivstierne
- ved, hvordan Aktivmanifest giver sammenkædning af CSS og JS.
- brug forbehandlingssprog som SASS eller CoffeeScript
- Definer fingeraftryk af aktiver
oversigt
i lang tid behandlede vi JavaScript og CSS som en eftertanke i udviklingen af internetapplikationer. Al vores aktivkode-ting som billeder, stilark og JavaScripts — blev opbevaret i en massiv mappe kaldet public
og serveret uden for rammerne af vores Rails-applikation. Da internettet udviklede sig, gav det ikke længere mening.
asset pipeline er Rails-svaret til styring af stilark, JavaScripts og billeder.
Aktivstier
mange filer går til oprettelse af internetapplikationer. CSS-og JavaScript-filer alene kan være svære at organisere. Hvilke mapper opretter vi? Hvilke filer går hvor? Asset Pipeline giver et svar på dette problem. Vi er nødt til at holde tingene meget organiserede i vores applikation, men ved at opbevare separate filer og mapper for hvert koncept eller kodeenhed har vi 2 problemer.
- Hvordan ved Rails, hvor tingene er? Er kalenderen JS fil i
app/assets/javascripts/calendar.js
ellervendor/javascripts/calendar.js
? - vi ønsker ikke at servere hver fil separat, da dette vil gøre vores sideindlæsning meget langsom. Det giver mening for os at opretholde separate små filer til læsbarhed og organisering, men for bro.ser vil vi hellere smadre alle de små filer sammen og indlæse 1 JS-fil og 1 CSS-fil. Denne proces kaldes sammenkædning.
lad os tale om vores første problem: Hvordan ved Rails, hvor de skal se? Asset Pipeline har et koncept kaldet Asset Paths til håndtering af dette. Ligesom i BASH, hvor vi har en sti-miljøvariabel, der er en kombination af mappestier, er Aktivstien en kombination af mappestier, som skinner kan søge efter aktiver i. Lad os se på et eksempel på, hvordan vores Aktivsti er konfigureret.
Rails.application.config.assets.paths =>
hvis vi lægger et aktiv i en af disse mapper, kan vi få adgang til dem via URL ‘en’ /aktiver ‘ i vores applikation. Hvis du har yderligere mapper, som Rails kan søge efter, kan du føje mapperne til Aktivstien. Dette gøres i filen config/initializers/assets.rb
.
Rails.application.config.assets.paths << "New Path"
vi kan placere aktiver hvor som helst, konfigurere vores Aktivsti og få adgang til dem via en enkelt ‘/aktiver’ URL.
manifester og sammenkædning
nu hvor vi kan lægge filer overalt, Hvordan får vi dem til at blive inkluderet på vores hjemmesider? Asset Pipeline bruger en manifest-fil til at fortælle Rails, hvad de skal indlæse. Denne manifest-fil er en central placering, hvor vi kan liste alle CSS-og JS-filer, som vores applikationsbehov har. Dette er ikke en funktion af JS eller CSS, men snarere aktivpipelinen. Her er et eksempel på, hvordan vores JS manifest-fil ser ud:
File: app/assets/javascripts/application.js
//= require jquery//= require calendar
når du inkluderer manifestfilen i dit layout med javascript_include_tag
, vil aktivpipelinen søge efter alle de filer, der er angivet i Aktivstien. Bemærk, hvordan vi kræver kalender. Denne fil lever i app/assets/javascripts/calendar.js
, men vi angav kun navnet og ikke den fulde sti. Aktivrørledningen søger i alle de konfigurerede stier efter en fil med det navn, vi har angivet.
nu hvor vi løste spørgsmålet om opdagelighed, lad os tale om Sammenkædning. Som vi diskuterede tidligere, ønsker vi ikke at indlæse vores filer i Bro.sereren en efter en. Det er bedre at udføre en overførsel end en masse små overførsler fra vores bro.ser. De manifest-filer, vi konfigurerer i Rails, sammenkæder automatisk de filer, der er anført i dem, til en fil i produktionen. Dette er muligvis ikke den bedste mulighed, når vi udvikler vores applikation, da det kan gøre fejlfinding hårdt. Rails vil dog faktisk tjene hver fil separat, når vi kører i udviklingstilstand. Ingen grund til at gøre noget.
endelig vil kædehjulsdirektiverne, der driver vores aktivmanifest, blive dækket detaljeret senere.
forbehandling
at kunne kombinere filer og indlæse dem fra et sæt foruddefinerede placeringer i vores applikation er en stor fordel ved Aktivrørledningen. Det er kun begyndelsen. Fordi vi indlæser aktiver gennem Rails, kan vi forbehandle filerne ved hjælp af populære sprog som SCSS til at skrive bedre CSS og Coffeescript til cleaner JS. Hvis du laver et aktiv med navnet tema.css.scss, du fortæller asset pipeline til at køre filen gennem SCSS preprocessor før servering tema.css til brugeren. SCSS-forprocessoren samler filen i CSS. Det eneste, vi skulle gøre, var at give den korrekte filtypenavn, .scss
, til filen, og aktivpipelinen ved at køre den gennem SCSS-præprocessoren.
fingeraftryk
den sidste fordel, vi vil tale om, er fingeraftryk, men lad os først tale om det problem, det hjælper os med at løse. Når vi serverer filer til bro.ser, vil de sandsynligvis blive cachelagret for at undgå at hente dem igen i fremtiden. Hvad er caching, du måske spørger?
Caching noget betyder at holde en kopi af en tidskrævende operation lokalt, så du ikke behøver at gentage den dyre operation igen, hvis indgangene og udgangene bliver nøjagtigt de samme. Caches er normalt nøgleværdibutikker, hvor værdien er svaret på den dyre operation, og nøglen er noget, der er unikt for den pågældende vare. Hvis du anmoder om en side fra serveren og derefter anmoder om den samme side fra serveren igen, er den hurtigste måde at få denne anmodning opfyldt på faktisk at opbevare en kopi af det, du fik sidste gang lokalt. Mange af de svar, de får på anmodninger, de har lavet ved hjælp af de overskrifter, der bliver sendt med svaret. Overskrifterne fortæller bro.ser, hvor længe siden forbliver ‘frisk’, før den ‘udløber.’Når siden er udløbet, fremsætter bro.ser en ny anmodning om, at siden opdaterer sin cache. Vi siger, at den hurtigste anmodning er den anmodning, der ikke er fremsat. Det siges også ofte, at cache-ugyldighed er et af de to hårde problemer inden for datalogi, så tænk nøje, når du begynder at cachelagre ting! Caching sparer båndbredde for os og giver et hastighedsforøgelse for brugeren. Dette er fantastisk, indtil du ændrer filen, og du vil have, at alle dine brugere får den nye i stedet for den gamle version, de har gemt i deres bro.ser-cache. Men hvordan kan vi lade bro. ser vide, at vi har ændret filen? Hvis den nye version har samme navn som den gamle version, fortsætter bro.sereren med at bruge den gamle fil fra sin cache. Vi har brug for en måde at ændre filnavnet på, når indholdet ændres, så bro.sere ikke fortsætter med at vise den gamle fil.
fra skinnerne guider Primer
“fingeraftryk er en teknik, der gør navnet på et filnavn afhængigt af indholdet af filen. Når filindholdet ændres, ændres filnavnet også. For indhold, der er statisk eller sjældent ændret, giver dette en nem måde at fortælle, om to versioner af en fil er identiske, selv på tværs af forskellige servere eller implementeringsdatoer.
når et filnavn er unikt og baseret på dets indhold, kan HTTP-overskrifter indstilles til at tilskynde cacher overalt (hvad enten det er på CDNs, på internetudbydere, i netværksudstyr eller i internetsøgere) til at beholde deres egen kopi af indholdet. Når indholdet opdateres, ændres fingeraftrykket. Dette får fjernklienterne til at anmode om en ny kopi af indholdet. Dette er kendt som cache busting.
teknikken tandhjul bruger til fingeraftryk er at tilføje en hash af indholdet til slutningen af filnavnet. Tag for eksempel en CSS-fil med navnet global.css
. Kædehjul vil tilføje hash 908e25f4bf641868d8683022a5b62f54
til slutningen af filnavnet som så:
global-908e25f4bf641868d8683022a5b62f54.css
hvis du tilfældigvis bruger en ældre version af Rails (Rails 2.tidligere var strategien at tilføje en datobaseret forespørgselsstreng til hvert aktiv, der er knyttet til en indbygget hjælper. Dette lignede så:
global.css?1309495796
forespørgselsstrengstrategien har flere ulemper:
- ikke alle caches vil pålideligt cache indhold, hvor filnavnet kun adskiller sig fra forespørgselsparametre.
- Steve Souders anbefaler “at undgå en forespørgselsstreng for cacheable ressourcer.”5-20% af dine anmodninger vil ikke blive cachelagret. Især forespørgselsstrenge fungerer slet ikke med nogle CDN ‘ er til cache-ugyldighed.
- filnavnet kan skifte mellem noder i multi-server-miljøer.
- standard forespørgselsstrengen i Rails 2.H er baseret på modifikationstiden for filerne. Når aktiver implementeres i en klynge, er der ingen garanti for, at tidsstemplerne vil være de samme, hvilket resulterer i, at forskellige værdier bruges afhængigt af hvilken server der håndterer anmodningen.
- for meget cache ugyldiggørelse.
- når statiske aktiver implementeres med hver nye udgivelse af kode, ændres mtime (tid for sidste ændring) af alle disse filer, hvilket tvinger alle fjernklienter til at hente dem igen, selvom indholdet af disse aktiver ikke er ændret.
fingeraftryk løser alle disse problemer ved at sikre, at filnavne er konsistente baseret på deres indhold.
fingeraftryk er som standard aktiveret til produktion og deaktiveret for alle andre miljøer. Du kan aktivere eller deaktivere den i din konfiguration via config.assets.digest
indstillingen.”
konklusion
Aktivrørledningen er bestemt mere kompleks end bare at betjene aktiver fra en offentlig mappe, og det kan være svært at fejle. At lære at bruge det vil betale sig i det lange løb ved at spare os tid og hovedpine. Tænk bare på alle de problemer, det løser for os.
- Aktivstier
- manifester og sammenkædning
- forbehandling
- fingeraftryk
endelig skal du helt sikkert tjekke keynote, hvor DHH introducerer aktivrørledningen.