{"id":1092,"date":"2023-07-02T10:46:39","date_gmt":"2023-07-02T08:46:39","guid":{"rendered":"https:\/\/www.ilbytecidio.it\/?p=1092"},"modified":"2023-07-02T11:28:07","modified_gmt":"2023-07-02T09:28:07","slug":"jquery-serve-ancora-nel-2023","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=1092","title":{"rendered":"JQuery: serve ancora nel 2023?"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.ilbytecidio.it\/wp-content\/uploads\/2023\/07\/jQuery_logo.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"251\" src=\"https:\/\/www.ilbytecidio.it\/wp-content\/uploads\/2023\/07\/jQuery_logo-1024x251.png\" alt=\"\" class=\"wp-image-1094\" srcset=\"https:\/\/www.ilbytecidio.it\/wp-content\/uploads\/2023\/07\/jQuery_logo-1024x251.png 1024w, https:\/\/www.ilbytecidio.it\/wp-content\/uploads\/2023\/07\/jQuery_logo-300x73.png 300w, https:\/\/www.ilbytecidio.it\/wp-content\/uploads\/2023\/07\/jQuery_logo-768x188.png 768w, https:\/\/www.ilbytecidio.it\/wp-content\/uploads\/2023\/07\/jQuery_logo-1536x376.png 1536w, https:\/\/www.ilbytecidio.it\/wp-content\/uploads\/2023\/07\/jQuery_logo-2048x501.png 2048w, https:\/\/www.ilbytecidio.it\/wp-content\/uploads\/2023\/07\/jQuery_logo-500x122.png 500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Sono passati ben 12 anni a quando ho iniziato a utilizzare <a rel=\"noreferrer noopener\" href=\"https:\/\/jquery.com\/\" data-type=\"URL\" data-id=\"https:\/\/jquery.com\/\" target=\"_blank\">JQuery<\/a>. All&#8217;epoca era una gran comodit\u00e0 e ne fui entusiasta, al punto che decisi di preparare subito due esempi da pubblicare qui (<a rel=\"noreferrer noopener\" href=\"https:\/\/www.ilbytecidio.it\/?p=217\" data-type=\"post\" data-id=\"217\" target=\"_blank\">uno<\/a> e <a rel=\"noreferrer noopener\" href=\"https:\/\/www.ilbytecidio.it\/?p=209\" data-type=\"post\" data-id=\"209\" target=\"_blank\">due<\/a>). Da allora molte cose sono cambiate e JQuery sta avendo un ruolo pi\u00f9 marginale, specialmente nei nuovi progetti. Molte delle librerie che lo annoveravano fra le dipendenze ora ne fanno a meno, ma molti di noi lo usano ancora per abitudine. Ma allora JQuery \u00e8 morto? Scopriamolo.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Innanzitutto occorre capire meglio il contesto in cui \u00e8 nato JQuery. Il web, oltre ad essere composto da <a rel=\"noreferrer noopener\" href=\"https:\/\/www.ilbytecidio.it\/?p=658\" data-type=\"post\" data-id=\"658\" target=\"_blank\">codice disordinato<\/a>, soffriva delle profonde differenze fra i browser pi\u00f9 usati. Mozilla Firefox aveva superato Internet Explorer e Google Chrome si faceva strada, ma il navigatore di casa Microsoft era ancora molto usato, addirittura nella sua obsoleta versione 6, bench\u00e9 notoriamente lento ed irrispettoso degli standard. Codice scritto per Firefox in genere funzionava bene su Chrome e Opera, ma rischiava di non girare o di dare effetti imprevisti su Explorer e viceversa. JQuery mette a disposizione un set di istruzioni per la manipolazione del <a href=\"https:\/\/www.w3schools.com\/Js\/js_htmldom.asp\" data-type=\"URL\" data-id=\"https:\/\/www.w3schools.com\/Js\/js_htmldom.asp\" target=\"_blank\" rel=\"noreferrer noopener\">DOM<\/a>, dello stile e per effettuare richieste HTTP asincrone, accessibili attraverso la semplicissima funzione $, ottimizzate per funzionare nello stesso modo in tutti i browser pi\u00f9 noti.<\/p>\n\n\n\n<p>Oggi le cose sono cambiate. Explorer non c&#8217;\u00e8 pi\u00f9 e non ne sentiamo la mancanza. Il browser di Microsoft \u00e8 Edge che utilizza lo stessa base di codice di Google Chrome e l&#8217;ultimo standard di JavaScript, ECMA6 include molte comodit\u00e0 ed \u00e8 ben supportato.<\/p>\n\n\n\n<p>Vediamo alcuni esempi.<br>Istruzioni come <\/p>\n\n\n\n<p><code>$('#id-elemento)<br>$('.classe-elemento')<br>$('elemento[name=\"nome-elemento\"')<\/code><\/p>\n\n\n\n<p>possono essere sostituite da<br><code>document.getElementById('id-elemento')<br>document.querySelectorAll('.classe-elemento')<br>document.getElementsByTagName('nome-elemento')<\/code><\/p>\n\n\n\n<p>Il secondo di questi, <a rel=\"noreferrer noopener\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Document\/querySelectorAll\" target=\"_blank\">querySelectorAll<\/a>, \u00e8 il pi\u00f9 interessante perch\u00e9 permette di utilizzare una sintassi simile a quella a cui eravamo abituati con JQuery. Gli elementi restituiti dalle tre funzioni sono sempre di tipo <a rel=\"noreferrer noopener\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Node\" data-type=\"URL\" data-id=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Node\" target=\"_blank\">Node<\/a>, cos\u00ec, proprio come in JQuery, possiamo contare su un&#8217;interfaccia uniforme per poterli manipolare.<\/p>\n\n\n\n<p>Altro esempio \u00e8 quello delle chiamate AJAX. In JQuery utilizzavamo le funzioni <a rel=\"noreferrer noopener\" href=\"https:\/\/api.jquery.com\/Jquery.ajax\/\" data-type=\"URL\" data-id=\"https:\/\/api.jquery.com\/Jquery.ajax\/\" target=\"_blank\">$.ajax<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/api.jquery.com\/jQuery.getJSON\/\" data-type=\"URL\" data-id=\"https:\/\/api.jquery.com\/jQuery.getJSON\/\" target=\"_blank\">$.getJson<\/a>, ecc. All&#8217;epoca erano davvero comode perch\u00e9 Explorer e Firefox avevano metodi diversi per le richieste asincrone. Oggi possiamo contare su un approccio diverso ed elegante che fa uso delle funzioni asincrone, senza usare librerie esterne:<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre id=\"block-3f2695b6-5ca0-4144-a5e3-fa87dd6f450b\" class=\"wp-block-code\"><code>async function postJSON(data) {\n  try {\n    const response = await fetch(\"https:\/\/ilmiosito.com\/api\", {\n      method: \"POST\",\n      headers: {\"Content-Type\": \"application\/json\"},\n      body: JSON.stringify(data),\n    });\n\n    const result = await response.json();\n    \/\/ gestione risultato\n  } catch (error) {\n    \/\/ gestione errore\n  }\n}\n\npostJSON({\n  campo1: dato1,\n  campo2: dato2\n});<\/code><\/pre>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<p>Il cuore di tutto \u00e8 la funzione <a rel=\"noreferrer noopener\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/fetch\" data-type=\"URL\" data-id=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/fetch\" target=\"_blank\">fetch<\/a>, parte della <a rel=\"noreferrer noopener\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Fetch_API\" data-type=\"URL\" data-id=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Fetch_API\" target=\"_blank\">API Fetch<\/a>. Non mi dilungher\u00f2 sul fatto che questo approccio richiede la padronanza del concetto di programmazione concorrente coi relativi problemi del produttore\/consumatore che qualsiasi buon programmatore dovrebbe aver imparato. Per l&#8217;uso corretto di questa tecnica in JavaScript raccomando la lettura della pagina relativa alle parole-chiave <a rel=\"noreferrer noopener\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/async_function\" data-type=\"URL\" data-id=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/async_function\" target=\"_blank\">async e await<\/a>, ma anche una rinfrescata al concetto di <a rel=\"noreferrer noopener\" href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Promise\" data-type=\"URL\" data-id=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Promise\" target=\"_blank\">Promise<\/a>.<\/p>\n\n\n\n<p>Come abbiamo visto, \u00e8 venuta meno la condizione principale che ha favorito la diffusione di JQuery: l&#8217;incompatibilit\u00e0 fra browser ed il bisogno di interfacce pi\u00f9 semplici di quelle fornite dallo JavaScript puro.<br>Alcuni lamentano il peso aggiuntivo e superfluo di JQuery sulle pagine. Inoltre, strumenti strettamente legati a JQuery, come <a rel=\"noreferrer noopener\" href=\"https:\/\/jqueryui.com\/\" data-type=\"URL\" data-id=\"https:\/\/jqueryui.com\/\" target=\"_blank\">JQueryUI<\/a> e <a rel=\"noreferrer noopener\" href=\"https:\/\/jquerymobile.com\/\" data-type=\"URL\" data-id=\"https:\/\/jquerymobile.com\/\" target=\"_blank\">JQuery Mobile<\/a> (oggi <a rel=\"noreferrer noopener\" href=\"https:\/\/blog.jquerymobile.com\/2021\/10\/07\/jquery-maintainers-continue-modernization-initiative-with-deprecation-of-jquery-mobile\/\" target=\"_blank\">deprecato<\/a>) hanno un aspetto ormai superato da strumenti pi\u00f9 recenti come <a rel=\"noreferrer noopener\" href=\"https:\/\/getbootstrap.com\/\" data-type=\"URL\" data-id=\"https:\/\/getbootstrap.com\/\" target=\"_blank\">Bootstrap<\/a>. Esistono oggi svariati framework che rendono la manipolazione delle pagine lato-client (e, per estensione, la creazione di applicazioni web a pagina singola) molto pi\u00f9 semplice e\/o il codice pi\u00f9 ordinato. Fra questi possiamo ricordare <a rel=\"noreferrer noopener\" href=\"https:\/\/angular.io\/\" data-type=\"URL\" data-id=\"https:\/\/angular.io\/\" target=\"_blank\">Angular<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/it.reactjs.org\/\" data-type=\"URL\" data-id=\"https:\/\/it.reactjs.org\/\" target=\"_blank\">React<\/a> e <a rel=\"noreferrer noopener\" href=\"https:\/\/alpinejs.dev\/\" data-type=\"URL\" data-id=\"https:\/\/alpinejs.dev\/\" target=\"_blank\">AlpineJS<\/a> (quest&#8217;ultimo dichiaratamente &#8220;un JQuery per il web moderno&#8221;).<\/p>\n\n\n\n<p>Quindi JQuery sparir\u00e0 presto? No, non necessariamente. Esistono milioni di righe di codice che sono state scritte quando JQuery era ancora uno dei migliori aiuti a disposizione del programmatore JavaScript e comunque si tratta di uno strumento tuttora attivamente sviluppato e mantenuto e del quale molti di noi hanno ancora un&#8217;ottima padronanza. In molti considereranno la sostituzione della libreria come una bassa priorit\u00e0, se non come una fatica inutile. Preferiranno al limite aggiornare la versione di JQuery e continuare a mantenere il vecchio codice finch\u00e9 non sar\u00e0 ora di mandarlo in pensione. Ed anche allora potrebbero decidere di scrivere i nuovi moduli usando uno strumento che conoscono bene.<\/p>\n\n\n\n<p>Personalmente, ho installato JQuery nei nuovi progetti fino all&#8217;inizio di quest&#8217;anno. Sto iniziando a farne a meno solo recentemente per il semplice motivo che ci tengo ad essere aggiornato sugli strumenti pi\u00f9 richiesti negli annunci di lavoro, nonch\u00e9 su quelli pi\u00f9 promettenti (tipo Alpine). JQuery lo conosco molto bene ormai e lo utilizzo ancora nella manutenzione del vecchio codice, mentre per il nuovo codice preferisco studiare soluzioni nuove.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sono passati ben 12 anni a quando ho iniziato a utilizzare JQuery. All&#8217;epoca era una gran comodit\u00e0 e ne fui entusiasta, al punto che decisi di preparare subito due esempi da pubblicare qui (uno e due). Da allora molte cose &hellip; <a href=\"https:\/\/www.ilbytecidio.it\/?p=1092\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[123,120,121,119,115,124,118,125,122],"class_list":["post-1092","post","type-post","status-publish","format-standard","hentry","category-programmazione-javascript","tag-alpine","tag-angular","tag-bootstrap","tag-framework","tag-javascript","tag-javascript-lato-client","tag-jquery","tag-programmazione-web","tag-react"],"views":280,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/1092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1092"}],"version-history":[{"count":5,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/1092\/revisions"}],"predecessor-version":[{"id":1099,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/1092\/revisions\/1099"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}