{"id":7001037,"date":"2019-04-23T08:14:16","date_gmt":"2019-04-23T08:14:16","guid":{"rendered":"https:\/\/alistapart.com\/it\/?post_type=article&#038;p=7001037"},"modified":"2019-10-23T09:56:35","modified_gmt":"2019-10-23T09:56:35","slug":"javascript-responsabile-parte-prima","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/javascript-responsabile-parte-prima\/","title":{"rendered":"JavaScript Responsabile: parte prima"},"content":{"rendered":"\n<p>Stando ai numeri, <a href=\"https:\/\/httparchive.org\/reports\/state-of-javascript#bytesJs\">JavaScript \u00e8 un peso in termini di performance<\/a>. Se questo trend persiste, a breve, la pagina media invier\u00e0 almeno 400 KB di JS e questo \u00e8 a malapena quello che viene <em>trasferito<\/em>. Come altre risorse basate su testo, JavaScript \u00e8 quasi sempre inviato compresso, ma ci\u00f2 potrebbe essere l&#8217;unica cosa consistente riguardo al suo invio.<\/p>\n\n\n\n<p>Sfortunatamente, sebbene ridurre il resource transfer time \u00e8 una parte importante dell&#8217;intera questione della performance, la compressione non ha effetti sul tempo impiegato dai browser per processare uno script una volta che arriva nella sua interezza. Se un server invia 400 KB di JavaScript compresso, la quantit\u00e0 effettiva che i browser devono processare dopo la decompressione \u00e8 pi\u00f9 di un megabyte. Quando bene i device gestiscano questi carichi pesanti dipende, beh, dal <em>device<\/em>. <a href=\"https:\/\/medium.com\/@addyosmani\/the-cost-of-javascript-in-2018-7d8950fbb5d4\">\u00c8 stato scritto molto<\/a> su quanto siano abili i vari device nel processare molto JavaScript, ma la verit\u00e0 \u00e8 che la quantit\u00e0 di tempo che occorre per processarne anche una quantit\u00e0 trascurabile varia enormemente tra device.<\/p>\n\n\n\n<p>Prendete, per esempio, questo <a href=\"https:\/\/devmode.jeremy.codes\/\">mio progetto buttato l\u00ec tanto per fare<\/a>, che invia circa 23 KB di JavaScript non compresso. Su un MacBook Pro mid-2017, Chrome si pappa questo piccolo carico in circa 25 ms. Tuttavia, su un <a href=\"https:\/\/www.gsmarena.com\/nokia_2-8513.php\">telefono Nokia 2 Android<\/a>, questo tempo schizza a 190 ms. Non \u00e8 una quantit\u00e0 di tempo insignificante, ma in ciascun caso, la pagina diventa interattiva in un tempo ragionevolmente veloce.<\/p>\n\n\n\n<p>Adesso la grande domanda: come pensate che si comporter\u00e0 quel piccolo Nokia 2 con la pagina media? Soffoca. Anche su una connessione veloce, usarlo per navigare nel web lo fa diventare un esercizio di pazienza dato che le pagine web piene zeppe di JavaScript lo rendono simile a un mattone per la maggior parte del tempo.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/alistapart.com\/wp-content\/uploads\/2019\/04\/fig-01-2x.png?w=960\" alt=\"A performance timeline for a JavaScript-heavy website. Most of the timeline is JavaScript.\" class=\"wp-image-6000652\" \/><figcaption><em>Figura 1.  <\/em>Una panoramica della performance timeline di un telefono Nokia 2 Android mentre naviga su una pagina in cui del JavaScript eccessivo monopolizza il thread principale.<\/figcaption><\/figure>\n\n\n\n<p>Sebbene sia i device sia le reti su cui navigano siano in continuo miglioramento, ci stiamo mangiando quei guadagni, come suggeriscono i trend. Dobbiamo usare JavaScript <em>responsabilmente<\/em>. E si comincia dal comprendere <em>quello<\/em> che stiamo creando cos\u00ec come <em>il modo<\/em> in cui lo stiamo creando.&lt;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section1\">La forma mentale di \u201csiti\u201d vs. \u201capp\u201d<\/h2>\n\n\n\n<p>La terminologia a volte \u00e8 strana: identifichiamo genericamente cose con termini inaccurati il cui significato \u00e8 compreso da tutti. A volte sovraccarichiamo il termine \u201cape\u201d per indicare anche \u201cvespa\u201d, nonostante le differenze tra api e vespe siano sostanziali, a tal punto da indurvi a gestire ciascuna delle due in maniera diversa. Per esempio, dovreste distruggere un nido di vespe, ma dal momento che le api sono insetti incredibilmente benefici e vulnerabili, potremmo optare per una ricollocazione del loro nido.<\/p>\n\n\n\n<p>Potremmo essere altrettanto rapidi e approssimativi nello scambiare i termini \u201cwebsite\u201d e \u201cweb app\u201d. Le differenze tra i due sono meno chiare di quelle tra vespe e api, ma fonderli pu\u00f2 portare a risultati dolorosi, derivanti dalle possibilit\u00e0 che ci concediamo quando qualcosa \u00e8 semplicemente un \u201csito web\u201d rispetto a quando \u00e8 una \u201cweb app\u201d completa. Se state facendo un sito web informativo per un&#8217;azienda, ci saranno meno probabilit\u00e0 che vi appoggerete a un potente framework per gestire i cambiamenti nel DOM o per implementare il routing client-side, almeno <em>spero<\/em>. Usare tools cos\u00ec poco adatti per questo compito non solo sarebbe dannoso per le persone che usano il sito ma probabilmente anche meno produttivo.<\/p>\n\n\n\n<p>Quando realizziamo una web <em>app<\/em>, per\u00f2, <em>dobbiamo stare attenti<\/em>. Stiamo installando dei package che danno inizio a centinaia, se non <em>migliaia<\/em>, di dipendenze, <a href=\"https:\/\/snyk.io\/blog\/malicious-code-found-in-npm-package-event-stream\/\">alcune delle quali<\/a> non sappiamo nemmeno se siano sicure. Stiamo anche scrivendo delle configurazioni complicate per i module bundlers. In questo tipo di ambiente di sviluppo delirante ma tuttavia onnipresente, occorre conoscere e stare attenti per essere sicuri che quello che viene creato sia veloce e accessibile. Se dubitate di ci\u00f2, eseguite <a href=\"https:\/\/docs.npmjs.com\/cli\/ls.html#prod--production\"><code>npm ls --prod<\/code><\/a> nella root directory del vostro progetto e <a href=\"https:\/\/gist.github.com\/malchata\/dae0a011033846e2cb44d315b0496f0d\">vedete se riconoscete tutto quello che c&#8217;\u00e8 nell&#8217;elenco.<\/a> Anche in caso affermativo, questo comando non include gli script di terze parti, e sono sicuro che il vostro sito ne ha almeno qualcuno.<\/p>\n\n\n\n<p>Quello che tendiamo a dimenticare \u00e8 che l&#8217;ambiente occupato da website e web app \u00e8 unico ed \u00e8 lo stesso. Entrambe sono soggetti alle <em>stesse pressioni ambientali<\/em> imposte dall&#8217;ampio spettro di reti e device. Questi vincoli non svaniscono improvvisamente quando decidiamo di chiamare \u201capp\u201d quello che creiamo, n\u00e9 i telefoni dei nostri utenti guadagnano nuovi poteri magici quando lo facciamo.<\/p>\n\n\n\n<p>\u00c8 nostra responsabilit\u00e0 valutare chi usa quello che realizziamo e accettare che le condizioni sotto le quali accedono a internet possano essere diverse da quello che abbiamo supposto. Dobbiamo conoscere il risultato che stiamo cercando di offrire e solo <em>allora<\/em> potremo creare qualcosa che mirabilmente miri a quello scopo, <a href=\"https:\/\/css-tricks.com\/simple-boring\/\">anche se non \u00e8 esaltante da realizzare<\/a>.<\/p>\n\n\n\n<p>Ci\u00f2 significa rivalutare la nostra dipendenza da JavaScript e come il suo uso, in particolare quando esclude HTML e CSS, pu\u00f2 tentarci ad adottare pattern insostenibili che danneggiano performance e accessibilit\u00e0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section2\">Non permettete ai framework di forzarvi ad usare pattern insostenibili<\/h2>\n\n\n\n<p>Sono stato testimone di alcune strane scoperte nelle codebase mentre lavoravo con dei team che dipendevano dai framework per poter essere altamente produttivi. Una caratteristica comune a molti di loro \u00e8 la scarsa accessibilit\u00e0 e i pessimi pattern di performance che spesso ne derivano. Prendete, per esempio, il componente React qui sotto:<\/p>\n\n\n\n<pre class=\"wp-block-code language-javascript\"><code>import React, { Component } from \"react\";\nimport { validateEmail } from \"helpers\/validation\";\n\nclass SignupForm extends Component {\n  constructor (props) {\n    super(props);\n\n    this.handleSubmit = this.handleSubmit.bind(this);\n    this.updateEmail = this.updateEmail.bind(this);\n    this.state.email = \"\";\n  }\n\n  updateEmail (event) {\n    this.setState({\n      email: event.target.value\n    });\n  }\n\n  handleSubmit () {\n    \/\/ If the email checks out, submit\n    if (validateEmail(this.state.email)) {\n      \/\/ ...\n    }\n  }\n\n  render () {\n    return (\n      <div>\n        <span class=\"email-label\">Enter your email:<\/span>\n        \n        <button>Sign Up<\/button>\n      <\/div>\n    );\n  }\n}<\/code><\/pre>\n\n\n\n<p>Ci sono chiaramente dei problemi di accessibilit\u00e0 qui:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Una form che non usa l&#8217;elemento <code>&lt;form&gt;<\/code> <em>non<\/em> \u00e8 una form. In effetti, potreste nasconderlo specificando <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Roles\/Form_Role\"><code>role=\"form\"<\/code><\/a> nel <code>&lt;div&gt;<\/code> padre, ma se state creando una form, e questa <em>ne ha tutto l&#8217;aspetto<\/em>, usate un elemento <code>&lt;form&gt;<\/code> con gli appropriati attributi <code>action<\/code> e <code>method<\/code>. L&#8217;attributo <code>action<\/code> \u00e8 cruciale, dal momento che assicura che la form far\u00e0 ancora <em>qualcosa<\/em> in assenza di JavaScript, posto, ovviamente, che il componente sia server-rendered.<\/li><li>Uno <code>&lt;span&gt;<\/code> non \u00e8 un sostituto per l&#8217;elemento <code>&lt;label&gt;<\/code>, che fornisce dei benefici di accessibilit\u00e0 che <code>&lt;span&gt;<\/code> non d\u00e0.<\/li><li>Se abbiamo intenzione di fare qualcosa lato client prima di fare l&#8217;invio di una form, allora dovremmo spostare l&#8217;azione destinata all&#8217;handler <code>onClick<\/code> dell&#8217;elemento <code>&lt;button&gt;<\/code> all&#8217;handler <code>onSubmit<\/code> dell&#8217;elemento <code>&lt;form&gt;<\/code>.<\/li><li>Tra l&#8217;altro, perch\u00e9 usare JavaScript per validare un indirizzo email quando HTML5 offre controlli di validazione della form in quasi tutti i browser, gi\u00f9 gi\u00f9 fino a IE10? Qui c&#8217;\u00e8 l&#8217;opportunit\u00e0 di fare affidamento sul browser e usare un <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/input\/email\">input type appropriato<\/a>, cos\u00ec come l&#8217;attributo <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Learn\/HTML\/Forms\/Form_validation#The_required_attribute\"><code>required<\/code><\/a>, ma sappiate che farlo funzionare nel modo corretto con gli screen reader <a href=\"https:\/\/developer.paciellogroup.com\/blog\/2019\/02\/required-attribute-requirements\/\">richiede un po&#8217; di know-how<\/a>.<\/li><li>Sebbene non sia un problema di accessibilit\u00e0, questo componente non fa affidamento su alcun metodo state o lifecycle, il che significa che pu\u00f2 essere rifattorizzato in un componente functional stateless, che usa molto meno JavaScript rispetto a un componente React completo.<\/li><\/ol>\n\n\n\n<p>Tenendo presenti queste cose, possiamo rifattorizzare questo componente:<\/p>\n\n\n\n<pre class=\"wp-block-code language-javascript\"><code>import React from \"react\";\n\nconst SignupForm = props =&gt; {\n  const handleSubmit = event =&gt; {\n    \/\/ Needed in case we're sending data to the server XHR-style\n    \/\/ (but will still work if server-rendered with JS disabled).\n    event.preventDefault();\n\n    \/\/ Carry on...\n  };\n  \n  return (\n    &lt;form method=\"POST\" action=\"\/signup\" onSubmit={handleSubmit}&gt;\n      &lt;label for=\"email\" class=\"email-label\"&gt;Enter your email:&lt;\/label&gt;\n      &lt;input type=\"email\" id=\"email\" required \/&gt;\n      &lt;button&gt;Sign Up&lt;\/button&gt;\n    &lt;\/form&gt;\n  );\n};<\/code><\/pre>\n\n\n\n<p>Non solo questo componente adesso \u00e8 pi\u00f9 accessibile, ma usa anche meno JavaScript. In un mondo che affoga in JavaScript, cancellarne delle righe dovrebbe essere terapeutico. <a href=\"https:\/\/alistapart.com\/article\/paint-the-picture-not-the-frame\">Il browser ci d\u00e0 cos\u00ec tanto gratuitamente<\/a> e noi dovremmo cercare di trarne vantaggio il pi\u00f9 spesso possibile.<\/p>\n\n\n\n<p>Questo non vuol dire che i pattern non accessibili capitino <em>solo<\/em> quando si usano i framework, ma piuttosto che un&#8217;unica preferenza per JavaScript alla fine <em>far\u00e0<\/em> emergere i gap nella nostra comprensione di HTML e CSS. Questi gap nelle conoscenze spesso risulteranno in errori di cui magari non siamo nemmeno a conoscenza. I framework possono essere dei tool utili che fanno aumentare la produttivit\u00e0, ma \u00e8 fondamentale un&#8217;educazione continua nelle tecnologie web principali per creare delle esperienze <em>usabili<\/em>, indipendentemente dai tool che si usano.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section3\">Fidatevi della web platform e andrete lontano velocemente<\/h2>\n\n\n\n<p>Visto che stiamo gi\u00e0 parlando dei framework, va detto che la web platform \u00e8 di per s\u00e9 un framework formidabile. Come ha mostrato la sezione precedente, \u00e8 meglio quando possiamo basarci su pattern con un markup assodato e su feature del browser stabili. L&#8217;alternativa \u00e8 reinventarle, con tutte le nefaste conseguenze che tale impresa comporta, o addirittura peggio: semplicemente <em>presupporre<\/em> che l&#8217;autore di ogni pacchetto JavaScript che installiamo abbia risolto il problema in maniera esaustiva e oculata.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"section4\">APPLICAZIONI SINGLE PAGE<\/h3>\n\n\n\n<p>Uno dei compromessi a cui gli sviluppatori scendono rapidamente \u00e8 l&#8217;adozione del modello single page application (SPA), anche se non va bene per il progetto. S\u00ec, <em>effettivamente<\/em> c&#8217;\u00e8 un guadagno nella performance percepita con il routing client-side di una SPA, ma cosa <em>perdiamo<\/em>? La funzionalit\u00e0 di navigazione propria del browser, sebbene sincrona, fornisce un sacco di vantaggi. Per prima cosa, la cronologia \u00e8 gestita secondo una <a href=\"https:\/\/html.spec.whatwg.org\/#the-history-interface\">specifica complessa<\/a>. Gli utenti senza JavaScript, che sia <a href=\"https:\/\/kryogenix.org\/code\/browser\/everyonehasjs.html\">per loro scelta o meno<\/a>, non perderanno l&#8217;accesso completamente. Perch\u00e9 le SPA rimangano disponibili quando non lo \u00e8 JavaScript, il rendering server-side diventa improvvisamente una cosa da considerare.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/alistapart.com\/wp-content\/uploads\/2019\/04\/fig2.png?w=960\" alt=\"Two series of screenshots. On the left, we have a blank screen for several seconds until the app appears after 5.24s. On the right, the basic components appear at 4ms and the site is fully usable at 5.16s.\" class=\"wp-image-6000653\" \/><figcaption><em>Figura 2.<\/em>Un confronto con una app di esempio che viene caricata su una connessione lenta. La app a sinistra dipende interamente da JavaScript per fare il rendering della pagina. L&#8217;app sulla destra fa il render di una response sul server, ma poi usa <a href=\"https:\/\/reactjs.org\/docs\/react-dom.html#hydrate\">client-side hydration<\/a><em> per attaccare i componenti al markup esistente reso lato server.<\/em><\/figcaption><\/figure>\n\n\n\n<p>Anche l&#8217;accessibilit\u00e0 \u00e8 danneggiata se un client-side router non fa sapere alle persone che il contenuto della pagina \u00e8 cambiato. La conseguenza \u00e8 che chi dipende dalle tecnologie assistive deve capire da solo i cambiamenti che sono avvenuti sulla pagina, cosa che pu\u00f2 rivelarsi piuttosto ardua.<\/p>\n\n\n\n<p>Poi c&#8217;\u00e8 la nostra vecchia nemesi: l&#8217;overhead. Alcuni router client-side sono molto piccoli, ma quando <em>cominciate<\/em> con <a href=\"https:\/\/bundlephobia.com\/result?p=react-dom@16.8.2\">React<\/a>, <a href=\"https:\/\/bundlephobia.com\/result?p=react-router@4.3.1\">un router compatibile<\/a> e magari addirittura <a href=\"https:\/\/bundlephobia.com\/result?p=redux@4.0.1\">una libreria di state management<\/a>, state accettando che c&#8217;\u00e8 una certa quantit\u00e0 di codice che non potrete mai ottimizzare, in questo caso circa 135 KB. Considerate attentamente quello che state creando e se un router client side valga il compromesso che state inevitabilmente facendo. Tipicamente, stareste meglio senza.<\/p>\n\n\n\n<p>Se siete preoccupati della performance percepita della navigazione, <em>potreste<\/em> appoggiarvi su <a href=\"https:\/\/www.w3.org\/TR\/resource-hints\/#prefetch-link-relation-type\"><code>rel=prefetch<\/code><\/a> per caricare in maniera ipotetica dei documenti sulla stessa origine. Questo ha un incredibile effetto sul miglioramento della performance di caricamento delle pagine percepita, visto che il documento \u00e8 subito disponibile in cache. Poich\u00e9 i prefetch sono fatti con bassa priorit\u00e0, sar\u00e0 anche meno probabile che concorrano per la banda con risorse critiche.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/alistapart.com\/wp-content\/uploads\/2019\/04\/fig3.png?w=960\" alt=\"Screenshot showing a list of assets loaded on a webpage. 'writing\/' is labeled as prefetched on initial navigation. This asset is then loaded in 2ms when actually requested by the user.\" class=\"wp-image-7171594\" \/><figcaption>Figura 3. L&#8217;HTML per l&#8217;URL writing\/ di cui viene fatto prefetch nella pagina iniziale. Quando l&#8217;utente richiede l&#8217;URL writing\/, il suo HTML viene caricato istantaneamente dalla cache del browser.<\/figcaption><\/figure>\n\n\n\n<p>Lo svantaggio primario del link prefetching \u00e8 che dovete essere coscienti che <em>pu\u00f2<\/em> essere potenzialmente inutile. <a href=\"https:\/\/github.com\/GoogleChromeLabs\/quicklink\">Quicklink<\/a>, un piccolo script di prefetching di Google, mitiga in qualche modo questo effetto controllando che il client attuale sia su una connessione lenta &#8211; o abbia abilitato la <a href=\"https:\/\/support.google.com\/chrome\/answer\/2392284?co=GENIE.Platform%3DAndroid&amp;hl=en\">modalit\u00e0 di risparmio dati<\/a> ed evita di default il prefetch dei link su cross-origins.<\/p>\n\n\n\n<p>Anche i <a href=\"https:\/\/adactio.com\/articles\/13796\">Service workers<\/a> sono immensamente vantaggiosi per la performance percepita dai returning user, sia che usiamo il client side routing sia che non lo usiamo, <a href=\"https:\/\/developers.google.com\/web\/fundamentals\/primers\/service-workers\/high-performance-loading#for_best_performance_bypass_the_network_for_navigations\">purch\u00e9 sappiate come muovervi<\/a>. <a href=\"https:\/\/developers.google.com\/web\/ilt\/pwa\/caching-files-with-service-worker\">Quando facciamo precache di routes con un service worker<\/a>, otteniamo molti degli stessi benefici del link prefetch, ma con un grado di controllo molto maggiore rispetto alle request e response. Che pensiate al vostro sito come un&#8217;\u201capp\u201d o meno, aggiungergli un service worker \u00e8 forse uno degli usi di JavaScript pi\u00f9 responsabile che esista oggi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"section5\">JAVASCRIPT NON \u00c8 LA SOLUZIONE AI VOSTRI PROBLEMI DI LAYOUT<\/h3>\n\n\n\n<p>Se installiamo un package per risolvere un problema di layout, procediamo con cautela e chiediamoci \u201ccosa sto cercando di ottenere?\u201d. CSS \u00e8 <a href=\"https:\/\/twitter.com\/rachelandrew\/status\/1088870059240505344\"><em>progettato per svolgere questo compito<\/em><\/a> e non richiede astrazioni per essere usato in maniera efficace. La maggior parte dei problemi di layout che i package JavaScript cercano di risolvere come <a href=\"https:\/\/www.npmjs.com\/package\/flexibility\">il box placement, l&#8217;allineamento e le dimensioni<\/a>, <a href=\"https:\/\/www.npmjs.com\/package\/shave\">la gestione del text overflow<\/a> e addirittura <a href=\"https:\/\/www.npmjs.com\/package\/lost\">interi sistemi di layout<\/a> sono <em>gi\u00e0<\/em> risolvibili con CSS. I moderni layout engine come Flexbox e Grid sono supportati sufficientemente bene che non dovrebbe esserci bisogno di cominciare un progetto con un layout framework. CSS <em>\u00e8<\/em> il framework. Quando avremo le <a href=\"https:\/\/hacks.mozilla.org\/2016\/08\/using-feature-queries-in-css\/\">feature queries<\/a>, applicare il progressive enhancement ai layout perch\u00e9 adottino i nuovi layout engine improvvisamente non sar\u00e0 <a href=\"https:\/\/hacks.mozilla.org\/2016\/08\/using-feature-queries-in-css\/\">pi\u00f9 cos\u00ec difficile<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-css\"><code>\/* Your mobile-first, non-CSS grid styles goes here *\/\n\n\/* The @supports rule below is ignored by browsers that don't\n   support CSS grid, _or_ don't support @supports. *\/\n@supports (display: grid) {\n  \/* Larger screen layout *\/\n  @media (min-width: 40em) {\n    \/* Your progressively enhanced grid layout styles go here *\/\n  }\n}<\/code><\/pre>\n\n\n\n<p>Usare JavaScript per soluzioni di layout e problemi di presentazione non \u00e8 una novit\u00e0. Era qualcosa che facevamo quando ci raccontavamo bugie nel 2009 dicendo che ogni sito web sarebbe dovuto apparire in IE6 esattamente identico agli altri browser pi\u00f9 potenti dell&#8217;epoca. Se stiamo ancora sviluppando siti web che appaiono identici in ogni browser nel 2019, dovremmo rivalutare i nostri obiettivi di sviluppo. Ci sar\u00e0 <em>sempre<\/em> un browser che dovremo supportare che non pu\u00f2 fare tutto quello che i moderni browser evergreen possono fare. La parit\u00e0 visuale totale su tutte le piattaforme non \u00e8 solo uno scopo che ci siamo prefissi in vano, \u00e8 il nemico principale del <a href=\"https:\/\/alistapart.com\/article\/understandingprogressiveenhancement\">progressive enhancement<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section6\">Non sono qui per uccidere JavaScript<\/h2>\n\n\n\n<p>Non fatevi trarre in inganno: non ho nulla contro JavaScript. Mi ha permesso di avere una carriera e, se devo essere onesto con me stesso, \u00e8 stato una fonte di gioia per pi\u00f9 di dieci anni. Come ogni relazione a lungo termine, pi\u00f9 ci passo del tempo pi\u00f9 imparo a conoscerlo. \u00c8 un linguaggio maturo, ricco di feature che diventa sempre pi\u00f9 potente ed elegante ogni anno che passa.<\/p>\n\n\n\n<p>Tuttavia, ci sono delle volte in cui mi sembra che JavaScript e io siamo ai ferri corti. <em>Sono<\/em> critico riguardo a JavaScript. O forse pi\u00f9 precisamente, sono critico del modo in cui abbiamo sviluppato la tendenza a vederlo come la prima risorsa per realizzare cose per il web. Mentre esamino un altro bundle simile a una matassa di luci natalizie ingarbugliate, diventa chiaro che il web \u00e8 <em>ebbro<\/em> di JavaScript. Lo utilizziamo quasi per tutto, anche quando non si l&#8217;occasione giusta. A volte mi chiedo quanto sar\u00e0 terribile il post-sbornia.<\/p>\n\n\n\n<p>In una serie di articoli che seguiranno, vi dar\u00f2 dei consigli pi\u00f9 pratici da seguire per arginare la marea invadente del JavaScript eccessivo e come possiamo discuterne in maniera tale che <em>quello<\/em> che creeremo per il web sar\u00e0 usabile, o almeno lo sar\u00e0 <em>maggiormente<\/em>, per tutti, ovunque. Alcuni dei consigli saranno preventivi, altri somiglieranno pi\u00f9 a misure tipo l&#8217;alcol post-sbornia. In ciascun caso, i risultati saranno gli stessi, speriamo. Credo che dovremmo tutti amare il web e comportarci correttamente con esso, ma voglio che pensiamo a come renderlo pi\u00f9 resiliente e inclusivo per tutti.<\/p>\n\n\n\n<p><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il web affoga in un mare di JavaScript, inondato di cose inutili e inaccessibili e pieno di pattern insostenibili. Jeremy Wagner traccia un percorso per navigare responsabilmente nel mare di JavaScript, creando le cose giuste nel modo giusto e usando la web platform come si deve.<\/p>\n","protected":false},"author":22,"featured_media":7001038,"comment_status":"closed","ping_status":"closed","template":"","categories":[269,271],"tags":[],"coauthors":[500],"class_list":["post-7001037","article","type-article","status-publish","has-post-thumbnail","hentry","category-application-development","category-javascript"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/7001037","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\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=7001037"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7001038"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=7001037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=7001037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=7001037"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=7001037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}