Ruby on Rails
Turbolinks
Zoeken…
Invoering
Turbolinks is een JavaScript-bibliotheek waarmee u sneller door uw webtoepassing kunt navigeren. Wanneer u een link volgt, haalt Turbolinks automatisch de pagina op, wisselt deze in <body> en voegt de <head> samen, allemaal zonder de kosten van een volledige pagina-lading.
Opmerkingen
Als railontwikkelaar zult u waarschijnlijk minimaal interageren met turbolinks tijdens uw ontwikkeling. Het is echter een belangrijke bibliotheek om mee bekend te zijn, omdat het de oorzaak kan zijn van enkele moeilijk te vinden bugs.
Belangrijkste leerpunten:
- Binden aan de
turbolinks:load
gebeurtenisturbolinks:load
plaats van de gebeurtenisdocument.ready
- Gebruik het kenmerk
data-turbolinks-false
om de turbolink-functionaliteit per link uit te schakelen. - Gebruik het kenmerk
data-turbolinks-permanent
om elementen aan te houden tijdens het laden van pagina's en om cache-gerelateerde bugs te voorkomen.
Bezoek de officiële github-repository voor een meer diepgaande behandeling van turbolinks.
Veel van deze documentatie gaat naar de mensen die de turbolinks-documentatie in de github-repository hebben opgesteld.
Binden aan turbolink's concept van een pagina laden
Met turbolinks, de traditionele benadering van het gebruik van:
$(document).ready(function() {
// awesome code
});
zal niet werken. Tijdens het gebruik van turbolinks wordt de gebeurtenis $(document).ready()
slechts één keer geactiveerd: bij de eerste pagina-laading. Vanaf dat moment, wanneer een gebruiker op een link op uw website klikt, zal turbolinks de link click-gebeurtenis onderscheppen en een Ajax-verzoek indienen om de tag <body> te vervangen en de tags <head> samen te voegen. Het hele proces veroorzaakt het idee van een "bezoek" in turbolinksland. Daarom, in plaats van de traditionele syntaxis van document.ready()
hierboven te gebruiken, moet u zich als volgt binden aan het bezoekgebeurtenis van turbolink:
// pure js
document.addEventListener("turbolinks:load", function() {
// awesome code
});
// jQuery
$(document).on('turbolinks:load', function() {
// your code
});
Schakel turbolinks uit op specifieke links
Het is heel eenvoudig om turbolinks op specifieke links uit te schakelen. Volgens de officiële documentatie van turbolinks :
Turbolinks kunnen per link worden uitgeschakeld door een link of een van de voorouders te annoteren met data-turbolinks = "false".
Voorbeelden:
// disables turbolinks for this one link
<a href="/" data-turbolinks="false">Disabled</a>
// disables turbolinks for all links nested within the div tag
<div data-turbolinks="false">
<a href="/">I'm disabled</a>
<a href="/">I'm also disabled</a>
</div>
// re-enable specific link when ancestor has disabled turbolinks
<div data-turbolinks="false">
<a href="/">I'm disabled</a>
<a href="/" data-turbolinks="true">I'm re-enabled</a>
</div>
Inzicht in toepassingsbezoeken
Applicatiebezoeken worden gestart door op een Turbolinks-compatibele link te klikken, of programmatisch door te bellen
Turbolinks.visit(location)
Standaard gebruikt de bezoekfunctie de actie 'doorgaan'. Het is begrijpelijker dat het standaardgedrag voor de bezoekfunctie is om door te gaan naar de pagina die wordt aangegeven met de parameter "locatie". Wanneer een pagina wordt bezocht, duwt turbolinks een nieuw item in de geschiedenis van de browser met behulp van history.pushState
. De geschiedenis is belangrijk omdat turbolinks de geschiedenis probeert te gebruiken om pagina's indien mogelijk uit de cache te laden. Dit zorgt voor een extreem snelle paginaweergave voor vaak bezochte pagina's.
Als u echter een locatie wilt bezoeken zonder geschiedenis op de stapel te plaatsen, kunt u de actie 'vervangen' in de bezoekfunctie als volgt gebruiken:
// using links
<a href="/edit" data-turbolinks-action="replace">Edit</a>
// programatically
Turbolinks.visit("/edit", { action: "replace" })
Hiermee wordt de bovenkant van de geschiedenisstapel vervangen door de nieuwe pagina, zodat het totale aantal items op de stapel ongewijzigd blijft.
Er is ook een "herstel" -actie die helpt bij het herstellen van bezoeken , de bezoeken die plaatsvinden als de gebruiker op de vooruit- of terugknop in zijn browser klikt. Turbolinks verwerkt dit soort evenementen intern en beveelt gebruikers aan niet handmatig te knoeien met het standaardgedrag.
Bezoeken annuleren voordat ze beginnen
Turbolinks biedt een gebeurtenislistener die kan worden gebruikt om bezoeken te stoppen. Luister naar de turbolinks:before-visit
gebeurtenis turbolinks:before-visit
om op de hoogte te worden gesteld wanneer een bezoek gaat beginnen.
In de gebeurtenishandler kunt u het volgende gebruiken:
// pure javascript
event.data.url
of
// jQuery
$event.originalEvent.data.url
om de locatie van het bezoek op te halen. Het bezoek kan vervolgens worden geannuleerd door te bellen naar:
event.preventDefault()
NOTITIE:
Volgens de officiële documenten van turbolinks :
Restauratiebezoeken kunnen niet worden geannuleerd en ontbranden geen turbolinks: vóór bezoek.
Aanhoudende elementen bij het laden van pagina's
Overweeg de volgende situatie: Stel u voor dat u de ontwikkelaar bent van een sociale media-website waarmee gebruikers vrienden kunnen worden met andere gebruikers en die turbolinks gebruikt om het laden van pagina's sneller te maken. Rechtsboven op elke pagina op de site staat een nummer dat het totale aantal vrienden aangeeft dat een gebruiker momenteel heeft. Stel je voor dat je je site gebruikt en dat je 3 vrienden hebt. Wanneer een nieuwe vriend wordt toegevoegd, is er een javascript actief dat de vriendenteller bijwerkt. Stel je voor dat je zojuist een nieuwe vriend hebt toegevoegd en dat je javascript correct is uitgevoerd en het aantal vrienden rechtsboven op de pagina heeft bijgewerkt om nu 4 weer te geven. Stel je nu voor dat je op de knop Terug van de browser klikt. Wanneer de pagina wordt geladen, merk je dat de vriendenteller 3 zegt, ook al heb je vier vrienden.
Dit is een relatief veel voorkomend probleem en een probleem waarvoor turbolinks een oplossing heeft geboden. De reden voor het probleem is dat turbolinks automatisch pagina's uit de cache laadt wanneer een gebruiker op de knop Terug klikt. De in het cachegeheugen opgeslagen pagina wordt niet altijd bijgewerkt met de database.
Om dit probleem op te lossen, stel je voor dat je het aantal vrienden in een <div> -tag met het ID "aantal vrienden" laat staan:
<div id="friend-count" data-turbolinks-permanent>3 friends</div>
Door het data-turbolinks-permanent
attribuut toe te voegen, vertel je turbolinks bepaalde elementen te behouden bij het laden van pagina's. De officiële documenten zeggen :
Wijs permanente elementen aan door ze een HTML-id te geven en ze te annoteren met data-turbolinks-permanent. Voor elke weergave vergelijkt Turbolinks alle permanente elementen op id en draagt ze over van de oorspronkelijke pagina naar de nieuwe pagina, waarbij hun gegevens en gebeurtenisluisteraars worden bewaard.