<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Guido Cusani - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Guido Cusani - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 19:55:02 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/author/gducsn/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Come Installare Node.js su Ubuntu e Aggiornare npm all'Ultima Versione ]]>
                </title>
                <description>
                    <![CDATA[ Se provi ad installare l'ultima versione di node usando il gestore di pacchetti apt finirai con l'avere la versione 10.19.0. Questa è l'ultima versione presente nell'app store ubuntu ma non è l'ultima versione rilasciata da NodeJS. > N.d.T. Le versioni menzionate fanno riferimento al momento della pubblicazione dell'articolo e non ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-installare-nodejs-su-ubuntu/</link>
                <guid isPermaLink="false">63bd67bf2d9e0906706d62f6</guid>
                
                    <category>
                        <![CDATA[ nodejs ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Guido Cusani ]]>
                </dc:creator>
                <pubDate>Fri, 03 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/01/Slice-3-2-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-install-node-js-on-ubuntu-and-update-npm-to-the-latest-version/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Install Node.js on Ubuntu and Update npm to the Latest Version</a>
      </p><p>Se provi ad installare l'ultima versione di node usando il gestore di pacchetti apt finirai con l'avere la versione <strong><strong>10.19.0</strong></strong>. Questa è l'ultima versione presente nell'app store ubuntu ma non è l'ultima versione rilasciata da NodeJS.</p><blockquote>N.d.T.<br>Le versioni menzionate fanno riferimento al momento della pubblicazione dell'articolo e non sono aggiornate.</blockquote><p>Questo succede perché le nuove versioni software rilasciate richiedono mesi prima che il team di Ubuntu le testi e le rilasci nel proprio store ufficiale. Per ottenere l'ultima versione di qualsiasi software dovresti usare pacchetti privati, pubblicati direttamente dagli sviluppatori. </p><p>In questo tutorial, quello che vogliamo è ottenere Node <strong><strong>v12.18.1 </strong></strong>(LTS - con supporto a lungo termine) o <strong><strong>v14.4</strong></strong>. Per ottenere le ultime versioni possiamo usare <strong><strong>nodesource</strong></strong> o <strong><strong>nvm</strong></strong> (node version manager). Ti farò vedere entrambi i modi. </p><p>Tutti i comandi saranno eseguiti utilizzando l'interfaccia a riga di comando (CLI) di Ubuntu.</p><h2 id="usare-nvm-il-mio-metodo-preferito"><strong>Usare<strong> NVM - </strong>il mio metodo preferito</strong></h2><p>Il motivo per cui preferisco nvm è perché permette di muoversi tra diverse versione di node in base al progetto. Capiterà di collaborare a diversi progetti con diverse versioni di node e dunque dover cambiare versione in base a quella richiesta. Per questo nvm è lo strumento migliore. </p><h2 id="installare-nvm"><strong><strong>Install</strong>are<strong> NVM</strong></strong></h2><p><code>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash</code></p><p>Per controllare l'effettiva installazione di nvm scrivi nel terminale <code>nvm --version</code>. Se la risposta è qualcosa tipo <code>0.35.3</code> allora sai che è stato installato correttamente.</p><p><strong>Riavvia il tuo terminale per rendere effettivi i cambiamenti.</strong></p><h2 id="installare-nodejs"><strong><strong>Install</strong>are<strong> NodeJS</strong></strong></h2><p>Installiamo NodeJS versione 14.4.</p><p>Semplicemente digita il comando <code>nvm install 14.4.0</code> e fai invio.</p><p>Puoi decidere quale versione installare usando lo stesso comando ma con la versione che desideri. Ad esempio: <code>nvm install 12.18.1</code>.</p><p>Eseguendo il comando verrà installata la versione di NodeJS scelta e automaticamente l'ultima versione di <strong>npm</strong> che potrebbe essere <code>v6.14.5</code>.</p><p>Se desideri spostarti su una versione di node specifica puoi semplicemente usare il comando <code>nvm use &lt;numero-versione&gt;</code>, ad esempio <code>nvm use v12.18.1</code>.</p><p>Per visualizzare la lista delle diverse versioni di node installate con nvm puoi usare il comando <code>nvm ls</code>.</p><h2 id="installare-nodesource"><strong><strong>Install</strong>are<strong> Nodesource</strong></strong></h2><p>Esegui questo comando per dire a Ubuntu che vuoi installare il pacchetto di NodeJS da nodesource. </p><p><code>curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -</code></p><p><strong>N.B.</strong>,<strong> </strong>la versione v14.4.0 è l'ultima versione di Node ma non ha il supporto a lungo termine (LTS). Per installare la versione di Node con LTS cambia il numero della versione da <code>14</code> a <code>12</code> nel comando. </p><p>È probabile ti venga chiesto di inserire password per l'utente root. Scrivila e premi invio. </p><h2 id="installare-nodejs-1"><strong><strong>Install</strong>are<strong> NodeJS</strong></strong></h2><p>Una volta sistemato Nodesource possiamo installare NodeJS v14.4. Esegui <code>sudo apt-get install -y nodejs</code>.</p><p>Una volta fatto, possiamo controllare se effettivamente abbiamo l'ultima versione installata. Possiamo farlo usando il comando <code>nodejs -v</code> che dovrebbe restituire <code>v14.4.0</code>.</p><p>Dovresti avere installato npm in automatico. Per controllare che versione hai puoi usare questo comando: <code>npm version</code>. Se non ottieni un oggetto che include l'ultima versione di npm, o qualcosa di simile a 6.14.5 (<code>{ npm: '6.14.5' }</code>), allora puoi aggiornare manualmente npm con il seguente comando: </p><p><code>npm install -g npm@latest</code>.</p><p>Se dovessero esserci problemi con npm che non può essere aggiornato perché risulta non installato, puoi prima usare il comando <code>sudo apt-get install -y npm</code>, e poi usare il comando precedente per aggiornare. </p><p>Per avviare alcuni pacchetti npm potresti avere bisogno di questo comando: </p><p><code>sudo apt install build-essential</code>.</p><p>E questo è tutto.</p><p>Hai l'ultima versione di NodeJS e NPM sulla tua macchina Ubuntu.</p><p>Buona programmazione:)<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ parseInt() in JavaScript – Esempi da Stringa a Int in JS ]]>
                </title>
                <description>
                    <![CDATA[ In questo tutorial parleremo della funzione parseInt in JavaScript. Questa funzione analizza una stringa e restituisce un numero o NaN (Not a Number). Come funziona parseInt Lo scopo principale della funzione parseInt è quello di estrarre un numero da una stringa e restituire l'effettivo valore numerico.  La sintassi: parseInt(stringa) ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/parseint-in-javascript-esempi-da-stringa-a-int-in-js/</link>
                <guid isPermaLink="false">636cba9c431671062c018e59</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Guido Cusani ]]>
                </dc:creator>
                <pubDate>Fri, 10 Feb 2023 13:22:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/02/parseint.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/parseint-in-javascript-js-string-to-int-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">parseInt() in JavaScript – JS String to Int Example</a>
      </p><p>In questo tutorial parleremo della funzione <code>parseInt</code> in JavaScript. Questa funzione analizza una stringa e restituisce un numero o <code>NaN</code> (Not a Number).</p><h2 id="come-funziona-parseint"><strong>Come funziona <code>parseInt</code></strong></h2><p>Lo scopo principale della funzione <code>parseInt</code> è quello di estrarre un numero da una stringa e restituire l'effettivo valore numerico. </p><p>La sintassi:</p><pre><code class="language-txt">parseInt(stringa)</code></pre><p><br>Consideriamo questo esempio:</p><pre><code class="language-javascript">const myNumber = '3';
console.log(2 + myNumber);
// restituisce 23</code></pre><p>Nell'esempio qui sopra, 3 è una stringa e non un numero. Quando aggiungiamo 2 otteniamo 23, cioè una concatenazione tra stringhe.</p><p><br>Con la funzione <code>parseInt</code> possiamo estrarre il 3 dalla stringa e trasformarlo in un numero (da '3' a 3). Ecco come:</p><pre><code class="language-javascript">const myNumber = '3';
console.log(2 + parseInt(myNumber));
// restituisce 5
</code></pre><p>La funzione <code>parseInt</code> potrebbe restituire un numero o <code>NaN</code>. Quand'è che otteniamo <code>NaN</code> come valore?</p><p>Potrebbe succedere se c'è del testo prima del numero. Qualcosa come "age is 50" restituirebbe <code>NaN</code> perché la funzione <code>parseInt</code> tiene conto solo del primo valore della stringa. Se non è un numero restituisce <code>NaN</code>:</p><pre><code class="language-javascript">const age = 'age is 50';
console.log(parseInt(age));
// restituisce NaN</code></pre><p>Riorganizziamo la stringa e vediamo cosa succede.</p><pre><code class="language-javascript">const age = '50 is the age';
console.log(parseInt(age));
// restituisce 50</code></pre><p>Quando il primo valore della stringa è un numero, quel numero viene restituito correttamente. </p><p>Ricorda che la funzione <code>parseInt</code> ignora i valori float (con la virgola). Se l'età fosse 50.05 ritornerebbe solo 50 ignorando la parte decimale.</p><p>Nel caso in cui la stringa contenesse più di un numero come &nbsp;"50 100 150 200" &nbsp;la funzione restituirebbe solo il primo numero, 50. Questo perché <code>parseInt</code> considera solo il primo valore. </p><p>Mentre se iniziasse senza spazi, '50istheage', la funzione restituirebbe correttamente la parte iniziale numerica. </p><h2 id="il-parametro-radice"><strong>Il parametro <code>radice</code></strong></h2><p>La funzione <code>parseInt</code> accetta un secondo parametro conosciuto come <code>radice</code>. Questo parametro specifica quale base numerica utilizzare. Se viene omesso, viene usato 10 di default.</p><p>La sintassi:</p><pre><code class="language-txt">parseInt(stringa, radice)</code></pre><p>La base consentita è un numero tra 2 e 36. Se il valore è minore di 2 o maggiore di 36 la funzione restituisce <code>NaN</code>.</p><p>Specificare una radice di 12 implica che il numero nella stringa sia convertito dalla base duodecimale a quella decimale.</p><p>Ecco un piccolo esempio:</p><pre><code class="language-javascript">console.log(parseInt("50", 12));

// restituisce 60</code></pre><p>Otteniamo 60, che è il valore corrispondente in base 10.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo tutorial abbiamo imparato come usare la funzione <code>parseInt</code> per estrarre numeri da stringhe.</p><p>Inoltre con l'utilizzo del secondo parametro, <code>radice</code>, possiamo specificare quale base numerica verrà utilizzata per la conversione.</p><p>Grazie per aver letto!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ... in JavaScript – l'Operatore Tre Punti in JS ]]>
                </title>
                <description>
                    <![CDATA[ L'operatore con tre punti in JavaScript è una delle più importanti novità dell'ES6. Questo operatore (...) ti aiuterà a ottenere molte cose che altrimenti richiederebbero tante righe di codice, una sintassi difficile e tanto altro. In questo breve articolo, impererai cos'è e cosa fa questo operatore. Vedremo alcuni esempi per ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/operatore-tre-punti-javascript/</link>
                <guid isPermaLink="false">63340551f289f30743396d96</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Guido Cusani ]]>
                </dc:creator>
                <pubDate>Wed, 30 Nov 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/11/cover-template--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/three-dots-operator-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">... in JavaScript – the Three Dots Operator in JS</a>
      </p><p>L'operatore con tre punti in JavaScript è una delle più importanti novità dell'ES6.</p><p>Questo operatore (<code>...</code>) ti aiuterà a ottenere molte cose che altrimenti richiederebbero tante righe di codice, una sintassi difficile e tanto altro.</p><p>In questo breve articolo, impererai cos'è e cosa fa questo operatore. Vedremo alcuni esempi per mostrare i possibili casi di utilizzo e ci occuperemo di come usarlo per svolgere delle operazioni. In questo modo, saprai cosa ha da offrire a uno sviluppatore JavaScript. </p><p>L'operatore ha due diversi significati in JavaScript. La sintassi è davvero simile ma il contesto di utilizzo ne specifica il tipo. Nei due diversi utilizzi, l'operatore <code>...</code> prende il nome di <strong>operatore spread </strong>e <strong>operatore rest</strong>.</p><h1 id="come-usare-l-operatore-spread-in-javascript"><strong>Come usare l'operatore spread in JavaScript</strong></h1><p>In JavaScript, si utilizza l'operatore spread per espandere un iterabile all'interno di uno specifico ricevitore.</p><p>Questo contenitore potrebbe essere qualsiasi cosa: un oggetto, un array e così via. Il ricevitore potrebbe essere qualsiasi cosa su cui iterare, un array, una stringa, un oggetto ecc.</p><h3 id="sintassi-operatore-spread-"><strong>Sintassi operatore spread:</strong></h3><pre><code>const nuovoArray = ['primoElemento', ...vecchioArray];

</code></pre><p>Guardiamo alcuni esempi su come usare l'operatore spread. </p><h3 id="come-copiare-un-array-con-l-operatore-spread"><strong>Come copiare un array con l'operatore spread</strong></h3><p>Per copiare gli elementi di un particolare array in un altro, senza modificare l'originale, sfruttiamo l'operatore spread.</p><p>Ecco un esempio:</p><pre><code>let nomiStudenti = ["Daniel", "Jane", "Joe"];

let nomi = [...nomiStudenti];

console.log(nomi); // ["Daniel","Jane","Joe"]

</code></pre><p>Questo ci risparmia il tempo che avremmo impiegato per scrivere un loop:</p><pre><code>let nomiStudenti = ["Daniel", "Jane", "Joe"];

let nomi = [];

nomiStudenti.map((nome) =&gt; {
    nomi.push(nome);
});

console.log(nomi); // ["Daniel","Jane","Joe"]

</code></pre><h3 id="come-copiare-un-oggetto-con-l-operatore-spread"><strong>Come copiare un oggetto con l'operatore spread</strong></h3><p>Nello stesso modo in cui abbiamo fatto per gli array, possiamo utilizzare l'operatore spread per copiare oggetto in un altro.</p><pre><code>let utente = { nome: "John Doe", età: 10 };

let copiaUtente = { ...utente };
console.log(copiaUtente); // { nome: "John Doe", età: 10 }

</code></pre><p><code>Object.assign()</code> è un modo più vecchio di ottenere lo stesso risultato: </p><pre><code>let utente = { nome: "John Doe", età: 10 };

let copiaUtente = Object.assign({}, utente);
console.log(copiaUtente); // { nome: "John Doe", età: 10 }

</code></pre><h3 id="come-concatenare-o-unire-gli-array-usando-l-operatore-spread"><strong>Come concatenare o unire gli array usando l'operatore spread</strong></h3><p>Quando abbiamo due o più array da unire in un nuovo array, possiamo utilizzare facilmente l'operatore spread. Copiamo gli elementi da un array:</p><pre><code>let nomiMaschili = ["Daniel", "Peter", "Joe"];
let nomiFemminili = ["Sandra", "Lucy", "Jane"];

let tuttiNomi = [...nomiMaschili, ...nomiFemminili];

console.log(tuttiNomi); // ["Daniel","Peter","Joe","Sandra","Lucy","Jane"]

</code></pre><p>È importante sapere che non conta il numero degli array, possiamo utilizzare sempre lo stesso approccio. Inoltre possiamo anche aggiungere singoli elementi nell'array. </p><pre><code>let nomiMaschili = ["Daniel", "Peter", "Joe"];
let nomiFemminili = ["Sandra", "Lucy", "Jane"];
let altriNomi = ["Bill", "Jill"];

let piùNomi = [...altriNomi, ...nomiMaschili, ...nomiFemminili];
let nomi = [...piùNomi, "Ben", "Fred"];

</code></pre><p>Questo ci evita l'uso della sintassi complessa di un metodo come <code>concat()</code>:</p><pre><code>let nomiMaschili = ["Daniel", "Peter", "Joe"];
let nomiFemminili = ["Sandra", "Lucy", "Jane"];
let altriNomi = ["Bill", "Jill"];

let tuttiNomi = nomiMaschili.concat(nomiFemminili);
let piùNomi = nomiMaschili.concat(nomiFemminili, altriNomi);

</code></pre><h3 id="come-concatenare-o-unire-oggetti-con-l-operatore-spread"><strong>Come concatenare o unire oggetti con l'operatore spread</strong></h3><p>Possiamo unire oggetti nello stesso modo in cui abbiamo fatto con gli array:</p><pre><code>let userName = { nome: "John Doe" };
let userSex = { sesso: "Maschio" };

let user = { ...userName, ...userSex };

console.log(user); // { nome: "John Doe", sesso: "Maschio" }

</code></pre><p><strong>Nota: </strong>in una situazione in cui una chiave ha un'altra proprietà, l'ultima sovrascriverà la precedente: </p><pre><code>let userName = { nome: "John Doe" };
let userSex = { sesso: "Femmina", nome: "Jane Doe" };

let user = { ...userName, ...userSex }; // { nome: "Jane Doe", sesso: "Femmina" }

</code></pre><h3 id="come-recuperare-un-elemento-univoco-con-il-metodo-set-"><strong>Come recuperare un elemento univoco con il metodo Set()</strong></h3><p>Una situazione in cui l'operatore spread risulta essere molto utile è quando cerchiamo di recuperare un valore univoco da un array per inserirlo in un altro.</p><p>Ad esempio, supponendo di avere un array contenente frutta, vogliamo evitare di avere delle ripetizioni al suo interno. Possiamo creare un nuovo array contente solo frutta non ripetuta. Usando il metodo <code>Set()</code> aiutato dall'operatore spread, possiamo ottenere questo risultato facilmente: </p><pre><code>let frutta = ["Mango", "Mela", "Mango", "Banana", "Mango"];

let fruttaNoRip = [...new Set(frutta)];
console.log(fruttaNoRip); // ["Mango","Apple","Banana"]

</code></pre><h3 id="come-passare-gli-elementi-di-un-array-in-chiamate-di-funzioni-con-l-operatore-spread"><strong>Come passare gli elementi di un array in chiamate di funzioni con l'operatore spread</strong></h3><p>Consideriamo una funzione che accetta un numero e questi numeri come elementi di un array:</p><pre><code>let punteggi = [12, 33, 6]

const somma = (a, b, c) =&gt; {
    console.log(a + b + c);
};

</code></pre><p>Puoi usare l'operatore spread per passare gli elementi dell'array come argomenti alla funzione:</p><pre><code>let punteggi = [12, 33, 6]

const somma = (a, b, c) =&gt; {
    console.log(a + b + c);
};

somma(...punteggi); // 51

</code></pre><p>Un vecchio metodo per svolgere questa operazione è usare il metodo <code>apply()</code>:</p><pre><code>let punteggi = [12, 33, 6]

const somma = (a, b, c) =&gt; {
    console.log(a + b + c);
};

somma.apply(null, punteggi); // 51

</code></pre><h3 id="come-dividere-stringhe-in-caratteri-usando-l-operatore-spread">Come dividere stringhe in caratteri usando l'operatore spread</h3><p>Consideriamo di avere una stringa. Possiamo sfruttare l'operatore spread per dividere la stringa in caratteri:</p><pre><code>let stringa = "freeCodeCamp";

const dividiStringa = [...stringa];

console.log(dividiStringa); // ["f","r","e","e","C","o","d","e","C","a","m","p"]

</code></pre><p>È molto simile al metodo <code>split()</code>:</p><pre><code>let stringa = "freeCodeCamp";

const dividiStringa = stringa.split('');

console.log(dividiStringa); // ["f","r","e","e","C","o","d","e","C","a","m","p"]

</code></pre><h1 id="come-usare-l-operatore-rest-in-javascritpt"><strong>Come usare l'operatore rest in JavaScritpt</strong></h1><p>L'operatore rest ti permette di unire qualsiasi numero di argomenti all'interno di un array e farci quello che vuoi. Sfrutta un array per rappresentare un infinito numero di argomenti. </p><h3 id="sintassi-dell-operatore-rest"><strong>Sintassi dell'operatore rest</strong></h3><pre><code>const funzione = (primoElemento, ...resto) =&gt; {};

</code></pre><p>Consideriamo una lista di numeri. Vogliamo usare il primo numero come moltiplicatore per tutti i successivi numeri e poi aggiungere i numeri moltiplicati in un array: </p><pre><code>const moltiplicaArg = (moltiplicatore, ...altriArg) =&gt; {
    return altriArg.map((numero) =&gt; {
    return numero * moltiplicatore;
    });
};

let arrayMoltiplicato = moltiplicaArg(6, 5, 7, 9);

console.log(arrayMoltiplicato); // [30,42,54]

</code></pre><p>Ecco una buona rappresentazione dell'operatore rest e dei suoi valori: </p><pre><code>const moltiplicaArg = (moltiplicatore, ...altriArg) =&gt; {
    console.log(moltiplicatore); // 6
    console.log(altriArg); // [5,7,9]
};

moltiplicaArg(6, 5, 7, 9);

</code></pre><p><strong>Nota: </strong>il parametro rest deve essere l'ultimo parametro formale.</p><pre><code>const moltiplicaArg = (moltiplicatore, ...altriArg, ultimoNumero) =&gt; {
    console.log(ultimoNumero); // Uncaught SyntaxError: Rest parameter must be last formal parameter
};

moltiplicaArg(6, 5, 7, 9);

</code></pre><h1 id="differenze-tra-gli-operatori-spread-e-rest-in-javascript"><strong>Differenze tra gli operatori spread e rest in JavaScript</strong></h1><p>A questo punto potresti essere confuso per quanto i due metodi siano simili. Le denominazioni scelte dal team di JS sono ottime perché riassumono esattamente lo scopo di ognuno. </p><p>Usiamo l'operatore <em>spread </em>quando vogliamo <em>distribuire </em>i valori di un array o di un iterabile in un altro array o oggetto. </p><p>Mentre usiamo l'operatore <em>rest</em> per <em>raccogliere </em>tutti gli elementi restanti passati a una funzione come array.</p><pre><code>const funzione = (nome1, ...resto) =&gt; { // operatore rest
    console.log(nome1);
    console.log(resto);
};

let nomi = ["John", "Jane", "John", "Joe", "Joel"];
funzione(...nomi); // operatore spread
</code></pre><h2 id="in-conclusione"><strong>In conclusione</strong></h2><p>In questo articolo, hai imparato cosa si intende con "operatore tre punti" in JavaScript. Hai anche visto i vari casi in cui puoi utilizzarlo, insieme ai significati che assume in contesti diversi.</p><p>Divertiti! </p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come impostare l'autorizzazione e l'autenticazione JWT con Java Spring Boot ]]>
                </title>
                <description>
                    <![CDATA[ Lo scorso mese, ho avuto la possibilità di implementare il sistema di autenticazione JWT per uno dei miei progetti. Ho lavorato precedentemente con JWT in Ruby on Rails, ma questa è stata la mia prima volta con Spring Boot. In questo tutorial, proverò a spiegare cosa ho imparato e come ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-impostare-lautorizzazione-e-lautenticazione-jwt-con-java-spring-boot/</link>
                <guid isPermaLink="false">63205a689a423c074eb492a5</guid>
                
                    <category>
                        <![CDATA[ spring boot ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Guido Cusani ]]>
                </dc:creator>
                <pubDate>Wed, 28 Sep 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/jwt.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-setup-jwt-authorization-and-authentication-in-spring/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Set Up Java Spring Boot JWT Authorization and Authentication</a>
      </p><p>Lo scorso mese, ho avuto la possibilità di implementare il sistema di autenticazione JWT per uno dei miei progetti. Ho lavorato precedentemente con JWT in Ruby on Rails, ma questa è stata la mia prima volta con Spring Boot.</p><p>In questo tutorial, proverò a spiegare cosa ho imparato e come l'ho applicato all'interno del mio progetto per condividere le mie esperienze, sperando che possano essere d'aiuto.</p><p>Inizieremo dando un rapido sguardo alla teoria dietro JWT e il suo funzionamento. Successivamente guarderemo insieme come implementarlo all'interno di una applicazione Spring Boot.</p><h2 id="fondamenti-di-jwt"><strong>Fondamenti di <strong>JWT</strong></strong></h2><p>JWT, o JSON Web Tokens (<a href="https://tools.ietf.org/html/rfc7519" rel="noopener">RFC 7519</a>), è uno standard comunemente usato per rendere sicure le API REST. Nonostante sia una tecnologia relativamente giovane è diventata rapidamente popolare.</p><p>Nel processo di autenticazione JWT, il front end (il client) invia per primo alcune credenziali da utilizzare per l'autenticazione (nel nostro caso, username e password, perché stiamo lavorando su una app web).</p><p>Il server (nel nostro caso l'app con Spring Boot) poi, controlla le credenziali ricevute, se sono valide genera il JWT e lo restituisce.</p><p>Dopo questo passaggio, il client deve inviare questo il token nell'intestazione di <strong>Autorizzazione </strong>della richiesta, nel modulo “Bearer TOKEN”. Il back end controllerà la validità del token e autorizzerà o meno la richiesta. Il token potrebbe anche contenere informazioni sull'utente e le relative autorizzazioni in base al suo ruolo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/1.jpg" class="kg-image" alt="1" width="600" height="400" loading="lazy"></figure><h2 id="implementazione"><strong>Implementazione</strong></h2><p>Adesso vediamo come implementare il meccanismo di login e salvataggio con JWT in una vera applicazione Spring Boot.</p><h3 id="dipendenze"><strong>Dipendenze</strong></h3><p>Puoi vedere la lista di dipendenze Maven di cui abbiamo bisogno nel codice qui sotto. Nota che le principali dipendenze, come Spring Boot e Hibernate, non sono incluse nello screenshot.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/2-1.png" class="kg-image" alt="2-1" width="600" height="400" loading="lazy"></figure><h3 id="salvataggio-utenti"><strong>Salvataggio Utenti</strong></h3><p>Inizieremo con la creazione dei controller per salvare gli utenti in modo sicuro e autenticarli in base ai loro username e password.</p><p>Abbiamo un'entità modello chiamata User. Questa è una semplice classe che mappa la tabella nel database chiamata <strong><strong>USER</strong>. </strong>Puoi usare qualsiasi proprietà di cui hai bisogno a seconda della tua applicazione. </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/3-1.png" class="kg-image" alt="3-1" width="600" height="400" loading="lazy"></figure><p>Abbiamo anche una semplice classe <strong>UserRepository</strong> per salvare gli utenti. Dobbiamo sovrascrivere il metodo <strong>findByUsername </strong>visto che lo useremo nell'autenticazione.</p><p>Creiamo un'interfaccia chiamandola <strong><strong>UserRepository</strong> </strong>e estendiamola con<strong> JpaRepository</strong>. Questa ci servirà<strong> </strong>per la gestione degli utenti. Inoltre c'è bisogno di sovrascrivere il metodo <strong><strong>findByUsername</strong> </strong>per l'autenticazione.</p><pre><code class="language-java">public interface UserRepository extends JpaRepository&lt;User, String&gt;{ 
    User findByUsername(String username); 
}</code></pre><p>Non dovremmo mai memorizzare le password nel database in testo non crittografato, perché molti utenti tendono ad usare la stessa password per più siti.</p><p>Esistono diversi algoritmi di hash, ma il più usato è <strong><strong>BCrypt </strong></strong>ed è un metodo sicuro per criptare le password. Puoi controllare <a href="https://security.blogoverflow.com/2013/09/about-secure-password-hashing/#:~:text=Passwords%20should%20be%20hashed%20with,providing%20most%20security%20is%20bcrypt.">questo</a> articolo per maggiori informazioni sull'argomento.</p><p>Per criptare le password definiamo un bean chiamato <strong><strong>BCrypt</strong> </strong>all'interno della <strong><strong>@SpringBootApplication</strong> </strong>e annotiamo la classe principale in questo modo:</p><pre><code class="language-java">@Bean public BCryptPasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder(); 
}</code></pre><p>Chiameremo i metodi all'interno di questo bean quando avremo bisogno di criptare una password.</p><p>Abbiamo anche bisogno di un controller, UserController, per salvare gli utenti. Una volta creato lo annotiamo con <strong><strong>@RestController</strong> </strong>e ne definiamo il corretto mapping.</p><p>Nella nostra applicazione, salveremo l'utente attraverso l'oggetto DTO ricevuto dal front end. Puoi anche passare un oggetto User attraverso il body sfruttando l'annotazione <strong><strong>@RequestBody</strong></strong>.</p><p>Dopo aver passato l'oggetto DTO, possiamo criptare il campo della password usando il suo getter passandolo al metodo che abbiamo definito nel bean <strong><strong>BCrypt</strong>. </strong>Potresti farlo anche nel controller, ma è una pratica migliore farlo nella classe service.</p><pre><code class="language-java">@Transactional(rollbackFor = Exception.class) 
public String saveDto(UserDto userDto) { 
    userDto.setPassword(bCryptPasswordEncoder
           .encode(userDto.getPassword())); 
    return save(new User(userDto)).getId(); 
}</code></pre><h3 id="filtro-di-autenticazione"><strong>Filtro di Autenticazione</strong></h3><p>Abbiamo bisogno dell'autenticazione per confermare che l'utente sia davvero chi dice di essere. A questo scopo, useremo la classica coppia username/password.</p><p>Ecco i passaggi per l'autenticazione:</p><ol><li>Creare un filtro di autenticazione che estende <strong><strong>UsernamePasswordAuthenticationFilter</strong></strong></li><li>Creare una classe per la configurazione della security che estende <strong><strong>WebSecurityConfigurerAdapter</strong> </strong>e applicare il filtro.</li></ol><p>Ecco il codice per il nostro filtro di autenticazione – come puoi immaginare, i filtri sono il fulcro di Spring Security.</p><figure class="kg-card kg-code-card"><pre><code>public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private AuthenticationManager authenticationManager;

    public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;

        setFilterProcessesUrl("/api/services/controller/user/login"); 
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest req,
                                                HttpServletResponse res) throws AuthenticationException {
        try {
            User creds = new ObjectMapper()
                    .readValue(req.getInputStream(), User.class);

            return authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(
                            creds.getUsername(),
                            creds.getPassword(),
                            new ArrayList&lt;&gt;())
            );
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest req,
                                            HttpServletResponse res,
                                            FilterChain chain,
                                            Authentication auth) throws IOException {
        String token = JWT.create()
                .withSubject(((User) auth.getPrincipal()).getUsername())
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .sign(Algorithm.HMAC512(SECRET.getBytes()));

        String body = ((User) auth.getPrincipal()).getUsername() + " " + token;

        res.getWriter().write(body);
        res.getWriter().flush();
    }
}</code></pre><figcaption><a href="https://gist.github.com/yigiterinc/74e24d263cc403a9057cf046d514860a#file-jwtauthenticationfilter-java">JWTAuthenticationFilter.java </a>hosted with ❤ by <a href="https://github.com/">GitHub</a></figcaption></figure><p>Analizziamo ogni step di questo codice.</p><p>Questa classe estende <strong><strong>UsernamePasswordAuthenticationFilter</strong>, </strong>che è la classe di default per l'autenticazione con password in Spring Security. L'abbiamo estesa per definire la nostra logica di autenticazione personalizzata.</p><p>Chiamiamo il metodo <strong><strong>setFilterProcessesUrl</strong> </strong>nel nostro costruttore. Questo metodo imposta l'URL di login di default al parametro dato.</p><p>Se rimuovi questa riga, Spring Security crea un endpoint <strong><strong>“/login”</strong> </strong>di default. Definisce l'endpoint per noi, motivo per cui non definiamo un endpoint di login esplicitamente nel nostro controller.</p><p>Dopo questa riga il nostro endpoint per il login sarà <strong><strong>/api/services/controller/user/login</strong></strong>. Puoi usare questa funzione essere coerente con i tuoi endpoint.</p><p>Sovrascriviamo i metodi <strong><strong>attemptAuthentication</strong> </strong>e <strong><strong>successfulAuthentication</strong> </strong>della classe <strong><strong>UsernameAuthenticationFilter</strong></strong>.</p><p>La funzione <strong><strong>attemptAuthentication</strong> </strong>verrà eseguita quando l'utente tenta di effettuare il login nell'applicazione. Legge le credenziali, crea un utente POJO e controlla le credenziali da autenticare.</p><p>Passiamo username, password e una lista vuota. La lista vuota rappresenta le autorità (ruoli). In questo caso, la lasciamo vuota perché non abbiamo ancora alcun ruolo nella nostra applicazione.</p><p>Se l'autenticazione va a buon fine, il metodo <strong><strong>successfulAuthentication</strong> </strong>viene eseguito. I valori dei parametri sono passati implicitamente da Spring Security.</p><p>Il metodo <strong><strong>attemptAuthentication</strong> </strong>restituisce un oggetto <strong><strong>Authentication</strong> </strong>che contiene le autorità passate nel frattempo.</p><p>Vogliamo restituire il token all'utente dopo la sua corretta autenticazione, quindi creiamo il token usando lo username, la chiave segreta e la data di scadenza. Definiamo quindi <strong><strong>SECRET</strong></strong> e <strong><strong>EXPIRATION_DATE</strong>.</strong></p><figure class="kg-card kg-code-card"><pre><code>public class SecurityConstants {

  public static final String SECRET = "SECRET_KEY";
  public static final long EXPIRATION_TIME = 900_000; // 15 mins
  public static final String TOKEN_PREFIX = "Bearer ";
  public static final String HEADER_STRING = "Authorization";
  public static final String SIGN_UP_URL = "/api/services/controller/user";
}</code></pre><figcaption><a href="https://gist.github.com/yigiterinc/9c612aaeb05234f4b89caf4204942a1e#file-securityconstants-java">SecurityConstants.java </a>hosted with ❤ by <a href="https://github.com/">GitHub</a></figcaption></figure><p>Abbiamo creato una classe che contiene le nostre costanti. Puoi definire qualsiasi chiave segreta tu voglia, ma una buona pratica è usare una chiave con una lunghezza uguale al tuo hash. In questo esempio, usiamo l'algoritmo <strong><strong>HS256</strong></strong>, quindi la chiave segreta è di 256 bit/32 caratteri.</p><p>La scadenza è impostata a 15 minuti, questo perché è considerata una buona abitudine per evitare che la nostra chiave sia soggetta ad attacchi di forza bruta. Il tempo è in millisecondi.</p><p>Abbiamo preparato il filtro di autenticazione, ma non è ancora attivo. Abbiamo anche bisogno di un filtro di autorizzazione, e li utilizzeremo entrambi attraverso una classe di configurazione.</p><p>Questo filtro controllerà l'esistenza e la validità del token nell'intestazione dell'autorizzazione. Specificheremo quali endpoint saranno soggetti a questo filtro nella classe di configurazione.</p><h3 id="filtro-di-autorizzazione"><strong>Filtro di autorizzazione</strong></h3><figure class="kg-card kg-code-card"><pre><code>public class JWTAuthorizationFilter extends BasicAuthenticationFilter {

    public JWTAuthorizationFilter(AuthenticationManager authManager) {
        super(authManager);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest req,
                                    HttpServletResponse res,
                                    FilterChain chain) throws IOException, ServletException {
        String header = req.getHeader(HEADER_STRING);

        if (header == null || !header.startsWith(TOKEN_PREFIX)) {
            chain.doFilter(req, res);
            return;
        }

        UsernamePasswordAuthenticationToken authentication = getAuthentication(req);

        SecurityContextHolder.getContext().setAuthentication(authentication);
        chain.doFilter(req, res);
    }

    // Reads the JWT from the Authorization header, and then uses JWT to validate the token
    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
        String token = request.getHeader(HEADER_STRING);

        if (token != null) {
            // parse the token.
            String user = JWT.require(Algorithm.HMAC512(SECRET.getBytes()))
                    .build()
                    .verify(token.replace(TOKEN_PREFIX, ""))
                    .getSubject();

            if (user != null) {
                // new arraylist means authorities
                return new UsernamePasswordAuthenticationToken(user, null, new ArrayList&lt;&gt;());
            }

            return null;
        }

        return null;
    }</code></pre><figcaption><a href="https://gist.github.com/yigiterinc/353558bb33a0d4bfb37c054bf3ef2abf#file-jwtauthorizationfilter-java">JWTAuthorizationFilter.java </a>hosted with ❤ by <a href="https://github.com/">GitHub</a></figcaption></figure><p>Il metodo <strong><strong>doFilterInternal</strong> </strong>intercetta la richiesta e controlla l'intestazione di Autorizzazione. Se l'header non è presente o non inizia per "BEARER" procede con la catena di filtri.</p><p>Se l'intestazione è presente, verrà invocato il metodo <strong><strong>getAuthentication</strong></strong>, che<strong> </strong>verifica il JWT e se il token è valido restituisce un token di accesso che Spring userà internamente.</p><p>Questo nuovo token è salvato nel SecurityContext. Se hai bisogno di un tipo di autorizzazione in base al ruolo puoi passare questo token in Authorities.</p><p>I nostri filtri sono pronti e dobbiamo farli entrare in azione grazie all'aiuto di una classe di configurazione.</p><h3 id="configurazione"><strong>Configurazione</strong></h3><figure class="kg-card kg-code-card"><pre><code>@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

    private UserDetailsServiceImpl userDetailsService;
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    public WebSecurity(UserDetailsServiceImpl userService, BCryptPasswordEncoder bCryptPasswordEncoder) {
        this.userDetailsService = userService;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().authorizeRequests()
                .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
                .anyRequest().authenticated()
                .and()
                .addFilter(new JWTAuthenticationFilter(authenticationManager()))
                .addFilter(new JWTAuthorizationFilter(authenticationManager()))
                // this disables session creation on Spring Security
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

        CorsConfiguration corsConfiguration = new CorsConfiguration().applyPermitDefaultValues();
        source.registerCorsConfiguration("/**", corsConfiguration);

        return source;
    }
}</code></pre><figcaption><a href="https://gist.github.com/yigiterinc/5aed60bcf1c53b34ed6b6e887158bbc0#file-websecurity-java">WebSecurity.java </a>hosted with ❤ by <a href="https://github.com/">GitHub</a></figcaption></figure><p>La classe è annotata con <strong><strong>@EnableWebSecurity</strong></strong> &nbsp;ed estende <strong><strong>WebSecurityConfigureAdapter</strong> </strong>per implementare la nostra logica per la sicurezza.</p><p>Sfruttiamo l'autowire del bean BCrypt che abbiamo definito precedentemente. Facciamo lo stesso con <strong><strong>UserDetailsService</strong> </strong>per<strong> </strong>trovare l'account dell'utente.<strong> </strong></p><p>Il metodo più importante è quello che accetta un oggetto <strong><strong>HttpSecurity</strong></strong>. Qui specifichiamo gli endpoint e i filtri che vogliamo applicare. Configuriamo il filtro CORS e permettiamo tutte le richieste POST al nostro URL di registrazione definito nella classe delle costanti.</p><p>Puoi aggiungere altri antMatchers per filtrare gli URL e i ruoli. Puoi leggere <a href="https://stackoverflow.com/questions/44067650/spring-security-role-based-access">questa discussione </a>su StackOverflow per vedere un esempio. L'altro metodo configura l'<strong><strong>AuthenticationManager</strong> </strong>per usare l'oggetto codificatore per poter codificare le password durante il controllo delle credenziali.</p><h3 id="testing"><strong><strong>Testing</strong></strong></h3><p>Inviamo qualche richiesta per testare se funziona a dovere.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/4.png" class="kg-image" alt="4" width="600" height="400" loading="lazy"></figure><p>In questo esempio, abbiamo inviato una richiesta GET per accedere ad una risorsa protetta. Il nostro server risponde con un codice 403. È quello che ci aspettavamo poiché non abbiamo fornito il token nell'intestazione. Adesso, creiamo un utente:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/5.png" class="kg-image" alt="5" width="600" height="400" loading="lazy"></figure><p>Per la creazione di un utente abbiamo inviato una richiesta POST contenente i dati DTO User. Useremo questo utente per effettuare un login e ottenere il token. </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/6.png" class="kg-image" alt="6" width="600" height="400" loading="lazy"></figure><p>Grande! Abbiamo il token. A questo punto lo useremo per poter accedere a risorse protette.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/7.png" class="kg-image" alt="7" width="600" height="400" loading="lazy"></figure><p>Abbiamo fornito il token nella chiave di Autorizzazione dell'intestazione e adesso abbiamo il permesso di accedere all'endpoint protetto.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo tutorial, ti ho guidato attraverso gli step che ho intrapreso per implementare l'autorizzazione JWT e l'autenticazione con password in Spring Boot. Inoltre abbiamo anche imparato come gestire un utente in modo sicuro.</p><p>Grazie per aver letto questo articolo – spero ti sia stato d'aiuto. </p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ npm uninstall – Come rimuovere un pacchetto ]]>
                </title>
                <description>
                    <![CDATA[ Node Package Manager (NPM) offre vari comandi che ti permettono di lavorare con i pacchetti.  Proprio come è possibile installare pacchetti dalla libreria npm, così puoi anche disinstallarli. Per disinstallare un pacchetto, puoi usare l'apposito comando di npm – npm uninstall. In realtà, il modo per rimuovere un pacchetto ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/npm-uninstall-come-rimuovere-un-pacchetto/</link>
                <guid isPermaLink="false">631f31779a423c074eb49145</guid>
                
                    <category>
                        <![CDATA[ NPM ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Guido Cusani ]]>
                </dc:creator>
                <pubDate>Thu, 15 Sep 2022 11:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/shut-down-g5ad24366d_1280.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/npm-uninstall-how-to-remove-a-package/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">npm Uninstall – How to Remove a Package</a>
      </p><p>Node Package Manager (NPM) offre vari comandi che ti permettono di lavorare con i pacchetti. </p><p>Proprio come è possibile installare pacchetti dalla libreria npm, così puoi anche disinstallarli.</p><p>Per disinstallare un pacchetto, puoi usare l'apposito comando di npm – <code>npm uninstall</code>.</p><p>In realtà, il modo per rimuovere un pacchetto regolare o una dipendenza non è lo stesso con cui rimuovere un pacchetto globale o una dev dependency.</p><p>In questo articolo, ti mostrerò come disinstallare un pacchetto regolare, un pacchetto globale e una dev dependency.</p><h2 id="come-rimuovere-un-pacchetto-con-npm-uninstall"><strong>Come rimuovere un pacchetto con <code>npm uninstall</code></strong></h2><p>Per rimuovere un pacchetto con il comando <code>npm uninstall</code>, &nbsp;puoi usare questa sintassi <code>npm uninstall nome-pacchetto</code> nella cartella in cui è presente il pacchetto.</p><p>Il pacchetto che utilizzerò per dimostrarti come fare è Express – un framework di NodeJS.</p><p>Nello screenshot qui sotto, puoi vedere che Express è nella lista come una dipendenza nel file <code>package.json</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-1.png" class="kg-image" alt="ss-1" width="600" height="400" loading="lazy"></figure><p>Ma dopo aver avviato il comando <code>npm uninstall express</code>, non vedrai più Express nella lista delle dipendenze:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-2.png" class="kg-image" alt="ss-2" width="600" height="400" loading="lazy"></figure><p>Come puoi vedere Express non è più presente. Non è nemmeno più presente la chiave della dipendenza perché la dipendenza è stata eliminata.</p><h2 id="come-rimuovere-una-dev-dependency-con-npm-uninstall"><strong>Come rimuovere una Dev Dependency con <code>npm u<strong>ninstall</strong></code></strong></h2><p>Una dev dependency, o dipendenza di sviluppo, è un pacchetto usato esclusivamente durante lo sviluppo.</p><p>Per rimuovere una dev dependency, devi aggiungere l'opzione <code>-D</code> o <code>--save-dev</code> all'interno del comando <code>npm uninstall</code> e specificare il nome del pacchetto.</p><p>La sintassi base per farlo è <code>npm uninstall -D nome-pacchetto</code> o <code>npm uninstall --save-dev nome-pacchetto</code>.</p><p>Devi eseguire il comando all'interno della cartella in cui è presente la dipendenza.</p><p>Userò Nodemon per dimostrarti come rimuovere questo tipo di dipendenza.</p><p>Nodemon ti permette di ricaricare automaticamente le app con NodeJS ogni volta che viene rilevato un cambiamento nel file o nella cartella durante lo sviluppo.</p><p>In questo screenshot puoi vedere Nodemon presente nella lista come dev dependency.<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-3.png" class="kg-image" alt="ss-3" width="600" height="400" loading="lazy"></figure><p>Per rimuoverlo eseguirò <code>npm uninstall –D nodemon</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-4.png" class="kg-image" alt="ss-4" width="600" height="400" loading="lazy"></figure><p>Come puoi vedere, Nodemon non è più presente nel file <code>package.json</code>.</p><h2 id="come-rimuovere-un-pacchetto-globale-con-npm-uninstall"><strong>Come rimuovere un pacchetto globale<strong> </strong>con <code>npm uninstall</code></strong></h2><p>Un pacchetto globale è un pacchetto che è installato globalmente nella tua macchina, quindi non è necessario installarlo ogni volta che ne hai bisogno.</p><p>Per rimuovere un pacchetto globale, hai bisogno di aggiungere l'opzione <code>-g</code> a <code>npm uninstall</code> e specificare il nome del pacchetto.</p><p>La sintassi base per fare questo è <code>npm uninstall -g nome-pacchetto</code>.</p><p>Per mostrarti come rimuovere un pacchetto globale userò un pacchetto chiamato CORS (Cross-Origin Resource Sharing).</p><p>CORS blocca la SOP (Same Origin Policy) dei browser, così tu possa fare richieste da un browser a un altro.</p><p>Nello screenshot qui sotto, puoi vedere che CORS non è presente come pacchetto nel file <code>package.json</code>. <br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-5.png" class="kg-image" alt="ss-5" width="600" height="400" loading="lazy"></figure><p>CORS non è elencato perché è installato globalmente nella macchina, non nella cartella del progetto.</p><p>Se vuoi vedere un pacchetto installato globalmente puoi usare questo comando: <code>npm list -g</code>.<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-6.png" class="kg-image" alt="ss-6" width="600" height="400" loading="lazy"></figure><p>Come puoi vedere, adesso CORS è presente nella lista come un pacchetto globale.</p><p>Per eliminare CORS globalmente eseguirò questo comando: <code>npm uninstall -g cors</code>.</p><p>Dopo averlo eseguito, puoi vedere che non c'è più il pacchetto CORS con <code>npm list –g</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-7.png" class="kg-image" alt="ss-7" width="600" height="400" loading="lazy"></figure><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo, hai imparato i vari modi per disinstallare diversi tipi di pacchetti NPM, così da avere un maggior controllo del codebase e rimuovere pacchetti non necessari.</p><p>Grazie per aver letto questo articolo.</p><p>Se lo hai trovato utile, condividilo così che anche altri possano vederlo.<br></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
