<?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" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Treviso JS - Medium]]></title>
        <description><![CDATA[JavaScript e Prosecco a Treviso - Medium]]></description>
        <link>https://medium.com/treviso-js?source=rss----3b60176679cc---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Treviso JS - Medium</title>
            <link>https://medium.com/treviso-js?source=rss----3b60176679cc---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 19:02:07 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/treviso-js" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Come creare un sito Web con Nuxt.js]]></title>
            <link>https://medium.com/treviso-js/come-creare-un-sito-web-con-nuxt-js-14973ce8cb47?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/14973ce8cb47</guid>
            <category><![CDATA[vuejs]]></category>
            <category><![CDATA[nuxtjs]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[website-development]]></category>
            <dc:creator><![CDATA[Roberto Butti]]></dc:creator>
            <pubDate>Tue, 22 Aug 2017 20:07:10 GMT</pubDate>
            <atom:updated>2017-08-22T20:07:09.627Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EVWa5PAbLOH3fYvAz3c62g.png" /><figcaption>Come creare da zero un sito Web con Nuxt.js</figcaption></figure><p>Nuxt.js è un framework frontend per la creazione di applicazioni e di siti Web con caratteristiche molto interessanti come il <strong>Server Side Rendering</strong> (<strong>SSR</strong>), l’organizzazione del codice a pagine e componenti, l’hot reloading in fase di sviluppo, il building degli assets, la generazione di siti statici (quindi senza necessità di Node.js o linguaggi server side) e molto altro.</p><p>I pilastri di Nuxt.js sono:<strong> Vue.js</strong> (per la gestione/coding del frontend) e <strong>Webpack</strong> (per la gestione del flusso di sviluppo), quindi se avete delle competenze con questi due strumenti, sicuramente vi troverete a vostro agio con Nuxt.js. Invece a chi è nuovo a tutto questo mondo, direi di stare sereni, la curva di apprendimento è veramente molto bassa.</p><h3>Installazione e setup di Nuxt.js</h3><p>Per inizializzare l’ambiente locale con il framework Nuxt.js avete due opzioni: partire “from scratch” oppure utilizzare un template messo a disposizione dai creatori di Nuxt.js. In realtà, se approfondirete la questione, scoprirete che ci sono un sacco di template di partenza molto interessanti. Il mio suggerimento è quello (per ora) di partire dal template base. Per effettuare il setup con tale template, occorre utilizzare <strong>vue-cli</strong>, uno strumento a linea di comando che automatizza alcuni passaggi con Vue.js (ricordo Vue.js è alla base di Nuxt.js).</p><p>Se non avete vue-cli installato, installarlo tramite il solito npm:</p><pre>npm install -g vue-cli<br>vue --version</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HCwBQQ3dbLyttpiiSq4GfA.png" /><figcaption>Installazione di vue-cli</figcaption></figure><p>Con il comando <em>vue</em> installato è possibile procedere con la configurazione di Nuxt.js:</p><pre>vue init nuxt/starter nuxt_website</pre><p>dove <em>nuxt_website</em> è il nome della directory in cui verrà creata tutta la struttura di files necessaria per iniziare a sviluppare con Nuxt.js.</p><p>Il comando <em>vue init nuxt/starter</em> è interattivo, pone alcune domande come:</p><ul><li>nome del progetto (senza spazi);</li><li>descrizione progetto;</li><li>autore.</li></ul><p>Una volta completata l’esecuzione del comando <em>vue init</em>, entrare nella directory appena creata ed installare i pacchetti necessari a Nuxt.js tramite il comando <em>npm install</em>:</p><pre>cd nuxt_website<br>npm install</pre><p>Quindi eseguire il server di sviluppo tramite il comando:</p><pre>npm run dev</pre><p>Tale comando prima di avviare il server locale:</p><ul><li>esegue un controllo formale e sintattico dei files;</li><li>ricompila gli assets;</li><li>ricarica al volo la pagina a seguito di una modifica tramite hot reload.</li></ul><h3>Comandi Nuxt.js</h3><p>Nel file <em>package.json</em> nella sezione <em>script</em> sono presenti una serie di comandi utili per lo sviluppo e per la generazione degli assets da utilizzare per l’ambiente di produzione:</p><ul><li><em>npm run dev</em>: è utile per poter avviare il server locale in modalità hot reloading (con check formale dei files);</li><li><em>npm run build</em>: utile per “fare la build” e quindi creare gli assets necessari per gli ambienti di pre produzione o produzione;</li><li><em>npm run start</em>: per avviare il server locale senza però effettuare il processo di build ma utilizzando i file e assets generati dal comando <em>npm run build</em>;</li><li><em>npm run generate</em>: genera i file necessari affinché il progetto sia eseguibile in modalità statica.</li></ul><h3>Caso di esempio</h3><p>Per dimostrare la potenza e la facilità di utilizzo di Nuxt.js, partiamo da un tipico caso di utilizzo. In realtà è un caso semplificato, ma utile per vedere i vari passaggi.</p><p>L’obiettivo è quello di creare un minisito con una struttura del tipo:</p><ul><li>home page che risponde alla rotta <em>/</em></li><li>pagina prodotti che risponde alla rotta<em> /prodotti</em></li><li>pagine dettaglio prodotto che rispondono alle rotte <em>/prodotto/:slugprodotto</em></li></ul><p>I prodotti saranno censiti in un file JSON con una struttura del tipo:</p><ul><li><em>slug</em>: o identificativo, utile per la creazione dell’URL univoca di dettaglio prodotto;</li><li><em>id</em>: identificatore;</li><li><em>name</em>: nome del prodotto, da utilizzare anche nel titolo di pagina</li><li><em>description</em>: descrizione del prodotto, da utilizzare anche nel meta description;</li><li><em>imageUrl</em>: immagine di dettaglio prodotto;</li><li><em>thumbnailUrl</em>: immagine più piccola utile per il listing di prodotti;</li><li><em>price</em>: il prezzo</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fFHXUJvLsKWyuLGgz3d2jA.png" /><figcaption>File JSON contenente i prodotti</figcaption></figure><h3>Pagine, routing e componenti</h3><p>Prima di procedere con l’implementazione è necessario spendere due parole sul meccanismo di routing utilizzato in Nuxt.js.<br>Nella directory <em>pages</em> di Nuxt.js sono presenti directories e files con estensione <em>vue</em>.<br>I nomi di file e i nomi di directories sono importanti perchè utilizzati per comporre le rotte.</p><p><strong>Esempio:</strong> se si volesse una rotta <em>/prodotti</em> è sufficiente creare un file <em>vue</em> di nome <em>prodotti</em> sotto la directory <em>pages/</em>.</p><p>Se si volesse avere una rotta <em>/prodotto/principale</em> è sufficiente creare una directory <em>prodotto/</em> sotto la directory <em>pages/</em> in cui creare un file <em>vue</em> di nome <em>principale</em> (<em>pages/prodotto/principale.vue</em>).</p><p>Ci sono dei casi particolari, come la home page e le rotte dinamiche.<br>Per avere la home page è sufficiente creare un file <em>index.vue</em> sotto la directory <em>pages/</em> (<em>pages/index.vue</em>).</p><p>Per avere le rotte dinamiche con un parametro, occorre utilizzare il carattere <strong>_</strong> nella definizione del nome del file .vue.</p><p>Nel nostro caso, creiamo:</p><ul><li><em>pages/index.vue</em>: la home page;</li><li><em>pages/prodotti.vue</em>: la pagina con elenco prodotti;</li><li><em>pages/prodotto/_slug.vue</em>: la pagina di dettaglio prodotto, l’ultima parte dell’URL è utilizzato come “slug” e utilizzato come parametro. Nel caso corrente, esempi di URL valide sono: <em>/prodotto/ananas</em> (in questo caso lo slug è <em>ananas</em>) e <em>/prodotto/keyboard</em> (in questo caso lo slug è <em>keyboard</em>).</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/450/1*91Tb6dn7rlHiNMMcr5gIsg.png" /><figcaption>I files creati nella directory pages/</figcaption></figure><h3>Creazione dell’Home page</h3><p>Nella directory pages, troviamo già un file index.vue. Quel file rappresenta la home page.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rKFnwFas5-hWYhqqi5Xl2Q.png" /><figcaption>La home page</figcaption></figure><p>Il file relativo alla home page è:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f399ed196ba32a40366ab4d3e506bc69/href">https://medium.com/media/f399ed196ba32a40366ab4d3e506bc69/href</a></iframe><p>Due sono le cose interessanti in questo primo file:</p><ul><li>l’organizzazione a componenti con le classiche sezioni: template / script / style</li><li>il meccanismo di link utilizzato da Nuxt.js tramite il componente <em>nuxt-link</em>.</li></ul><h4>Meccanismo di linking</h4><p>Nella sezione <em>template</em> troviamo un tag “custom” : <em>nuxt-link</em>. Questo è un componente vue implementato da Nuxt.js e serve per creare i link tra pagine e rotte interne. Per esempio in questo caso rimandiamo alla pagina Prodotti:</p><pre>&lt;nuxt-link to=&quot;/prodotti&quot;  class=&quot;button--green&quot;&gt;Prodotti&lt;/nuxt-link&gt;</pre><p>Come si nota, al componente <em>nuxt-link</em> è possibile passare diversi attributi, alcuni specifici per il componente stesso (come l’attributo <em>to</em>) e alcuni specifici per il classico html (come l’attributo <em>class</em>).<br>La sintassi per invocare <em>nuxt-link</em> è la stessa di <em>router-link</em> (fornito da <em>router-vue</em>, modulo pesantemente utilizzato da Nuxt.js)<br><a href="https://router.vuejs.org/en/api/router-link.html">https://router.vuejs.org/en/api/router-link.html</a></p><h3>Creazione pagina prodotti</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZmsRJWgzZlY8Ks30hSjrmg.png" /></figure><p>La pagina prodotti risponde all’URL <em>/prodotti</em>, e per questo è stato creato un file <em>prodotti.vue</em> sotto la directory <em>pages/</em>.</p><p>La sezione <em>script</em> del file <em>prodotti.vue</em> è:</p><pre>&lt;script&gt;<br>import products from &#39;~/static/products-list.json&#39;<br>export default {<br>  asyncData (context) {<br>    var howmany = Object.keys(products).length<br>    return {<br>      products: products,<br>      howmany: howmany,<br>      headtitle: &#39;Elenco prodotti&#39;<br>    }<br>  },<br>  head () {<br>    return {<br>      title: this.headtitle + &#39;(&#39; + this.howmany + &#39; products)&#39;<br>    }<br>  }<br>}<br>&lt;/script&gt;</pre><p>Gli aspetti interessanti di questa sezione <em>script</em> sono a mio avviso:</p><ul><li>la modalità di caricamento del file JSON tramite direttiva import. Tale metodo è valido sia per quanto la pagina è caricata server side che client side;</li><li>il file JSON è memorizzato sotto la directory <em>static/</em>;</li><li>il carattere ~ nella definizione del file da importare (tale carattere assume il significato di: la directory dei sorgenti);</li><li>l’utilizzo del metodo <em>asyncData()</em> per il caricamento dei parametri da utilizzare poi nella sezione template secondo la sintassi <em>{{ parametro }}</em>;</li><li>l’utilizzo del parametro <em>context</em>, come primo parametro del metodo <em>asyncData</em>. Provate a fare un <em>console.log()</em> di quel <em>context</em> e troverete un sacco di cose interessanti;</li><li>il metodo <em>head()</em>: per l’impostazione dei tag presenti nella sezione head della pagina poi generata. Utile per avere il controllo anche di tutte quelle impostazioni SEO. Nell’esempio nella pagina prodotti è stato impostato un titolo di pagina, con evidente accesso anche ai parametri impostati nel metodo <em>asyncData</em>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d6uRBwOr41Y0t6K0gqsIcg.png" /><figcaption>sezione script nel file prodotti.json</figcaption></figure><p>Il file <em>prodotti.vue</em> è disponibile all’URL: <a href="https://github.com/roberto-butti/nuxtjs-tutorial/blob/master/pages/prodotti.vue">https://github.com/roberto-butti/nuxtjs-tutorial/blob/master/pages/prodotti.vue</a></p><p>Il file JSON: <a href="https://github.com/roberto-butti/nuxtjs-tutorial/blob/master/static/products-list.json">https://github.com/roberto-butti/nuxtjs-tutorial/blob/master/static/products-list.json</a></p><h3>Creazione pagina dettaglio prodotto</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yuZxCph6fMduup0Bfad_3w.png" /><figcaption>La pagina di dettaglio prodotto</figcaption></figure><p>Anche in questo caso la pagina vue, carica il file JSON con la stessa modalità della pagina precedente. La nota interessante su questa pagina è il recupero del parametro nell URL: /prodotto/ananas.</p><p>Il metodo asyncData() riceve come parametro context. Tale oggetto contiene anche l’oggetto params il quale contiene tutti i parametri di input. Nel caso della pagina corrente (pages/prodotto/_slug.vue) il parametro è “slug” e lo si può recuperare tramite <em>context.params.slug</em>.</p><pre>&lt;script&gt;<br>import products from &#39;~/static/products-list.json&#39;<br>export default {<br>  asyncData (context) {<br>    console.log(context.params.slug)<br>    console.log(products[context.params.slug])<br>    return { slug: context.params.slug, product: products[context.params.slug] }<br>  },<br>  head () {<br>    return {<br>      title: &#39;Prodotto - &#39; + this.product.name,<br>      meta: [<br>        { hid: &#39;description&#39;, name: &#39;description&#39;, content: &#39;Descrizione prodotto&#39; }<br>      ]<br>    }<br>  }<br>}<br>&lt;/script&gt;</pre><p>Il file _slug.vue completo è: <a href="https://github.com/roberto-butti/nuxtjs-tutorial/blob/master/pages/prodotto/_slug.vue">https://github.com/roberto-butti/nuxtjs-tutorial/blob/master/pages/prodotto/_slug.vue</a></p><p>Il repository completo e i sorgenti li si possono trovare direttamente qui: <a href="https://github.com/roberto-butti/nuxtjs-tutorial">https://github.com/roberto-butti/nuxtjs-tutorial</a>.</p><h3>Conclusione</h3><p>Questa è una veloce panoramica su alcuni aspetti di Nuxt.js, però vi può mettere in pista per poter fare i vostri primi esperimenti. Sicuramente ci sono un sacco di approfondimenti da fare, fatemi sapere se volete che mi focalizzi su qualche aspetto in particolare.</p><p>Al momento sto usando Nuxt.js e questo tipo di approccio SSR (Server Side Rendering) per piccoli siti ove non è prevista una manutenzione di contenuti da un classico team editoriale. La differenza sostanziale è che questo tipo di approccio, permette di evitare logiche esplicite server side, quindi evitare di installare il classico CMS sul server di produzione, ed evitare di avere un Database.</p><p>Al prossimo articolo vediamo come generare il progetto statico per poterlo rendere disponibile tramite ambiente di produzione.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=14973ce8cb47" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/come-creare-un-sito-web-con-nuxt-js-14973ce8cb47">Come creare un sito Web con Nuxt.js</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Primi passi con Webpack e Vue.js 103]]></title>
            <link>https://medium.com/treviso-js/primi-passi-con-webpack-e-vue-js-103-b6737ce659f?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/b6737ce659f</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[workflow]]></category>
            <category><![CDATA[webpack]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[vuejs]]></category>
            <dc:creator><![CDATA[Roberto Butti]]></dc:creator>
            <pubDate>Tue, 30 May 2017 15:15:31 GMT</pubDate>
            <atom:updated>2017-05-30T15:25:55.853Z</atom:updated>
            <content:encoded><![CDATA[<p>Componenti VUE, come organizzare il codice (template, script, style) e sfruttare gli automatismi Webpack.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mwCUhtVD6iHZCvMO68tyyQ.png" /><figcaption>Come utilizzare componenti Vue in un flusso di lavoro Webpack</figcaption></figure><p>Dopo aver visto come installare <a href="https://medium.com/treviso-js/come-impostare-un-workflow-con-webpack-da-zero-599ba85b0bba">WebPack</a> e <a href="https://medium.com/treviso-js/primi-passi-con-webpack-e-vue-js-es6-babel-102-6c27d3741a80">Babel</a>, vediamo come aggiungere al proprio ambiente di sviluppo anche<em> Vue Loader</em>, un modulo che permette di organizzare il proprio codice a moduli <em>Vue</em>. Un modulo Vue, tipicamente contiene le sezioni:</p><ul><li>“<em>template</em>”: il codice HTML;</li><li>“<em>script</em>”: la logica Javascript;</li><li>“<em>style</em>”: la personalizzazione grafica (CSS).</li></ul><p>In ciascuna sezione è possibile utilizzare i “dialetti” preferiti, per esempio JADE per il template, e SCSS per lo style.</p><h3>Aggiungere i pacchetti necessari</h3><p>Per aggiungere i pacchetti legati a VUE necessari, utilizzare come al solito, utilizziamo il comando yarn:</p><pre>yarn add css-loader node-sass sass-loader --save <br>yarn add vue vue-loader vue-template-compiler --save</pre><p>Tale comando aggiornerà i vari file <em>package.json</em> e <em>yarn.lock</em> e procederà in autonomia con l’installazione dei pacchetti.</p><h3>Aggiornamento webpack.config.js</h3><p>Apportare le modifiche al file <em>webpack.config.js</em> in modo venga attivato Vue Loader.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/40a2033d3a8aa783f5bbad8d12d2c2d1/href">https://medium.com/media/40a2033d3a8aa783f5bbad8d12d2c2d1/href</a></iframe><p>In sostanza, le modifiche effettuate al <em>webpack.config.js</em> sono:</p><ul><li>caricamento vue-loader;</li><li>aggiunta di una regola (module/rules) in modo che venga abilitato Vue Loader con le opzioni per il riconoscimento di SCSS e SASS;</li><li>aggiunta di un alias per Vue.</li></ul><p>Fatto questo è possibile implementare il nostro primo modulo Vue.</p><p>Creare la directory <em>src/components/</em> in cui creare il file <em>Timer.vue</em>.</p><p>Il componente <em>Vue</em> di esempio <em>Timer.vue</em> è composto da tre sezioni: template, script e style. In un unico file abbiamo tutto quel che serve al nostro modulo “Timer”.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6fb5e5da3e8b47ee02fab383e520bebc/href">https://medium.com/media/6fb5e5da3e8b47ee02fab383e520bebc/href</a></iframe><p>Nel file HTML ora è possibile dichiarare un tag chiamato <em>timer</em>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0fdbb1d3b93192df05aaf9928c3b2282/href">https://medium.com/media/0fdbb1d3b93192df05aaf9928c3b2282/href</a></iframe><p>Abbiamo implementato il componente e abbiamo definito la pagina in cui risiederà il componente, ora è sufficiente registrare il componente e attivarlo.</p><p>Nel file <em>app.js</em>, creiamo una istanza di <em>Vue</em> e carichiamo il componente (con il metodo <em>Vue.component</em> a cui passiamo il nome del tag custom HTML utilizzato e il nome del file con estensione <em>.vue</em>)e :</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/bd4dd4dc527871124e78bdf535895338/href">https://medium.com/media/bd4dd4dc527871124e78bdf535895338/href</a></iframe><p>Avviare il server di sviluppo locale con il comando:</p><pre>webpack-dev-server --inline</pre><p>Aprire il browser e accedere all’URL <a href="http://localhost:8080/">http://localhost:8080/</a> (o all’URL visualizzato al momento del lancio di <em>webpack-dev-server</em>) per verificarne il funzionamento.</p><h3>Che cosa abbiamo fatto</h3><p>Riepiloghiamo cosa abbiamo fatto i questi 3 articoli. Abbiamo creato ambiente di sviluppo locale in cui è possibile strutturare l’applicazione Vue in componenti e soprattutto abbiamo attivato un workflow tale per cui ad ogni modifica apportata ai sorgenti, vengono attivati automaticamente una serie di task (traduzione ES6, traduzione SASS / SCSS). L’effetto ottenuto è che il browser riporta in tempo reale tutte le modifiche mentre stiamo i nostri componenti VUE.</p><p>Parte 1:</p><p><a href="https://medium.com/treviso-js/come-impostare-un-workflow-con-webpack-da-zero-599ba85b0bba">Primi passi con Webpack e Vue.js 101</a></p><p>Parte 2:</p><p><a href="https://medium.com/treviso-js/primi-passi-con-webpack-e-vue-js-es6-babel-102-6c27d3741a80">Primi passi con Webpack e Vue.js 102</a></p><p>Parte 3: in questo articolo abbiamo visto come attivare “Vue Loader” e agganciarlo al flusso di sviluppo in modo da poter organizzare il codice in componenti Vue sfruttando gli automatismi configurati nelle parti 1 e 2.</p><p><a href="https://github.com/roberto-butti/tomato">roberto-butti/tomato</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b6737ce659f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/primi-passi-con-webpack-e-vue-js-103-b6737ce659f">Primi passi con Webpack e Vue.js 103</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Primi passi con Webpack e Vue.js 102]]></title>
            <link>https://medium.com/treviso-js/primi-passi-con-webpack-e-vue-js-es6-babel-102-6c27d3741a80?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/6c27d3741a80</guid>
            <category><![CDATA[babeljs]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[webpack]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[es6]]></category>
            <dc:creator><![CDATA[Roberto Butti]]></dc:creator>
            <pubDate>Mon, 10 Apr 2017 08:13:44 GMT</pubDate>
            <atom:updated>2017-04-10T08:14:46.352Z</atom:updated>
            <content:encoded><![CDATA[<p>Come utilizzare ES6 e abilitare Babel nel flusso di build con Webpack.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JAJn9kdF_JwYwQ_lAZUKmw.png" /><figcaption>Utilizzare ES6 tramite Webpack e Babeljs</figcaption></figure><p><strong><em>ES6</em></strong> è l’evoluzione del linguaggio <em>Javascript </em>che ha l’obiettivo di migliorarne la leggibilità, la semplicità e aumentarne la potenza espressiva.<br>Molti browser supportano ES6 in maniera parziale. Per questo esistono strumenti come Babel che permettono di tradurre codice scritto secondo la sintassi ES6 in Javascript “classico”.<br>Questo significa che ad ogni modifica a file ES6 occorre “ricompilare” il file per poter ottenere il file in formato Javascript “classico”.</p><h3>Babel</h3><p>Lo strumento che ci permette di tradurre la sintassi <em>ES6</em> in sintassi <em>Javascript</em> è <em>Babel</em>.</p><p>Tramite il package manager <em>Yarn</em>, aggiungere quel che serve per poter utilizzare <em>Babel</em>:</p><pre>yarn add babel-core babel-loader babel-plugin-transform-runtime babel-preset-es2015 --save</pre><p>Il comando, installa i vari moduli che servono e aggiunge le righe necessarie ai files <em>package.json</em> e <em>yarn.lock</em>.</p><h3>Attivare la compilazione ES6</h3><p>Nel file <em>webpack.config.js</em> aggiungere le regole per la compilazione <em>ES6</em>:</p><pre>module: {<br>    rules: [{<br>        test: /\.js$/,<br>        include: path.resolve(__dirname, &#39;src&#39;),<br>        use: [{<br>            loader: &#39;babel-loader&#39;,<br>            options: {<br>                plugins: [&#39;transform-runtime&#39;]<br>            }</pre><pre>        }]<br>    }]<br>},</pre><h3>Aggiungere il file .babelrc</h3><p>Creare il file <em>.babelrc</em> .</p><p>Attenzione, tale file è fondamentale, senza di esso il processo di build non fornisce nessun errore ma non viene attivato il processo di “compilazione”.<br>Il file <em>.babelrc</em> di esempio:</p><pre>{<br>  &quot;presets&quot;: [<br>    [&quot;es2015&quot;]<br>  ],<br>  &quot;plugins&quot;: [&quot;babel-plugin-transform-runtime&quot;],<br>  &quot;comments&quot;: false<br>}</pre><h3>Testare il corretto funzionamento</h3><p>Per testare la corretta attivazione di Babel nel processo di “build”, provare a utilizzare una funzionalità specifica presente in ES6 e non in Javascript “classico”. Per esempio, nel file <em>app.js</em> (nella directory <em>src/</em>), stampare la stringa “Hello World!” tramite una “arrow function” (funzionalità presente in ES6):</p><pre>const f = m =&gt;{<br> console.log(m)<br>}</pre><pre>f(&quot;Hello World!&quot;);</pre><p>Nel web inspector del vostro browser ora dovreste trovare nella Console il vostro “Hello world!”.<br>Questo potrebbe essere un test non completamente affidabile, infatti se il browser utilizzato supporta le arrow function, vedreste comunque la stringa “Hello World!”.<br>Per effettuare una verifica completa, ispezionare il contenuto del file <em>dist/app.bundle.js</em> e verificare che la funzione f() definita in ES6 è stata tradotta con un codice JS “classico”:</p><pre>var f = function f(m) {<br> console.log(m);<br>};</pre><pre>f(&quot;Hello World!&quot;);</pre><h3>Pronti per Vue.js</h3><p>In questo modo abbiamo abilitato Babel nel nostro processo di sviluppo (e di conseguenza la possibilità di utilizzare sintassi e funzionalità ES6).</p><p>Partendo dal <a href="https://medium.com/treviso-js/come-impostare-un-workflow-con-webpack-da-zero-599ba85b0bba">precedente articolo (setup Webpack)</a> e da questo articolo (setup Babel) siamo pronti per il prossimo step, dove aggiungeremo tutto quel che serve per avere Vue.js in questo flusso di lavoro.</p><p>I codici sorgenti per questo articolo li potete trovare su Github nel progetto “tomato”, tag “Webpack_babel”:</p><p><a href="https://github.com/roberto-butti/tomato/tree/Webpack_Babel">roberto-butti/tomato</a></p><h3><strong>Parte 1:</strong></h3><p><a href="https://medium.com/treviso-js/come-impostare-un-workflow-con-webpack-da-zero-599ba85b0bba">Primi passi con Webpack e Vue.js 101</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6c27d3741a80" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/primi-passi-con-webpack-e-vue-js-es6-babel-102-6c27d3741a80">Primi passi con Webpack e Vue.js 102</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Primi passi con Webpack e Vue.js 101]]></title>
            <link>https://medium.com/treviso-js/come-impostare-un-workflow-con-webpack-da-zero-599ba85b0bba?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/599ba85b0bba</guid>
            <category><![CDATA[webpack]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[yarn]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[tutorial]]></category>
            <dc:creator><![CDATA[Roberto Butti]]></dc:creator>
            <pubDate>Mon, 03 Apr 2017 08:55:17 GMT</pubDate>
            <atom:updated>2017-05-19T14:50:40.403Z</atom:updated>
            <content:encoded><![CDATA[<p>Come impostare un workflow con Webpack da zero</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8SbuUKm5E_miKViUrogGqA.png" /><figcaption>Primi passi con Webpack e Vue.js</figcaption></figure><p>Vorrei documentare e condividere la mia esperienza di avvicinamento a Webpack, yarn e Vue. In questo primo articolo vorrei illustrare i passi necessari per poter installare e configurare Webpack al fine di creare una web app molto elementare. Con gli articoli successivi, vorrei approfondire Vue.</p><p><strong>Obiettivo</strong>: creare una pagina html che includa un file Javascript il cui compito è quello di stampare la stringa “Hello World” nella Console, tramite il comando console.log(). Questo obiettivo molto semplice, ci serve per focalizzare l’attenzione sugli step necessari per poter impostare un workflow elementare di sviluppo tramite Webpack.</p><h3>Yarn</h3><p>Per la gestione dei pacchetti ci affideremo a <a href="https://yarnpkg.com/en/docs/getting-started">Yarn</a>.</p><p>Per installare Yarn su macosx, consiglio di utilizzare brew:</p><pre>brew install yarn</pre><p>Per inizializzare il progetto, creare la directory di progetto, entrare nella directory ed eseguire il comando di inizializzazione:</p><pre>mkdir progetto<br>cd progetto<br>yarn init</pre><p>Con quest’ultimo comando vengono richieste alcune informazioni come nome progetto, nome autore eccetera, informazioni che vengono collezionate ed utilizzate per generare il file <em>package.json</em> (sì, proprio quello di <em>npm</em>)</p><h3>Installazione di Webpack</h3><p>Per installare webpack, ricorrere all’utilizzo di yarn:</p><pre>yarn add webpack webpack-dev-server --save</pre><p>Dove <em>add</em> è la direttiva per poter aggiungere pacchetti, l’opzione <em>save</em> indica di apportare le modifiche al file <em>package.json</em>. Se controllate il vostro file <em>package.json</em> troverete alcune righe nuove:</p><pre>&quot;dependencies&quot;: {<br>    &quot;webpack&quot;: &quot;^2.5.1&quot;,<br>    &quot;webpack-dev-server&quot;: &quot;^2.4.5&quot;<br> }</pre><p>Viene creato anche il file <em>yarn.lock</em> contenente l’elenco dei pacchetti effettivamente installati con le informazioni relative alle versioni.</p><p>Oltre alla modifica del file <em>package.json</em>, alla creazione del file <em>yarn.lock</em>, ovviamente vengono installati anche i pacchetti nella directory <em>node_modules</em>.</p><p>Tale directory deve essere inclusa nel file <em>.gitignore</em>.</p><p>Assicurarsi che il comando <em>webpack</em> sia presente nel <em>PATH</em>.<br>Con la precedente installazione, nella directory node_modules è stata creata una nuova directory chiamata <em>.bin/.</em></p><p>In tale directory sono presenti gli eseguibili dei vari moduli installati, tra cui anche <em>webpack</em>.<br>Per fare in modo che tale directory sia censita tra il <em>PATH</em> eseguire:</p><pre>export PATH=node_modules/.bin:$PATH</pre><p>Per rendere persistente questa configurazione aggiungere tale comando nel file <em>.bashrc</em> o nel file <em>.zshrc</em> (a seconda della vostra shell).</p><h3>Il file webpack.config.js</h3><p>Creare il file di configurazione di <em>webpack</em>. Tale file (<em>webpack.config.js</em>) è un file javascript più o meno complesso a seconda dei task che vogliamo automatizzare con <em>webpack</em>.<br>Un file minimale di <em>webpack</em>:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/188dfbc9ef9565df984fb24662bd68dc/href">https://medium.com/media/188dfbc9ef9565df984fb24662bd68dc/href</a></iframe><h3>Esecuzione di Webpack</h3><p>Creare la directory <em>src</em> in cui verranno memorizzati i files js e creare il file <em>src/app.js</em>:</p><pre>console.log(&quot;Hello World!&quot;);</pre><p>Ora è possibile eseguire il comando webpack:</p><pre>webpack</pre><p>Questo comando, interpretando le regole presenti nel file <em>webpack.config.js</em>, recupera i file nella directory <em>src/</em> esegue la fase di “build” e li predispone nella directory <em>dist</em> (nuova directory creata da webpack per i file da distribuire sul server in fase di deploy). Ricordarsi ovviamente di mettere la directory <em>dist</em> (creata automaticamente nel file <em>.gitignore</em>).</p><h3>Creazione file HTML</h3><p>Creare nella radice del progetto il file index.html:</p><pre>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br> &lt;head&gt;<br> &lt;title&gt;Tomato&lt;/title&gt;<br> &lt;/head&gt;<br> &lt;body&gt;<br> &lt;div id=&quot;app&quot;&gt;&lt;/div&gt;<br> &lt;script type=&quot;text/javascript&quot; src=&quot;dist/app.bundle.js&quot;&gt;&lt;/script&gt;<br> &lt;/body&gt;<br>&lt;/html&gt;</pre><h3>Esecuzione Web Server di sviluppo</h3><p>Ora che si ha a disposizione il file HTML con il layout e il file Javascript con la logica, è possibile avviare il web server di sviluppo di webpack.</p><p>Tale modalità è molto interessante in quanto ad ogni modifica dei files (per esempio al file Javascript), in automatico viene eseguita la fase di build e viene effettuato un reload nel browser web.</p><p>Lanciare il comando:</p><pre>webpack-dev-server --inline</pre><p>e accedere tramite browser all’URL indicato nell’output del comando (solitamente <a href="http://localhost:8080/"><strong>http://localhost:8080/</strong></a>) attivare il browser inspector e visualizzare il tab <em>console</em>.</p><h3>Sorgenti di esempio (github)</h3><p><a href="https://github.com/roberto-butti/tomato/tree/Webpack_starter_example">roberto-butti/tomato</a></p><h3>Prossimi passi</h3><p>Nel prossimo articolo, vedremo come abilitare Babel (per la sintassi ES6) e come organizzare il flusso di build dei file CSS e JS.</p><h3><strong>Parte 2:</strong></h3><p><a href="https://medium.com/treviso-js/primi-passi-con-webpack-e-vue-js-es6-babel-102-6c27d3741a80">Primi passi con Webpack e Vue.js 102</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=599ba85b0bba" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/come-impostare-un-workflow-con-webpack-da-zero-599ba85b0bba">Primi passi con Webpack e Vue.js 101</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WebDev Tips - Alpha mask + JPG]]></title>
            <link>https://medium.com/treviso-js/webdev-tips-alpha-mask-jpg-f7169c6e6d74?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/f7169c6e6d74</guid>
            <category><![CDATA[page-speed]]></category>
            <category><![CDATA[web-performance]]></category>
            <category><![CDATA[image-processing]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Luca]]></dc:creator>
            <pubDate>Fri, 17 Feb 2017 15:08:42 GMT</pubDate>
            <atom:updated>2017-02-17T15:09:15.229Z</atom:updated>
            <content:encoded><![CDATA[<h4>Come ridurre il peso delle immagini PNG estraendo il canale alpha.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aq82WPg8e3TKq_h1RuSxxQ.jpeg" /></figure><p>Quando ci è stato chiesto di sviluppare un configuratore di veicoli (tipo <a href="http://rules.config.landrover.com/jdxl/it_it/l405_k17/3doxg/a-hse_a-qtbv_a-std_a-swb/jdxexterior.html">Land Rover</a> or <a href="http://configurator.scramblerducati.com/bikes/ww/en/scrambler/flat-track-pro/19439?cid=R1I7Y98D1MRD7A7">Scrambler</a>) il primo problema che abbiamo dovuto affrontare è stato senza dubbio quello relativo all’enorme quantità di asset che l’utente finale avrebbe dovuto scaricare.</p><blockquote>Stiamo parlando delle centinaia di immagini necessarie a comporre gli n livelli delle n viste.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/921/1*dwQWgvv1xaKaTwMetoSAqg.png" /><figcaption>Images network list</figcaption></figure><p>Supponendo di avere già i render in PNG dei singoli livelli che compongono una vista la domanda è: <strong>come ridurre il peso di tutte queste immagini senza sacrificarne troppo la qualità</strong>?</p><p>La tecnica che abbiamo adottato ci ha permesso di ridurre il peso totale degli asset <strong>fino al 50%.</strong></p><p>Iniziamo analizzando l’immagine seguente; è un’immagine PNG già compressa al massimo che pesa circa 400kb.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4YfaW27dsFWRBohxMVTMBQ.png" /><figcaption>Example png image ~ 400KB</figcaption></figure><p>Per comprimere l’immagine di partenza si possono utilizzare vali tool. Personalmente mi piace utilizzare <a href="https://tinypng.com/">TinyPng</a> anche perché offre un solido set di <a href="https://tinypng.com/developers">API</a>.</p><blockquote>L’ obiettivo principale di questa tecnica è quello di separare il canale alpha dal colore.</blockquote><h3>Estrarre il canale alpha</h3><p>Per fare ciò potete utilizzare il software di image editing che preferite.</p><p>Noi abbiamo scelto <a href="https://www.imagemagick.org/script/index.php">ImageMagick</a>, che offre un’interfaccia da riga di comando che torna molto utile in ottica di <em>batch processing</em>.</p><p>Vediamo come utilizzarla.</p><pre>$ convert bike.png -alpha extract -colors 8 alpha.png</pre><p>Questa riga:</p><pre>-alpha extract -colors 8</pre><p>estrae il canale alpha dalla PNG originale e riduce il numero di colori a 8 prima di scrivere il risultato su un altro file che abbiamo chiamato “alpha.png”.</p><p>La scelta di ridurre il numero di colori ad 8 (e non a 2) permette di mantenere la qualità dell’immagine, soprattuto sui bordi, ad un livello ragionevole.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*c43W01jUL6LsAQYsjC73dA.png" /><figcaption>alpha.png — no transparency</figcaption></figure><p>Come potete vedere l’immagine alpha.png adesso non ha più la trasparenza.</p><p>Andiamo quindi a trasformare il bianco in alpha:</p><pre>$ convert alpha.png -transparent white alpha.png</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ACzh4Q5bG6LMdYryXPISuw.png" /><figcaption>alpha.png — with transparency</figcaption></figure><p>A questo punto possiamo convertire l’immagine originale in JPG rimuovendo così del tutto l’alpha e riducendo notevolmente il suo peso.</p><pre>$ convert -flatten bike.png bike.jpg</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4st_pHLZ20xI5zQmmabdiA.jpeg" /><figcaption>bike.jpg ~ 200KB</figcaption></figure><h3>Unire l’immagine JPG a colori con la maschera PNG</h3><p>A questi punto non ci resta che <em>ricostruire </em>nel browser<em> </em>la nostra immagine sovrapponendo opportunamente il livello <em>a colori</em> con la trasparenza.</p><p>L’operazione risulta molto semplice se si utilizza un elemento HTML canvas.</p><pre>ctx.drawImage(&#39;bike.jpg&#39;,0,0,500,298);<br>ctx.globalCompositeOperation = &#39;xor&#39;;<br>ctx.drawImage(&#39;alpha.png&#39;,0,0,500,298);</pre><p>Per prima cosa andiamo a disegnare la JPG sul canvas, successivamente modifichiamo il parametro <a href="http://www.w3schools.com/tags/canvas_globalcompositeoperation.asp"><strong>globalCompositeOperation</strong></a><strong> </strong>del context<strong> </strong>impostandolo a <strong>XOR </strong>e alla fine disegniamo sopra l’immagine maschera<strong> </strong>“alpha.png”.</p><blockquote>Impostando globalCompositeOperation = ‘xor’ l’immagine sorgente viene combinata con l’immagine di destinazione utilizzando l’operatore booleano OR esclusiva.</blockquote><p>Esempio in codepen.</p><iframe src="https://cdn.embedly.com/widgets/media.html?url=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fpen%2FxgLWje&amp;src=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fembed%2Fpreview%2FxgLWje%3Fheight%3D600%26amp%3Bslug-hash%3DxgLWje%26amp%3Bdefault-tabs%3Djs%2Cresult%26amp%3Bhost%3Dhttp%253A%252F%252Fcodepen.io%26amp%3Bembed-version%3D2&amp;type=text%2Fhtml&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/6f313f9a2e4250963fc41fbe32258113/href">https://medium.com/media/6f313f9a2e4250963fc41fbe32258113/href</a></iframe><p>E se vi dicessi che in realtà è possibile utilizzare <strong>due JPG </strong>ed ottenere lo stesso risultato?</p><p>Ciò è possibile utilizzando la tecnologia <a href="https://webglfundamentals.org/">WebGL</a>.</p><p>Ecco un esempio con il framework <a href="http://www.pixijs.com/">PIXI.JS</a>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fembed%2Fpreview%2FxgLjgG%3Fheight%3D600%26amp%3Bslug-hash%3DxgLjgG%26amp%3Bdefault-tabs%3Djs%2Cresult%26amp%3Bhost%3Dhttp%253A%252F%252Fcodepen.io%26amp%3Bembed-version%3D2&amp;url=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fpen%2FxgLjgG&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fi.cdpn.io%2F145453.xgLjgG.small.18f23a94-04ab-4f9f-bff7-90f0318b8b59.png&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/5f02dd375aff5acc17b475da616be04c/href">https://medium.com/media/5f02dd375aff5acc17b475da616be04c/href</a></iframe><p>In ogni caso non ho riscontrato grossi vantaggi rispetto alla tecnica che utilizza la PNG a 8 colori poiché il peso finale del file è circa lo stesso.</p><h3>Considerazioni finali</h3><p>Vediamo quindi alla fine del processo cosa abbiamo guadagnato in termini di file size:</p><ul><li>File PNG di partenza <em>bike.png</em> : <strong>400KB</strong></li><li>Conversione a JPG <em>bike.jpg</em> : <strong>200KB</strong></li><li>Alpha channel della PNG <em>alpha.png</em> : <strong>25KB</strong></li><li>Peso totale dell’immagine esplosa <em>bike.jpg </em>+<em> alpha.png </em>: ~ <strong>225KB</strong></li></ul><h3>Guadagno totale : ~ 44%</h3><blockquote>Questa percentuale può essere facilmente tradotta in una riduzione di costi se si pensa di utilizzare in servizio <a href="https://it.wikipedia.org/wiki/Content_Delivery_Network">CDN</a> per servire le risorse.</blockquote><p>A presto.</p><p>Luca</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f7169c6e6d74" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/webdev-tips-alpha-mask-jpg-f7169c6e6d74">WebDev Tips - Alpha mask + JPG</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Il making of di ‘Faces of Power’]]></title>
            <link>https://medium.com/treviso-js/il-making-of-faces-of-power-50641cf3e630?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/50641cf3e630</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[animation]]></category>
            <dc:creator><![CDATA[Marco Sors]]></dc:creator>
            <pubDate>Thu, 16 Feb 2017 09:24:10 GMT</pubDate>
            <atom:updated>2017-02-16T09:32:23.604Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_PpBXsr14wwmmHudspOOyA.png" /></figure><p>Il mio progetto personale <a href="http://www.facesofpower.net/">facesofpower.net</a> è stato apprezzato sia dalla platea tecnologica del web, sia da quella che si occupa di informazione generalista.</p><p>In questo post ricostruirò i <strong>passi principali</strong> dietro alla sua creazione.</p><p>Tutte le immagini del sito sono state processate con la libreria <a href="https://ondras.github.io/primitive.js">primitive.js</a>. La forma scelta è il <strong>triangolo</strong>, con un elevato numero di <em>iterazioni</em> e un’alta <em>shape optimization</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/836/1*2_u_LVawpf6EAVLCKGCPAQ.jpeg" /></figure><p>L’SVG ottenuto in uscita (opzione <em>vector image</em>) è un oggetto con un rect di background e una <strong>lista di path</strong>, 100 per ogni immagine di presidente. Ho rimosso gli attributi width = “” e height = “” dal tag SVG per ottenere un’<strong>immagine fluida</strong> a schermo intero.</p><pre>&lt;svg viewBox=”0 0 192 256&quot; clip-path=”url(#clip)”&gt;<br> &lt;defs&gt;<br> &lt;clipPath id=”clip” clipPathUnits=”objectBoundingBox”&gt;<br> &lt;rect x=”0&quot; y=”0&quot; width=”192&quot; height=”256&quot;/&gt;<br> &lt;/clipPath&gt;<br> &lt;/defs&gt;<br> &lt;rect x=”0&quot; y=”0&quot; width=”192&quot; height=”256&quot; fill=”rgb(166, 166, 166)”/&gt;<br> &lt;path d=”M329,255L34,107L-74,334Z” fill=”rgb(28, 28, 28)” fill-opacity=”0.95&quot;/&gt;<br> &lt;path d=”M74,29L-22,230L118,27Z” fill=”rgb(29, 32, 27)” fill-opacity=”0.82&quot;/&gt;<br> &lt;path d=”M1298,-422L78,102L84,55Z” fill=”rgb(210, 223, 195)” fill-opacity=”0.77&quot;/&gt;<br> …</pre><p>Nel markup HTML della pagina ho inserito solo il primo SVG, quello di Donald Trump. Poi, per ogni morphing necessario per gli altri presidenti, ho trasformato i singoli path di questo SVG iniziale attraverso delle <strong>animazioni</strong> con la libreria <a href="http://anime-js.com/">anime.js</a> (ogni presidente ha 100 animazioni di path e 1 per il colore di sfondo del rect)</p><pre>anime({<br>  targets: path1_1,<br>  d: “M-211,316L94,132L390,230Z”,<br>  fill: “rgb(47, 57, 78)”,<br>  fillOpacity: “0.99”,<br>  duration: 2000,<br>  easing: ‘easeInOutCubic’<br>});</pre><pre>anime({<br>  targets: path1_2,<br>  d: “M114,38L344,-205L199,178Z”,<br>  fill: “rgb(255, 255, 248)”,<br>  fillOpacity: “0.45”,<br>  duration: 2000,<br>  easing: ‘easeInOutCubic’<br>});</pre><pre>…</pre><p>Come si può vedere, per ogni path ho cambiato le <strong>coordinate</strong>, il <strong>colore</strong> di riempimento e <strong>l’opacità</strong> di riempimento, il tutto in 2 secondi con un easing <strong>easeInOutCubic</strong>.</p><p>L’animazione viene attivata dall’evento <em>afterChange</em> dello slider <a href="http://kenwheeler.github.io/slick/">Slick</a>: in questo modo ogni faccia può trasformarsi in qualsiasi altra faccia.</p><pre>$(&#39;.slider-for&#39;).on(&#39;afterChange&#39;, function﻿(event, slick, currentSlide, nextSlide){<br>  if ($(&quot;#obama&quot;).hasClass(&quot;slick-active&quot;)) {<br><br>  ...</pre><h3>Altri dettagli</h3><p>L’effetto di <strong>parallasse</strong> sui presidenti (applicato solo per i browser w<em>ebkit, </em>sugli altri creava problemi di performance) è stato ottenuto in questo modo: ho messo 4 SVG sovrapposti, dividendo quindi i 100 path in 4 gruppi da 25 path, e poi li ho animati con <a href="http://matthew.wagerfield.com/parallax/">parallax.js</a>.</p><p>In realtà le tre immagini della <strong>intro</strong> hanno un <em>morphing</em> di 500 path: con soltanto 100 il Monte Rushmore aveva una resa di scarsa qualità e non era riconoscibile.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/986/1*79pFc8oalsIQcVf6bsqVkQ.png" /></figure><h3>Accoglienza</h3><p>Qui potete trovare un elenco di siti in cui il mio progetto è stato presentato o ha vinto dei premi:</p><ul><li><a href="http://www.chromeexperiments.com/experiment/faces-of-power">Google Chrome Experiments</a></li><li><a href="http://www.awwwards.com/sites/faces-of-power-1">Awwwards, Honorable mention</a></li><li><a href="http://www.cssdesignawards.com/sites/faces-of-power/29912/">CssDesignAwards, Special Kudos</a></li><li><a href="http://www.csswinner.com/details/faces-of-power/11188">CssWinner, Site of the day</a></li><li><a href="http://tympanus.net/codrops/collective/collective-283/">Codrops Collective</a></li><li><a href="http://thefwa.com/cases/faces-of-power">The FWA</a></li><li>Muzli</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=50641cf3e630" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/il-making-of-faces-of-power-50641cf3e630">Il making of di ‘Faces of Power’</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Website Stalking - Uprising]]></title>
            <link>https://medium.com/treviso-js/website-stalking-uprising-8bd32dae479b?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/8bd32dae479b</guid>
            <category><![CDATA[reverse-engineering]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[animation]]></category>
            <dc:creator><![CDATA[Luca]]></dc:creator>
            <pubDate>Wed, 14 Dec 2016 09:13:05 GMT</pubDate>
            <atom:updated>2016-12-14T11:58:58.198Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8KzDGQEDxwJdKzjpn2XAIQ.jpeg" /></figure><p>Decostruzione del sito web <a href="http://www.weareuprising.com/">http://www.weareuprising.com/</a></p><h3><strong>Introduzione</strong></h3><p>Come probabilmente molti di voi fanno, anche io quando mi imbatto in un sito web che considero d’impatto, non resisto alla tentazione di spulciarne il codice. Mi affascina l’idea di scoprire con quali tecniche è stato realizzato e quali tecnologie implementa.</p><p>Ho deciso quindi di avviare una piccola rubrica qui su Medium. Voglio condividere con voi quello che scopro attraverso quella pratica che mi piace definire <strong>Website Stalking</strong>.</p><p>Il primo progetto che ho deciso di affrontare è di uno studio tutto italiano:</p><blockquote><strong>“</strong><a href="http://www.weareuprising.com/"><strong><em>Uprising™ | Digital creative production company</em></strong></a><strong>”</strong>.</blockquote><p>Uprising si definisce uno studio creativo indipendente, di base a Milano. Questo sito web, dalla forte espressività, rappresenta il loro portfolio.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8Zshjb33LQ9afKQCpavMAg.png" /><figcaption>Uprising website</figcaption></figure><h3>Struttura del sito</h3><p>La prima cosa che ho notato è la struttura del documento. Nel dettaglio, tutta l’applicazione si sviluppa su un unico elemento <strong>canvas</strong> HTML, basta guardare il sorgente dalla pagina per rendersene conto.<br>Infatti, oltre alla dichiarazione della testata e l’inclusione di alcune risorse javascript e css, non c’è molto altro.</p><h3>Loader</h3><p>L’applicazione presenta una “<em>loader progress animation</em>” iniziale. Questa ha il compito di intrattenere l’utente, restituendo un’indicazione sull’avanzamento del download delle risorse necessarie al render della pagina.<br>A differenza di ciò che accade per una pagina HTML, le risorse esterne (come le immagini e i video) hanno bisogno di essere <em>precaricate,</em> per essere poi “<em>renderizzate” </em>correttamente su un canvas.</p><p>Il loader in questione, come del resto tutto ciò che compone questo sito web, è implementato su canvas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/328/1*8BZG9ZRUpV7bgn83bcLoIw.gif" /></figure><p>Esistono svariati modi per realizzare un animazione del genere.</p><p>Ne ho scritto uno come esempio.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fembed%2Fpreview%2FJbmXVK%3Fheight%3D600%26amp%3Bslug-hash%3DJbmXVK%26amp%3Bdefault-tabs%3Djs%2Cresult%26amp%3Bhost%3Dhttp%253A%252F%252Fcodepen.io%26amp%3Bembed-version%3D2&amp;url=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fpen%2FJbmXVK%2F&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fi.cdpn.io%2F145453.JbmXVK.small.4cd3ca7f-d96d-4ee9-88d5-3c7f4e3e78ed.png&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/6ca00fd3ef99a745c91dd73ba2a0afd0/href">https://medium.com/media/6ca00fd3ef99a745c91dd73ba2a0afd0/href</a></iframe><p>La tecnica che viene utilizzata è la stessa che tipicamente si usa per animare tracciati <strong>svg</strong>.<br>Si tratta di un semplice trucco. È sufficiente andare a incrementare o decrementare una proprietà del <strong>context</strong> <strong>canvas</strong> nativa, ovvero <strong>context.lineDashOffset,</strong> che rappresenta l’offset del tratteggio che è stato scelto come stroke della linea.</p><p>Per approfondire il concetto vi consiglio vivamente <a href="https://css-tricks.com/svg-line-animation-works/">questo</a> link.</p><p>Quando l’ho scoperto, ormai qualche tempo fa, mi sembrò illuminante.</p><h3>Sezione principale</h3><p>Una volta che il loader è scomparso e il canvas è stato <em>renderizzato, </em>ci si trova di fronte alla sezione principale del sito.<br>Oltre al video in background, inserito anch’esso all’interno del canvas, si notano subito i numerosi effetti grafici che agiscono su tutta la pagina.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kw_Tav6PhYa8YJSNR0WjEw.png" /><figcaption>Home Page</figcaption></figure><p>Vediamo come sono stati realizzati:</p><p>Attivando i DevTools di Chrome (cmd + alt + i su MacOS) si legge subito l’inconfondibile firma di <a href="http://www.pixijs.com/"><strong>pixi.js</strong></a> , il notissimo framework canvas 2D con supporto <strong>WebGL</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wVgyVdR-2nXjhV9RyLXAnA.png" /></figure><p>Se scrivo in console <strong>PIXI.VERSION</strong>,<strong> </strong>possiamo notare che<strong> </strong>la versione utilizzata è la “4.0.1”. Se poi scrivo <strong>PIXI.filters, </strong>ottengo<strong> </strong>un oggetto che contiene tutti i filtri definiti per questa istanza di <strong>PIXI</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yZ9EmSFq-lA8803jBGOn1g.png" /></figure><p>Alcuni di questi sono i classici <em>built-in</em> e si riconoscono subito (BlurFilter, ColorMatrixFilter, GrayFilter …). Altri invece, come GlitchFilter (responsabile dell’effetto “segnale distorto”) che viene applicato all’intera sezione con un intervallo di qualche secondo, sono stati prototipati per l’applicazione.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GZpv8-2Jn_vsYgggM3hB7A.png" /><figcaption>Uprising GlitchEffect screenshot</figcaption></figure><p><strong>Prendo</strong> <strong>in analisi proprio il GlitchFilter e provo a replicarlo.</strong></p><p>Se scrivo PIXI.filters.GlitchFilter.toString() ottengo sotto forma di stringa il metodo responsabile dello shader Glitch.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dn7HMS183mh8_fftuO4Wrw.png" /><figcaption>PIXI.filters.GlitchFilter.toString()</figcaption></figure><p>Il compito di questo metodo è semplicemente quello di invocare il metodo Filter() di PIXI, passandogli come argomento una stringa contenente il codice dello shader.</p><blockquote>Uno shader è soltanto un pezzo di codice scritto il GLSL <a href="https://it.wikipedia.org/wiki/GLSL">https://it.wikipedia.org/wiki/GLSL</a> che gira sulla GPU della scheda grafica. Esso ha come input un singolo pixel sullo schermo e ritorna <strong>sempre</strong> un colore composto in un vettore <strong>rgba</strong>.</blockquote><p>Grazie al fatto che il codice gira direttamente sulla GPU, è possibile eseguirlo per ogni pixel dello schermo nel medesimo istante, garantendo un sensibile incremento delle prestazioni.</p><p><a href="https://www.youtube.com/watch?v=-P28LKWTzrI">Questo video</a> dei Mythbusters è un classico.</p><p>Un framework come <strong>PIXI, </strong>in grado di applicare questi filtri utilizzando il renderer WebGL, è esattamente quello che ci vuole per realizzare effetti del genere.</p><p>A titolo di esempio mi sono divertito a replicare l’effetto glitch.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fembed%2Fpreview%2FdOgprb%3Fheight%3D600%26amp%3Bslug-hash%3DdOgprb%26amp%3Bdefault-tabs%3Djs%2Cresult%26amp%3Bhost%3Dhttp%253A%252F%252Fcodepen.io%26amp%3Bembed-version%3D2&amp;url=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fpen%2FdOgprb%2F&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fi.cdpn.io%2F145453.dOgprb.small.22a49657-343b-4f58-883a-db44cacf47c7.png&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/2b4fac84058655c3754a37dbe108422a/href">https://medium.com/media/2b4fac84058655c3754a37dbe108422a/href</a></iframe><p>Come vedrete dal codice, ho preferito inserire in pagina (in un tag script) il codice dello shader.</p><h3><strong>Animazioni del testo</strong></h3><p>Attraverso l’utilizzo di maschere e animazioni controllate con il noto framework <a href="http://greensock.com/">GSAP</a>, è possibile realizzare gli effetti che si vedono applicati ai vari lettering in giro per il sito.</p><p>Anche qui ho pensato di creare un piccolo snippet di esempio.</p><iframe src="https://cdn.embedly.com/widgets/media.html?url=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fpen%2FLbgbob%2F&amp;src=https%3A%2F%2Fcodepen.io%2FLucaDb%2Fembed%2Fpreview%2FLbgbob%3Fheight%3D600%26amp%3Bslug-hash%3DLbgbob%26amp%3Bdefault-tabs%3Djs%2Cresult%26amp%3Bhost%3Dhttp%253A%252F%252Fcodepen.io%26amp%3Bembed-version%3D2&amp;type=text%2Fhtml&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/10a361e6d5a24c5c8f9cf4d4dd2039c6/href">https://medium.com/media/10a361e6d5a24c5c8f9cf4d4dd2039c6/href</a></iframe><h3>Navigazione</h3><p>Durante la navigazione tra la sezioni, l’applicazione resta in ascolto sull’evento scroll del mouse, il quale viene registrato attraverso un famoso plugin per jQuery <a href="https://github.com/jquery/jquery-mousewheel">mousewheel</a>.</p><p>Ad ogni colpo di <em>scroll</em> accadono due cose. Prima viene lanciata una animazione e poi viene effettuato un cambio di rotta tramite le HTML <a href="https://developer.mozilla.org/it/docs/Web/API/History">history api</a>. Il tutto è controllato attraverso il framework <a href="https://angularjs.org/"><strong>AngularJs</strong></a> , utilizzato per il routing e per strutturare e organizzare il codice.</p><p>L’animazione di cambio rotta fa probabilmente uso delle maschere che abbiamo utilizzato prima per l’esempio del testo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JDhIRwRlGxgN8Wk3Z4YkUw.png" /><figcaption>Routing transition Uprising</figcaption></figure><p>Interessante l’uso dell’algoritmo di <a href="https://it.wikipedia.org/wiki/Triangolazione_di_Delaunay">triangolazione di Delaunay</a>, di cui esistono svariati <a href="https://github.com/ironwallaby/delaunay">porting javascript</a>, utilizzato per realizzare randomicamente le maschere triangolari che compongono i frammenti dell’animazione.<br>Il tutto è stato animato sempre attraverso GSAP TweenMax.</p><h3>Menu</h3><p>Discorso a parte per il menu, a cui si accede cliccando sull’hamburger in alto a sinistra. Qui, a differenza della sezione principale, veniamo trasportati in un ambiente prettamente tridimensionale.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*9iuAxNT8b64Mt5S7faQYig.gif" /></figure><p>Gestire ambienti di questo tipo è possibile grazie della tecnologia WebGL, ed è fortunatamente reso più semplice dall’utilizzo di framework come <a href="https://threejs.org/">Three.js</a>.<br>Il menù è sostanzialmente composto da 5 mesh poligonali che vengono caricate sotto forma di file .obj attraverso il <a href="https://threejs.org/examples/webgl_loader_obj.html">loader di Three</a>.</p><p>Ho pensato di provare a caricare il logo di Uprising con Three.js.</p><p><a href="http://codepen.io/LucaDb/pen/pNxeNe">http://codepen.io/LucaDb/pen/pNxeNe</a></p><p>L’effetto particellare del menu è realizzato anche con l’utilizzo di uno shader, che potete trovare stampato in pagina nel source HTML all’interno del tag script[type=”x-shader/x-vertex”].</p><blockquote>Sul blog di <a href="https://aerotwist.com/">Aerotwist</a> troverete un <a href="https://aerotwist.com/tutorials/creating-particles-with-three-js/">bell’ esempio</a> con una <a href="https://aerotwist.com/static/tutorials/creating-particles-with-three-js/demo/">demo</a> di un effetto particellare.</blockquote><p>Non mi resta che fare i complimenti ai ragazzi di Uprising per la notevole creatività e l’impeccabile esecuzione di questo lavoro.</p><p>Se avete domande, curiosità, oppure avete suggerimenti per un altro episodio di <strong>Website Stalking,</strong> scrivetemi pure.<br>A presto.</p><p>Luca</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8bd32dae479b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/website-stalking-uprising-8bd32dae479b">Website Stalking - Uprising</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Js Day 2016 e Treviso JS]]></title>
            <link>https://medium.com/treviso-js/js-day-2016-e-treviso-js-a5bf64dbd27d?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/a5bf64dbd27d</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[events]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Nicholas Ruggeri]]></dc:creator>
            <pubDate>Fri, 29 Apr 2016 08:42:03 GMT</pubDate>
            <atom:updated>2016-04-29T08:45:33.998Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2TjSSeFLmj80L3Rblq3-EA.png" /></figure><p>L’11 ed il 12 maggio si terrà il più importante evento dedicato a JS in Italia e grazie ai nostri amici del <a href="http://2016.jsday.it/">JsDay</a>, Treviso JS ha a disposizione un codice sconto per tutta la community del 15%.</p><p>Non vi resta altro che inserire il codice <strong>jsUG16 </strong>ed acquistare il biglietto.</p><h4>Talks</h4><p><a href="http://2016.jsday.it/talk/">jsDay - May 11th-12th 2016 - Verona, Italy</a></p><h4>Schedule</h4><p><a href="http://2016.jsday.it/schedule/">jsDay - May 11th-12th 2016 - Verona, Italy</a></p><h4>Tickets</h4><p><a href="http://2016.jsday.it/tickets/">jsDay - May 11th-12th 2016 - Verona, Italy</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a5bf64dbd27d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/js-day-2016-e-treviso-js-a5bf64dbd27d">Js Day 2016 e Treviso JS</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vuoi iniziare ad usare ES6?]]></title>
            <link>https://medium.com/treviso-js/vuoi-iniziare-ad-usare-es6-e98679733ac6?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/e98679733ac6</guid>
            <category><![CDATA[gulp]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[es6]]></category>
            <dc:creator><![CDATA[Nicholas Ruggeri]]></dc:creator>
            <pubDate>Mon, 18 Jan 2016 21:57:46 GMT</pubDate>
            <atom:updated>2016-03-15T09:32:19.323Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8oosoaGbDQdfiWM4ooZWtw.jpeg" /></figure><p>Introduzione e primi passi per utilizzare <strong>ECMAScript 2015 (ES6) nel proprio progetto</strong>.</p><h3>Introduzione</h3><p>ES6 è l’evoluzione del nostro amato JavaScript. Viene chiamato anche <strong>ECMAScript 2015 </strong>poiché l’organizzazione ECMA International intende rilasciare una nuova versione ogni anno (…).</p><blockquote>In questo articolo non evidenzieremo le varie novità di questo linguaggio (ne uscirà uno nei prossimi giorni) ma condivideremo i tool per iniziare ad utilizzarlo senza problemi.</blockquote><h3>Supporto</h3><p>Al momento il supporto nei browser è molto precoce…</p><blockquote><a href="https://kangax.github.io/compat-table/es6/">https://kangax.github.io/compat-table/es6/</a></blockquote><p>… ma non preoccupiamoci, di seguito troverai vari <strong>tool</strong> (i cosiddetti transpiler)<strong> </strong>e <strong>plugin</strong> che forniscono un ampio supporto e che possono essere integrati nel workflow.</p><h3>Compilatori ES6 =&gt; ES5</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*93D7c-ZRnGgyqr5xKIS3mw.png" /></figure><p>__</p><h4>Babel</h4><p><a href="https://babeljs.io/"><strong>Babel</strong></a><strong> </strong>è un compilatore JavaScript. Converte ES6 in ES5 senza problemi grazie al “syntax transformer”.</p><p>—</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*-zllOp1aayoJpdC1TXnpxQ.png" /></figure><p>__</p><h4>Traceur</h4><p>Anche <a href="https://github.com/google/traceur-compiler/"><strong>Traceur</strong></a> è un compilatore JavaScript. Non supporta JSX ed il codice generato è decisamente meno leggibile rispetto a Babel.</p><p>—</p><h3>ES6 ed i Task Manager</h3><p>Con Gulp 3.9, ora possiamo utilizzare ES6 grazie a vari plugin: tra i più famosi troviamo, <a href="https://github.com/babel/gulp-babel"><strong>gulp-babel</strong></a>, <a href="https://github.com/sindresorhus/gulp-traceur"><strong>gulp-traceur</strong></a> e <a href="https://github.com/sindresorhus/gulp-regenerator"><strong>gulp-regenerator</strong></a> (consigliato da Addy Osmani).</p><pre><strong>//gulp-babel example</strong></pre><pre>const gulp = require(&#39;gulp&#39;);<br>const babel = require(&#39;gulp-babel&#39;);<br><br>gulp.task(&#39;default&#39;, () =&gt; {<br>    return gulp.src(&#39;src/app.js&#39;)<br>        .pipe(babel({<br>            presets: [&#39;es2015&#39;]<br>        }))<br>        .pipe(gulp.dest(&#39;dist&#39;));<br>});</pre><pre><strong>//gulp-traceur example</strong></pre><pre>const gulp = require(&#39;gulp&#39;);<br>const traceur = require(&#39;gulp-traceur&#39;);<br><br>gulp.task(&#39;default&#39;, () =&gt; {<br>    return gulp.src(&#39;src/app.js&#39;)<br>        .pipe(traceur())<br>        .pipe(gulp.dest(&#39;dist&#39;));<br>});</pre><pre><strong>//gulp-regenerator example</strong></pre><pre>var gulp = require(&#39;gulp&#39;);<br>var regenerator = require(&#39;gulp-regenerator&#39;);<br><br>gulp.task(&#39;default&#39;, function () {<br>    return gulp.src(&#39;src/app.js&#39;)<br>        .pipe(regenerator())<br>        .pipe(gulp.dest(&#39;dist&#39;));<br>});</pre><p>Anche per chi utilizza Grunt non ci sono problemi, infatti sono disponibili plugin sia per Babel con <a href="https://github.com/babel/grunt-babel"><strong>grunt-babel</strong></a>, sia per Traceur con <a href="https://github.com/aaronfrost/grunt-traceur"><strong>grunt-traceur</strong></a></p><pre><strong>//grunt-babel example</strong></pre><pre>require(&#39;load-grunt-tasks&#39;)(grunt); // npm install --save-dev load-grunt-tasks<br><br>grunt.initConfig({<br>    babel: {<br>        options: {<br>            sourceMap: true,<br>            presets: [&#39;es2015&#39;]<br>        },<br>        dist: {<br>            files: {<br>                &#39;dist/app.js&#39;: &#39;src/app.js&#39;<br>            }<br>        }<br>    }<br>});<br><br>grunt.registerTask(&#39;default&#39;, [&#39;babel&#39;]);</pre><pre><strong>//grunt-</strong><a href="https://github.com/aaronfrost/grunt-traceur"><strong>traceur</strong></a><strong> example</strong></pre><pre>grunt.initConfig({<br>  traceur: {<br>    options: {<br>      // traceur options here<br>      experimental: true,<br>      // module naming options,<br>      moduleNaming: {<br>        stripPrefix: &quot;src/es6&quot;,<br>        addPrefix: &quot;com/mycompany/project&quot;<br>      },<br>      copyRuntime: &#39;src/es5&#39;<br>    },<br>    custom: {<br>      files: [{<br>        expand: true,<br>        cwd: &#39;src/es6&#39;,<br>        src: [&#39;*.js&#39;],<br>        dest: &#39;src/es5&#39;<br>      }]<br>    },<br>  },<br>})</pre><h3>ES6 ed i Module Loader</h3><p>Parliamo di <strong>Browserify</strong> e <strong>Webpack</strong>. Entrambi sono compatibili con ES6.</p><p>Webpack permette l’integrazione di ECMAScript 2015 grazie alla moltitudine di loader che la community crea. Ad esempio, per rimanere in tema, quello di Babel (<a href="https://github.com/babel/babel-loader">https://github.com/babel/babel-loader</a>).</p><pre>module: {<br>  loaders: [<br>    {<br>      test: /<strong>\.</strong>jsx?$/,<br>      exclude: /(node_modules|bower_components)/,<br>      loader: &#39;babel&#39;, // &#39;babel-loader&#39;<br>      query: {<br>        presets: [&#39;react&#39;, &#39;es2015&#39;]<br>      }<br>    }<br>  ]<br>}</pre><p>Browserify, che non è da meno, utilizza sempre Babel (ma ce ne sono molti altri) per trasformare il ES5 in ES6 (<a href="https://github.com/babel/babelify">https://github.com/babel/babelify</a>).</p><pre>var fs = require(&quot;fs&quot;);<br>var browserify = require(&quot;browserify&quot;);</pre><pre>browserify(&quot;./script.js&quot;)<br>  .transform(&quot;babelify&quot;, {presets: [&quot;es2015&quot;, &quot;react&quot;]})<br>  .bundle()<br>  .pipe(fs.createWriteStream(&quot;bundle.js&quot;));</pre><p>Per concludere, se dovete iniziare un nuovo progetto, il consiglio è quello di utilizzare queste tecnologie per esser pronti quando i browser saranno compatibili al 100%.</p><blockquote>“Non avete più scuse per non iniziare ad usare ES6.”</blockquote><blockquote><em>“ES6 </em><a href="https://medium.com/javascript-scene/how-to-learn-es6-47d9a1ac2620"><em>is</em></a><em> JavaScript.”</em></blockquote><h4><strong>Link utili</strong></h4><ul><li><a href="https://github.com/lukehoban/es6features"><em>https://github.com/lukehoban/es6features</em></a></li><li><a href="https://github.com/addyosmani/es6-tools">https://github.com/addyosmani/es6-tools</a></li></ul><h4>Link vari</h4><ul><li><a href="https://www.facebook.com/trevisojs">facebook trevisojs</a>, <a href="https://github.com/trevisojs">github trevisojs</a></li><li><a href="https://github.com/nicholasruggeri">github personale</a>: progetti personali e opensource</li></ul><p><a href="http://www.ruggeri.io/">Nicholas Ruggeri * Frontend Developer and Snowboarder</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e98679733ac6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/vuoi-iniziare-ad-usare-es6-e98679733ac6">Vuoi iniziare ad usare ES6?</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dieci trucchi del mestiere per migliorare le performance del tuo sito web]]></title>
            <link>https://medium.com/treviso-js/dieci-trucchi-del-mestiere-per-migliorare-le-performance-del-tuo-sito-web-bd502392325?source=rss----3b60176679cc---4</link>
            <guid isPermaLink="false">https://medium.com/p/bd502392325</guid>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[medium-italia]]></category>
            <dc:creator><![CDATA[Nicholas Ruggeri]]></dc:creator>
            <pubDate>Thu, 14 Jan 2016 13:48:40 GMT</pubDate>
            <atom:updated>2016-01-15T09:00:53.699Z</atom:updated>
            <content:encoded><![CDATA[<p>Di seguito troverai una lista frutto dell’esperienza maturata in questi anni. Non sono altro che piccoli consigli per rendere più performante il sito a cui si sta lavorando.</p><h3><strong>1. Utilizza i Google Fonts ad hoc</strong></h3><p>Se usi <a href="https://www.google.com/fonts"><strong>Google Fonts</strong></a> per dei testi statici (titoli, frasi…), carica solo le lettere che ti servono.</p><pre>&lt;link href=&#39;https://fonts.googleapis.com/css <br>family=Open+Sans&amp;<strong>text=AaBbCc</strong>&#39; ...&gt;</pre><h3>2. Definisci il Critical Path</h3><p>Utilizza <a href="https://github.com/addyosmani/critical"><strong>Critical</strong></a><strong> di </strong><a href="https://medium.com/u/2508e4c7a8ec"><strong>Addy Osmani</strong></a><strong> </strong>per inserire i CSS inline così da ottimizzare il rendering<em> above the fold</em>.</p><h3>3. Imposta gli expires headers</h3><p>Sembrerà banale, ma è bene ricordare che il modo migliore per velocizzare una pagina rimane lo sfruttare la cache del browser. Definendo delle “date di scadenza” ad hoc per ciascun tipo di file, possiamo significativamente ridurre i tempi di caricamento dopo la prima visita.</p><pre>ExpiresActive On<br>ExpiresDefault &quot;access plus 10 years&quot;<br>ExpiresByType text/html &quot;access plus 1 day&quot;<br>ExpiresByType application/json &quot;access plus 15 minutes&quot;</pre><h3>4. Crea le SVG Sprites</h3><p>Crea una sprite di tutte le svg che utilizzi ed utilizza <em>symbol</em> per richiamare il singolo elemento. C’è un plugin sia per <a href="https://github.com/w0rm/gulp-svgstore"><strong>Gulp</strong></a> che per <a href="https://github.com/FWeinb/grunt-svgstore"><strong>Grunt</strong></a>.</p><pre>&lt;svg class=”icon” viewBox=”214.7 0 182.6 792&quot;&gt;<br>  &lt;use xlink:href=”#shape-icon-1&quot; /&gt;<br>&lt;/svg&gt;</pre><pre>&lt;svg class=”icon” viewBox=”0 26 100 48&quot;&gt;<br>  &lt;use xlink:href=”#shape-icon-2&quot; /&gt;<br>&lt;/svg&gt;</pre><blockquote>Una buona lettura: <a href="https://css-tricks.com/svg-symbol-good-choice-icons/">https://css-tricks.com/svg-symbol-good-choice-icons/</a></blockquote><h3>5. Utilizza i JavaScripts Design Pattern</h3><p>Utilizza un pattern per prevenire la duplicazione del codice e rendere di conseguenza i tuoi file JavaScript più leggeri.</p><blockquote>Una buona lettura: <a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/index.html">https://addyosmani.com/resources/essentialjsdesignpatterns/book/index.html</a></blockquote><h3>6. Crea una build personalizzata per Modernizr</h3><p>Se utilizzi <a href="https://modernizr.com/"><strong>Modernizr</strong></a>, crea la tua <em>custom build </em>a seconda delle feature che ti servono. Per prendere un punteggio più alto su <a href="https://developers.google.com/speed/pagespeed/insights/"><strong>PageSpeed Insight</strong></a> è consigliato inserire Modernizr inline per evitare il blocco del caricamento.</p><h3>7. Comprimi le tue immagini</h3><p>Ottimizza le tue immagini senza perdere qualità con <a href="https://tinyjpg.com/">TinyJpg</a>, <a href="https://tinypng.com/">TinyPng</a> e <a href="https://imageoptim.com/">ImageOptim</a>.</p><h3>8. Ottimizza i tuoi assets statici</h3><p>JavaScripts e CSS possono essere minificati e concatenati sia con dei tool online sia in modo automatico con Gulp e Grunt. Facendo questo non solo ridurrai il peso dei singoli file ma eliminerai anche request inutili al server.</p><h3>9. Utilizza GZIP</h3><p>Utilizza GZIP per comprimere gli assets che vengono trasferiti dal server al client.</p><blockquote>Una buona lettura: <a href="http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/">http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/</a></blockquote><h3>10. Inserisci le dimensioni nei tag img</h3><p>Una piccola cosa che quasi nessuno fa è esplicitare le dimensioni delle immagini: permette di eseguire il rendering della pagina in parallelo al download delle immagini.</p><p>Come ultima cosa vorrei consigliare a tutti gli sviluppatori di utilizzare lo stack di strumenti di Google, <a href="https://developers.google.com/speed/pagespeed/"><strong>PageSpeed Tools</strong></a>. E’ un ottimo modo per capire dove si sbaglia e dove si può intervenire per migliorare le performance del sito a cui si sta lavorando.</p><blockquote><em>Questi piccoli trucchi del mestiere sono frutto dell’esperienza del sottoscritto, di </em><a href="https://medium.com/u/d13bf2a0690c"><em>Andrea Collet</em></a><em> e della community </em><a href="https://www.facebook.com/groups/webdesigner/"><em>Web Designer Italiani</em></a><em>.</em></blockquote><h4>Link vari</h4><ul><li><a href="https://www.facebook.com/trevisojs">facebook trevisojs</a>, <a href="https://github.com/trevisojs">github trevisojs</a></li><li><a href="https://github.com/nicholasruggeri">github personale</a>: progetti personali e opensource</li></ul><p><a href="http://www.ruggeri.io/">Nicholas Ruggeri * Frontend Developer and Snowboarder</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bd502392325" width="1" height="1" alt=""><hr><p><a href="https://medium.com/treviso-js/dieci-trucchi-del-mestiere-per-migliorare-le-performance-del-tuo-sito-web-bd502392325">Dieci trucchi del mestiere per migliorare le performance del tuo sito web</a> was originally published in <a href="https://medium.com/treviso-js">Treviso JS</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>