{"id":492,"date":"2014-09-30T21:35:47","date_gmt":"2014-09-30T19:35:47","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/un-passo-avanti-migliorare-la-performance-con-il-prebrowsing\/"},"modified":"2014-09-30T21:35:47","modified_gmt":"2014-09-30T19:35:47","slug":"un-passo-avanti-migliorare-la-performance-con-il-prebrowsing","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/un-passo-avanti-migliorare-la-performance-con-il-prebrowsing\/","title":{"rendered":"Un passo avanti: migliorare la performance con il prebrowsing"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/09\/sketch302222419.png\" border=\"0\" align=\"left\" \/>Tutti noi vogliamo che i nostri siti siano veloci. Ottimizziamo le immagini, creiamo le sprite CSS, usiamo i CDN, facciamo caching aggressivo, usiamo gzip e minimizziamo il contenuto statico. Usiamo tutti i trucchi da manuale.<\/p>\n<p>Ma possiamo fare ancora di pi\u00f9. Se vogliamo dei risultati pi\u00f9 rapidi, dobbiamo pensare in maniera diversa. E se, invece di lasciare i nostri utenti a fissare una spinning wheel aspettando che venga consegnato il contenuto, potessimo predire dove vorrebbero andare dopo? E se potessimo avere quel contenuto pronto per loro ancora prima che lo chiedano?<\/p>\n<p>Tendiamo a vedere il web come un modello reattivo, in cui ogni azione causa una reazione. Gli utenti cliccano e poi noi li portiamo a una nuova pagina. Cliccano di nuovo e noi apriamo un&#8217;altra pagina. Ma possiamo fare di meglio. Possiamo essere proattivi con il prebrowsing.<\/p>\n<div class=\"paragrafo\">\n<h2>Le tre grandi tecniche<\/h2>\n<p>Steve Souders ha coniato il termine prebrowsing (da <em>predictive browsing<\/em>) in uno dei suoi <a href=\"http:\/\/www.stevesouders.com\/blog\/2013\/11\/07\/prebrowsing\/\">articoli<\/a> alla fine dello scorso anno. Il prebrowsing consiste nell&#8217;anticipare dove gli utenti vogliono andare e nel preparare quel contenuto in anticipo. \u00c8 un grande passo verso un internet pi\u00f9 veloce e meno visibile.<\/p>\n<p>I browser possono analizzare i pattern per prevedere dove gli utenti andranno successivamente e dare inizio alla risoluzione del DNS e ai TCP handshakes non appena gli utenti passano sopra ai link. Ma per ottenere il massimo da questi miglioramenti, possiamo abilitare il prebrowsing sulle nostre pagine web con tre tecniche a nostra disposizione:<\/p>\n<ul>\n<li>DNS prefetching<\/li>\n<li>Resource prefetching<\/li>\n<li>Prerendering<\/li>\n<\/ul>\n<p>Esaminiamo ciascuna di queste separatamente.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>DNS prefetching<\/h2>\n<p>Ogni volta che sappiamo che i nostri utenti probabilmente richiederanno una risorsa da un dominio diverso da quello del nostro sito, possiamo usare il DNS prefetching per riscaldare i motori delle macchine che apriranno il nuovo URL. Il browser pu\u00f2 pre-risolvere in anticipo il DNS per il nuovo dominio, facendo risparmiare diversi millisecondi quando l&#8217;utente effettivamente lo richieder\u00e0. Stiamo giocando d&#8217;anticipo e preparandoci per un&#8217;azione.<\/p>\n<p>I browser moderni sono molto bravi nel fare il parsing delle pagine, guardando avanti per pre-risolvere tutti i domini necessari in anticipo. Chrome si spinge cos\u00ec in l\u00e0 da tenere un elenco con tutti i domini collegati ogni volta che un utente visita un sito, li pre-risolve quando l&#8217;utente ritorna (potete vedere questo elenco navigando su chrome:\/\/dns\/ nel vostro browser Chrome). Tuttavia, a volte l&#8217;accesso ai nuovi URL pu\u00f2 essere nascosto dietro ai redirect o incorporato in JavaScript e qui sta la nostra opportunit\u00e0 per aiutare il browser.<\/p>\n<p>Diciamo che stiamo scaricando un insieme di risorse dal dominio cdn.example.com usando una chiamata JavaScript dopo che un utente ha cliccato un pulsante. Normalmente, il browser dovrebbe risolvere il DNS nel momento del click, ma noi possiamo accelerare il processo includendo una direttiva <code>dns-prefetch<\/code> nella sezione <code>head<\/code> della nostra pagina:<\/p>\n<pre><code class=\"markup\">&lt;link rel=\"dns-prefetch\" href=\"http:\/\/cdn.example.com\"&gt;<\/code>\n<\/pre>\n<p>Facendo cos\u00ec si informa il browser dell&#8217;esistenza del nuovo dominio ed esso combiner\u00e0 questo suggerimento con il suo algoritmo di pre-risoluzione per dare inizio alla risoluzione del DNS il prima possibile. L&#8217;intero processo sar\u00e0 pi\u00f9 veloce per l&#8217;utente dal momento che stiamo eliminando dall&#8217;operazione il tempo necessario per la risoluzione del DNS. (Si noti che i browser non garantiscono che la risoluzione del DNS avvenga in anticipo: usano semplicemente il nostro suggerimento come un segnale per il proprio algoritmo interno di pre-risoluzione.)<\/p>\n<p>Ma esattamente, quanto rende pi\u00f9 rapide le cose la pre-risoluzione del DNS? Nel vostro browser Chrome, aprite chrome:\/\/histograms\/DNS e cercate DNS.PrefetchResolution. Vedrete una tabella come questa:<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/09\/fig1-o.jpg\" border=\"0\" alt=\"Istogramma per DNS.PrefetchResolution\" width=\"100%\" \/><\/div>\n<p>Questo istogramma mostra la mia personale distribuzione di latenze per le richieste di DNS prefetch. Sul mio computer, per 335 campioni, il tempo medio \u00e8 88 millisecondi, con una media di circa 60 millisecondi. Eliminare 88 millisecondi da tutte le richieste che il nostro sito fa verso un dominio esterno? \u00c8 qualcosa da celebrare!<\/p>\n<p>Ma cosa succede se l&#8217;utente non clicca mai sul pulsante per accedere al dominio cdn.example.com? Non stiamo pre-risolvendo inutilmente un dominio? Lo stiamo facendo, ma fortunatamente per noi, il DNS prefetching \u00e8 un&#8217;operazione davvero a basso costo: il browser dovr\u00e0 mandare solo poche centinaia di byte sulla rete, quindi il rischio che ci assumiamo facendo una ricerca DNS preventiva \u00e8 molto basso. Detto ci\u00f2, non eccedete nell&#8217;uso di questa feature: fate il prefetch solo dei domini di cui siete piuttosto sicuri che l&#8217;utente vorr\u00e0 accedervi e lasciate che il browser gestisca il resto.<\/p>\n<p>Cercate situazioni che possano essere ottime candidate per l&#8217;introduzione del DNS prefetching sul vostro sito:<\/p>\n<ul>\n<li>Risorse su domini diversi nascosti dietro a dei redirect 301<\/li>\n<li>Risorse a cui si accede mediante codice JavaScript<\/li>\n<li>Risorse per statistiche e social sharing (che solitamente provengono da domini diversi)<\/li>\n<\/ul>\n<p>Il DNS prefetching \u00e8 attualmente supportato su <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ie\/dn265039(v=vs.85).aspx\">IE11<\/a>, <a href=\"http:\/\/www.chromium.org\/developers\/design-documents\/dns-prefetching\">Chrome<\/a>, Chrome Mobile, Safari, <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Controlling_DNS_prefetching\">Firefox<\/a> e Firefox Mobile, il che rende molto diffusa questa feature tra i browser attuali. I browser che attualmente non supportano il DNS prefetching ignoreranno semplicemente il suggerimento e la risoluzione del DNS avver\u00e0 in maniera regolare.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Resource prefetching<\/h2>\n<p>Possiamo spingerci un po&#8217; pi\u00f9 in l\u00e0 e prevedere che i nostri utenti apriranno una pagina specifica del nostro sito. Se conosciamo alcune delle risorse critiche utilizzate da questa pagina, possiamo istruire il browser a fare il prefetch di queste in anticipo:<\/p>\n<pre>        <code>&lt;link rel=\"prefetch\" href=\"http:\/\/cdn.example.com\/library.js\"&gt;<\/code>\n    <\/pre>\n<p>Il browser user\u00e0 questa istruzione per fare il prefetch delle risorse indicate e le memorizzer\u00e0 nella cache locale. In questo modo, non appena le risorse saranno in effetti necessarie, il browser le avr\u00e0 l\u00ec pronte da mandare.<\/p>\n<p>A differenza del DNS prefetching, il resource prefetching \u00e8 un&#8217;operazione pi\u00f9 costosa: state attenti a come e dove la utilizzate. Il prefetch delle risorse pu\u00f2 accelerare i nostri siti in modi che non otteremo mai semplicemente facendo il prefetch dei nuovi domini, ma se ne abusiamo, i nostri utenti pagheranno un overhead per qualcosa che non useranno.<\/p>\n<p>Diamo un&#8217;occhiata alla dimensione della risposta media di alcune tra le pi\u00f9 popolari risorse su una pagina web, cortesemente offerte da <a href=\"http:\/\/httparchive.org\/interesting.php#responsesizes\">HTTP Archive<\/a>:<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/09\/fig2-o.jpg\" border=\"0\" alt=\"Grafico della dimensione di risposta media delle risorse di una pagina web\" width=\"100%\" \/><\/div>\n<p>In media, fare il prefetch di un file di script (come facciamo nell&#8217;esempio di cui sopra) causer\u00e0 la trasmissione di 16kB sulla rete (senza includere la dimensione della richiesta stessa). Questo significa che risparmieremo dal processo 18kB dal tempo di download, pi\u00f9 il tempo di risposta del serve, che \u00e8 stupefacente, sempre che l&#8217;utente vi acceda poi dopo. Se l&#8217;utente non accede mai al file, potremmo in effetti rendere l&#8217;intero workflow pi\u00f9 lento introducendo un delay non necessario.<\/p>\n<p>Se decidete di usare questa tecnica, fate il prefetch solo delle risorse pi\u00f9 importanti e assicuratevi che il browser le possa mettere in cache. Di solito, le immagini, i CSS, i JavaScript e i files dei font sono buoni candidati per il prefetching, ma le HTML response non lo sono dal momento che non le si pu\u00f2 mettere in cache.<\/p>\n<p>Ecco alcune situazioni in cui, data la probabilit\u00e0 che l&#8217;utente visiti una pagina specifica, potete fare in anticipo il prefetch delle risorse:<\/p>\n<ul>\n<li>Su una pagina di login, dal momento che gli utenti vengono solitamente rediretti a una pagina di benvenuto o a una dashboard dopo aver fatto il login.<\/li>\n<li>In ogni pagina di un questionario lineare o di un workflow di un sondaggio, in cui gli utenti visitano pagine in sequenza con un ordine preciso.<\/li>\n<li>Su un&#8217;animazione multi-step, dato che sapete in anticipo quali sono le immagini necessarie nelle scene successive.<\/li>\n<\/ul>\n<p>Il resource prefetching attualmente \u00e8 supportato in <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ie\/dn265039(v=vs.85).aspx\">IE11<\/a>, <a href=\"https:\/\/developers.google.com\/chrome\/whitepapers\/prerender?csw=1\">Chrome<\/a>, Chrome Mobile, <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Link_prefetching_FAQ\">Firefox<\/a> e Firefox Mobile. (Per determinare la compatibilit\u00e0 del browser potete fare un testare velocemente il browser su <a href=\"http:\/\/prebrowsing.com\">prebrowsing.com<\/a>.)<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Prerendering<\/h2>\n<p>Perch\u00e9 non ci spingiamo oltre e chiediamo un&#8217;intera pagina? Supponiamo di essere <em>totalmente<\/em> sicuri che i nostri utenti visiteranno la pagina about.html del nostro sito. Possiamo dare questo suggerimento al browser:<\/p>\n<pre>        <code>&lt;link rel=\"prerender\" href=\"http:\/\/example.com\/about.html\"&gt;<\/code>\n    <\/pre>\n<p>Questa volta il browser scaricher\u00e0 in anticipo e visualizzer\u00e0 la pagina in background, cos\u00ec da averla pronta per l&#8217;utente non appena la chieder\u00e0. La transizione dalla pagina corrente a quella pre-visualizzata sarebbe istantanea.<\/p>\n<p>Non \u00e8 necessario dire che il prerendering \u00e8 la tecnica pi\u00f9 rischiosa e costosa delle tre. Farne cattivo uso pu\u00f2 causare grossi sprechi di banda specialmente dannosi per gli utenti sui dispositivi mobile. Per illustrare ci\u00f2, diamo un&#8217;occhiata a questo grafico, ancora per gentile concessione di <a href=\"http:\/\/httparchive.org\/trends.php#bytesTotal&amp;reqTotal\">HTTP Archive<\/a>:<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/09\/fig3-o.jpg\" border=\"0\" alt=\"Grafico della dimensione di trasferimento totale e delle richieste totali per visualizzare una pagina web\" width=\"100%\" \/><\/div>\n<p>Nel giugno di quest&#8217;anno, il numero medio di richieste per rendere una pagina web era 96, con una dimensione totale di 1.808kB. Quindi, se il vostro utente alla fine accede alla pagina pre-visualizzata, allora avrete fatto jackpot: risparmierete il tempo di download di quasi 2.000kB, pi\u00f9 il tempo di risposta del server. Ma se vi sbagliate e il vostro utente non accede mai alla pagina pre-visualizzata, gli farete pagare un prezzo molto alto.<\/p>\n<p>Quando dovete decidere se fare in anticipo il prerendering di intere pagine, considerate che Google fa il prerendering dei primi risultati delle sue pagine di ricerca e che Chrome fa la pre-visualizzazione delle pagine basandosi sui pattern della cronologia di navigazione degli utenti. Usando lo stesso principio, potete determinare i pattern di uso comuni e di conseguenza fare il prerender di alcune pagine selezionate. Potete anche usarlo, proprio come il resource prefetching, nei questionari e nei sondaggi in cui sapete che gli utenti completeranno il workflow seguendo un ordine particolare.<\/p>\n<p>Al momento, il prerendering \u00e8 supportato solo in <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ie\/dn265039(v=vs.85).aspx\">IE11<\/a>, <a href=\"https:\/\/developers.google.com\/chrome\/whitepapers\/prerender?csw=1\">Chrome<\/a> e Chrome Mobile. N\u00e9 Firefox n\u00e9 Safari hanno ancora aggiunto il supporto per questa tecnica (e, come per il resource prefetching, potete controllare <a href=\"http:\/\/prebrowsing.com\">prebrowsing.com<\/a> per verificare se questa tecnica sia supportata nel vostro browser).<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Conclusioni<\/h2>\n<p>Siti come <a href=\"http:\/\/googlewebmastercentral.blogspot.com\/2011\/06\/announcing-instant-pages.html\">Google<\/a> e <a href=\"http:\/\/blogs.bing.com\/search\/2013\/10\/14\/a-deeper-look-at-task-completion\/\">Bing<\/a> utilizzano ampiamente queste tecniche per rendere istantanee le ricerche per i propri utenti. Adesso \u00e8 ora che torniamo sui nostri siti e li esaminiamo di nuovo. Possiamo rendere migliori e pi\u00f9 rapide le nostre esperienze con il prefetching e il prerendering?<\/p>\n<p>I browser stanno gi\u00e0 lavorando dietro le quinte per rendere la navigazione quanto pi\u00f9 veloce possibile, cercando dei pattern nei nostri siti. Il prebrowsing poggia su queste fondamenta: possiamo combinare i dati che abbiamo derivanti dalle nostre pagine con ulteriori analisi dei pattern degli utenti. Aiutando i browser a fare un lavoro migliore, acceleriamo e miglioriamo l&#8217;esperienza dei nostri utenti.<\/p>\n<p>Illustrazioni: {carlok}<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Vogliamo siti web pi\u00f9 veloci e i browser ci aiutano a raggiungere questo obiettivo, ricercando pattern di navigazione degli utenti, analizzandone i comportamenti e facendo supposizioni su dove potrebbero cliccare successivamente. Ma noi conosciamo meglio sia i nostri siti sia i nostri utenti e possiamo usare questi dati per far lavorare i browser in maniera proattiva. Il predictive browsing mette in coda le risorse ancora prima che gli utenti le richiedano, creando un&#8217;esperienza pi\u00f9 veloce e senza intoppi. Santiago Valdarrama esamina costi e benefici di tre tecniche a nostra disposizione per il prebrowsing.<\/p>\n","protected":false},"author":818,"featured_media":7000744,"comment_status":"open","ping_status":"open","template":"","categories":[242,247,118],"tags":[],"coauthors":[430],"class_list":["post-492","article","type-article","status-publish","has-post-thumbnail","hentry","category-browser","category-html","category-numero-101-1-ottobre-2013"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=492"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000744"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=492"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}