{"id":377,"date":"2013-05-27T07:59:34","date_gmt":"2013-05-27T05:59:34","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/migliori-mockup-nel-browser-con-nodejs\/"},"modified":"2013-05-27T07:59:34","modified_gmt":"2013-05-27T05:59:34","slug":"migliori-mockup-nel-browser-con-nodejs","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/migliori-mockup-nel-browser-con-nodejs\/","title":{"rendered":"Migliori mockup nel browser con Node.js"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2013\/05\/n74a1web.png\" border=\"0\" align=\"left\" \/>Progettare direttamente nel browser ha tantissimi benefici, come produrre risultati pi\u00f9 accurati e completi e rimuovere lo step extra di conversione del file immagine in markup e CSS. Tuttavia, anche i siti progettati nel browser richiedono ancora l&#8217;inserimento dei contenuti, la simulazione di interazioni con il server e la creazione di JavaScript temporaneo che non saranno poi riutilizzabili nel sito live.<\/p>\n<p>Non sarebbe bello se potessimo passare dal progettare semplicemente layout ed interazioni alla progettazione dell&#8217;intero client side dell&#8217;applicazione durante lo stesso processo?<\/p>\n<p>\u00c8 proprio qui che entra in gioco Node.<\/p>\n<p>Node.js \u00e8 una piattaforma JavaScript server-side. Non \u00e8 un web server, ma ci permette di crearne uno facilmente. Possiamo anche crearci delle utility che girano sul web server, come ad esempio delle utility di setup e &#8220;minification&#8221; e realizzarci dei tool command line generici.<\/p>\n<p>Node prese le mosse nel 2009 e sollev\u00f2 da subito un considerevole interesse, probabilmente perch\u00e9 dava agli sviluppatori JavaScript l&#8217;opportunit\u00e0 per scrivere codice server-side anche se non avevano un background di programmazione lato server. Non era male nemmeno il fatto che Chrome si fosse fatto la reputazione di essere solido e veloce e Node usava il suo engine V8.<\/p>\n<p>Oggi, \u00e8 possibile far girare i server di produzione su Node e molte persone stanno facendo con successo proprio questo. Spingersi cos\u00ec in l\u00e0, comunque, \u00e8 un investimento. Il progetto Node e tutti i moduli creati dalla community che lo rendono fantastico, \u00e8 ancora un obiettivo in movimento. Ma anche se non siete pronti per scrivere e lanciare interi siti con Node, \u00e8 totalmente stabile per essere usato come tool di sviluppo.<\/p>\n<p>\u00c8 JavaScript, perci\u00f2 se sapete collegare un event handler jQuery, potete scrivere un web server. \u00c8 leggero, cos\u00ec potete farlo girare sul vostro laptop continuando a tenere la musica in streaming in sottofondo. \u00c8 semplicissimo da scaricare, impostare e  crearci cose, perci\u00f2 non c&#8217;\u00e8 bisogno della conoscenza esoterica di una persona che fa supporto IT per cominciare ad usarlo. Il payoff \u00e8 che invece dei mockup e dei dati &#8220;hard-coded&#8221; potete progettare un insieme di asset lato client, tempate di pagina e schemi di dati che si potranno lanciare in produzione.<\/p>\n<div class=\"paragrafo\">\n<h2>Cominciamo!<\/h2>\n<p>Installare Node in locale \u00e8 facilissimo per gli ambienti pi\u00f9 comuni. Potete scaricare degli <a href=\"http:\/\/nodejs.org\/download\/\">installer<\/a> che includono Node cos\u00ec come npm, il suo package manager, dal sito del progetto. Installarlo su un server remoto non \u00e8 altrettanto semplice, ma abbiamo a disposizione della <a href=\"https:\/\/github.com\/joyent\/node\/wiki\/Installing-Node.js-via-package-manager\">buona documentazione<\/a> che pu\u00f2 esserci d&#8217;aiuto. Dopo aver eseguito il processo di installazione, dovreste essere in grado di andare nel terminal o nella command line e testarlo.<\/p>\n<p>Se non dite a Node di far girare un file specifico, avrete il Read-Eval-Print Loop, o REPL. Se scrivete <code>node<\/code> in terminal o sul prompt di comando, potete iniziare ad eseguire del JavaScript arbitrario. Per esempio, dopo aver avviato REPL, scrivete <code>var a = 9;<\/code>. REPL risponder\u00e0 con &#8220;undefined&#8221;. Ora, scrivete <code>a * 3<\/code> (o un qualsiasi altro numero) e vi risponder\u00e0 con il risultato corretto. Potete rendere le cose pi\u00f9 interessanti definendo una funzione e poi chiamandola:<\/p>\n<pre><code>&gt; function sayHello( name ) { return \u201cHello, \u201c + name; }\nundefined\n&gt; sayHello( \u201cA List Apart\u201d );\n\u2018Hello, A List Apart\u2019<\/code><\/pre>\n<p>Per uscire dal REPL, o per porre fine a qualunque altra esecuzione di Node (come un web server funzionante), premete Ctrl+C. Nel caso del REPL, dovrete farlo due volte per confermare.<\/p>\n<p>Sebbene sia carino sapere che Node pu\u00f2 fare un po&#8217; di aritmetica base e di concatenazione di stringhe, il suo valore per noi developer sta nel far girare i programmi. Potete vedere un esempio di tale programma, un web server basilare, sulla homepage del progetto. Suggeriscono di creare un file chiamato <code>example.js<\/code> con questo codice:<\/p>\n<pre><code>var http = require(\u2019http\u2019);\nhttp.createServer(function (req, res) {\n  res.writeHead(200, {\u2019Content-Type\u2019: \u2018text\/plain\u2019});\n  res.end(\u2019Hello World\\n\u2019);\n}).listen(1337, \u2018127.0.0.1\u2019);\nconsole.log(\u2019Server running at http:\/\/127.0.0.1:1337\/\u2019);<\/code><\/pre>\n<p>Questo utilizza solo un modulo, il modulo core <code>http<\/code>. Come potrete immaginare, il modulo <code>http<\/code> contiene tutte le cose di base che ci servono per un sito su HTTP. Node contiene una collezione diligentemente editata di <a href=\"http:\/\/nodejs.org\/api\/\">moduli core<\/a> che forniscono cose come gli event handler, l&#8217;accesso al file system e le astrazioni di vari protcolli di rete. Ma proprio come probabilmente usereste una libreria JavaScript o un framework per accelerare e blindare lo sviluppo sul lato client, per lo sviluppo con Node oltre al semplice &#8220;Hello World&#8221; generalmente si aggiungono altri moduli non-core che usano npm.<\/p>\n<p>Il modulo <code>http<\/code> contiene una funzione <code>createServer<\/code>, comunque, che \u00e8 tutto quello di cui hai bisogno per creare un web server molto basilare. Nel codice qui sopra, una volta che il server \u00e8 stato creato, ascolta sulla porta 1337 sulla vostra macchina locale. Quando riceve una richiesta, rimanda indietro una risposta testuale.<\/p>\n<p>Una cosa da notare \u00e8 che il lavoro in questo caso \u00e8 svolto nell&#8217;event handler, come la maggior parte delle cose in Node. Il callback in <code>createServer()<\/code> gestisce un connection event, che occorre ogni volta che un nuovo cliente contatta il server. Per avviare questo server, scrivete <code>node example.js<\/code> nel termina e poi aprite un browser all&#8217;indirizzo http:\/\/127.0.0.1:1337. Questo fa partire un connection event e dovreste vedere il messaggio nel callback.<\/p>\n<p>Per ottenere un qualunque valore serio da un server Node, anche uno che non andr\u00e0 mai in produzione, \u00e8 meglio acquisire un po&#8217; di familiarit\u00e0 con i moduli in npm. Ce ne sono migliaia disponibili, ma quelli di cui avrete bisogno per creare un&#8217;applicazione web elementare sono alcuni tra i pi\u00f9 vecchi e stabili, quindi non sentitevi in dovere di cercarli tutti prima di cominciare. Uno che sicuramente vi torner\u00e0 comodo per progettare un&#8217;applicazione \u00e8 <a href=\"http:\/\/expressjs.com\/\">Express<\/a>, un framework per applicazioni web tutt&#8217;altro che complicato.<\/p>\n<p>Se siete abituati ad installare dei progetti open source clonando un repository GitHub o scaricando un file zip, probabilmente vi piacer\u00e0 npm. Per installare Express con npm, per esempio, andate nel terminal o sulla riga di comando e scrivete <code>npm install express<\/code>. Fintanto che sarete online e avrete il permesso di scrivere sulla vostra macchina, questo far\u00e0 il fetch di tutto il codice e di tutti gli asset di cui ha bisogno Express per girare, cos\u00ec come i moduli da cui ha dipendenze. La prima volta che farete girare npm dalla vostra directory di lavoro, tutti questi elementi finiranno in una nuova sotto-directory <code>node_modules<\/code>. Ora il modulo \u00e8 pronto per essere usato nei programmi Node allo stesso modo in cui usavamo <code>http<\/code>, attraverso la funzione <code>require<\/code>.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Progettare applicazioni<\/h2>\n<p>Lo use cas ideale per progettare le vostre applicazioni con Node \u00e8 un&#8217;applicazione di una sola pagina nella quale il server fornisce la maggior parte dei dati, ma Node \u00e8 ancora utile per un sito pi\u00f9 tradizionale. Ovviamente, dovrete cominciare lo sviluppo con i requisiti definiti nella maniera pi\u00f9 precisa possibile, ma l&#8217;implementazione di solito fa emergere dei requisiti che non erano stati considerati e alcuni di questi possono avere un considerevole impatto sulla vostra timeline. Anche in un&#8217;applicazione server-driven in cui potrebbe non essere possibile riutilizzare le strutture dati e i template cos\u00ec come sono, creare una versione client-only aiuta a testare le proprie supposizioni riguardanti i dati di cui si avr\u00e0 bisogno e come li userete.<\/p>\n<p>Se state sviluppando una app da una sola pagina, la giustificazione \u00e8 molto pi\u00f9 facile. Avrete bisogno di pensare all&#8217;ottimizzazione della comunicazione con il server perch\u00e9 vengano fatte meno richieste possibili, il che vuol dire conosce come i dati dovranno essere impacchettati da ogni estremit\u00e0 del server e il modo in cui metterete in cache i dati alla ricezione (sempre che ci sia).<\/p>\n<p>Un vantaggio dell&#8217;avere JavaScript sul server \u00e8 che i template possono essere resi dallo stesso template engine sia lato client sia lato server. Questo vi permette di sperimentare su entrambe i lati ed ottimizzare per la vostra situazione. \u00c8 anche una cosa che fa risparmiare tempo rendere i template con oggetti JavaScript e considerare solo il modo in cui i dati saranno raggruppati alla fine (non come saranno memorizzati nel database). Progettare questi raggruppamenti di dati \u00e8 il grosso del lavoro che possiamo fare con Node verso la fine di quella che consideriamo tradizionalmente la progettazione dell&#8217;applicazione.<\/p>\n<p>Mettere insieme ciascuna pagina da parti diverse su tutto il server \u00e8 difficile per una applicazione in qualsiasi linguaggio. Al contrario, qualunque cosa renda una pagina dovrebbe avere delle dipendenze chiare e il risultato di ciascuna pagina o di richiesta dati dovrebbe combinare queste dipendenze in un&#8217;unit\u00e0 integrata e sensatamente organizzata.<\/p>\n<p>Se avete lavorato in un framework server-side nel quale una pagina o una view \u00e8 legata a un singolo oggetto o modello e in cui i dati aggiuntivi sono importati ed esposti in modi diversi, probabilmente comprendete come l&#8217;alternativa diventi un fastidio. Sarete anche coscienti del fatto che la soluzione \u00e8 un buon view-model i cui dati sono definiti da ciascuna view, non dai modelli che lo alimentano. Con questo esercizio, puntiamo a tracciare cosa va in questi view-model.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Usare i template<\/h2>\n<p>C&#8217;\u00e8 una buona probabilit\u00e0 che il vostro server di produzione non abbia JavaScript, quindi potreste ritrovarvi a convertire i template che producete in questa fase del design. Potreste tentare di mitigare questa cosa scegliendo un template engine come <a href=\"http:\/\/mustache.github.io\/\">Mustache<\/a> con dei parser esistenti per una miriade di linguaggi. Oppure potreste sceglierne uno con la minor logica possibile (trovo che le sole cose che voglio per un template davvero flessibile siano i costrutti condizionali &#8211; if, then, else -, i cicli e i partials) e l&#8217;opzione di cambiare i delimiter attorno ai tag del template in accordo con il linguaggio di template del server. Avrei da ridire sul fatto che il processo di ottenere tutti i dati correttamente piazzati nel proprio HTML sia molto pi\u00f9 difficile che dare un &#8220;cerca e sostituisci&#8221; sul risultato finale, cos\u00ec la creazione di un template in JavaScript che potete usare facilmente \u00e8 tempo ben speso, anche se non pu\u00f2 essere analizzato dal vostro server di produzione.<\/p>\n<p>Potreste scegliere di progettare la UI delle vostre pagine usando dei dati di mockup &#8220;hard-coded&#8221; prima e di aggiungere i tag di template dopo, oppure potreste cominciare con un template e alcuni dati di mockup pronti per andare nel vostro server Node. Anche se \u00e8 un passo ulteriore, trovo che la prima soluzione sia pi\u00f9 semplice, perch\u00e9 l&#8217;ultima tende a richiedere uno spostamento extra dei dati di mockup. Cominciare con dati &#8220;hard-coded&#8221; mi permette di esaminare il mockup finito e di vedere che tipi di &#8220;oggetti&#8221; sono presenti (ad es., un utente, un oggetto in vendita o uno status update). Questo mi aiuta a creare una gerarchia di oggetti flessibile in maniera pi\u00f9 semplice nei miei dati. Ma potreste essere naturalmente fantastici nella creazione di gerarchie di oggetti, cos\u00ec, ovviamente, fate quello che preferite.<\/p>\n<p>Da qualsiasi parte cominciate, elaborare i template dovrebbe darvi un&#8217;indicazione su quali parti di ciascuna pagina siano dinamiche e quali dati siano richiesti da ciascuna. Se le sottosezioni delle vostre pagine sono rese separatamente perch\u00e9 sono riutilizzate da diverse pagine pi\u00f9 in alto nella gerarchia o perch\u00e9 sono rese anche dal client, convertire il markup in template vi permette anche di trovare il giusto equilibro tra il non ripetere mai del codice e l&#8217;avere dei template assurdamente piccoli.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Autentiche false interazioni server<\/h2>\n<p>Se avete creato dei wireframe ad alta fedelt\u00e0 che funzionano nel browser, sapete che fastidio sia avere solo delle parti di una pagina che sono interattive, dal momento che tutti i click comportano la creazione di una nuova view (anche se avete una serie di oggetti che condividono lo stesso comportamento quando vengono cliccati). Sapete anche cosa vuol dire copiare ed incollare gli stessi dati in posti differenti e aggiornare ciascuno di questi separatamente qualora la maniera di presentare i dati dovesse cambiare. Progettare la propria app con un server dietro rimuove queste frustrazioni.<\/p>\n<p>Con il supporto di un server non ci sono problemi se gli stessi dati dovessero mostrarsi in visualizzazioni differenti per tutto il workflow che si sta progettando. Dal momento che i dati vivono sul vostro server Node, potete scriverli una volta e riutilizzarli nei modi in cui volete. Dovete ancora considerare come li sposterete dal server al client, per\u00f2. Quando un utente clicca su uno dei molti oggetti di una lista, verr\u00e0 portato in una nuova pagina o appariranno altri dai inline? Il primo rappresenta il fallback del secondo in caso di mancanza di JavaScript? Trovare la soluzione per la propria app vi dir\u00e0 quale sia l&#8217;endpoint che occorre al server e quali parametri devono essere mandati in stringhe di query, form post o URL. Aiuter\u00e0 anche definire l&#8217;API per quelle richieste, dicendo a tutti coloro i quali possono lavorare sul vostro server di produzione quali chiavi vi aspettate che corrispondano a quali pezzi di dati.<\/p>\n<p>Avere un server con cui lavorare \u00e8 particolarmente comodo se il vostro lavoro ha a che fare con la realizzazione di richieste asincrone. Ovviamente, potete avere i vostri dati di mockup, condizione eccellente, ma potete anche caricare degli asset come template o fogli di stile che consumino i dati. Testare il processo di passare dati e asset al client valida le vostre ipotesi riguardanti non solo il modo in cui li state impacchettando, ma anche il modo in cui li state memorizzando e strutturando. E, ovviamente, significa molto meno JavaScript client-side sprecato.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Un mockup che potete usare<\/h2>\n<p>Il risultato finale di tutto questo dovrebbe essere quello di trasferire tutti i pezzi di mockup dal vostro JavaScript client-side e da HTML. Avete un server Node che potremmo non essere identico al framework di produzione, ma che ha davvero delle definizioni chiare di tutto quello che il client side si aspetta che esista, magari anche tutto visibile in un solo file. Avete template e richieste client-side che potrebbero richiedere delle sostituzioni ma che separano anche i dati da tutto il resto e sono come minimo facilmente convertibili a qualunque formato sia necessario per la produzione.<\/p>\n<p>Potete fare lo stesso con un qualsiasi server gi\u00e0 esistente? Certamente s\u00ec, ma se conoscete gi\u00e0 JavaScript e non avete come obiettivo quello di diventare uno sviluppatore server-side, ha senso usare le conoscenze che avete gi\u00e0. Node lo rende piuttosto semplice e allo stesso tempo vi permette di approfondire quanto volete server sempre pi\u00f9 complessi, nel caso dovessero cambiare le vostre ambizioni. \u00c8 semplice incominciare con Node e lo si pu\u00f2 estendere in maniera flessibile, caratteristiche che lo rendono un tool fantastico per progettare applicazioni.<\/p>\n<p>Pronti per metter in pratica le vostre nuove conoscenze riguardanti Node? In \u201c<a href=\"http:\/\/alistapart.com\/article\/node-at-work-a-walkthrough\/\">Node at Work: A Walkthrough<\/a>,\u201d vi guider\u00f2 in una demo live ed entreremo pi\u00f9 nello specifico nei modi per rifinire i mockup.<\/p>\n<p>Illustrazioni: {carlok}<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Progettare direttamente nel browser ha moltissimi benefici, come produrre dei risultati pi\u00f9 accurati ed esaurienti, e rimuovere lo step aggiuntivo di conversione di un file immagine in markup e CSS. Ma anche i siti progettati direttamente nel browser magari richiedono l&#8217;inserimento di contenuto, la simulazione di alcune interazioni con il server e la creazione di JavaScript temporaneo: tutte cose non utilizzabili nel sito live. Non sarebbe bello se potessimo passare dalla progettazione di layout e di interazioni alla progettazione dell&#8217;intero client side dell&#8217;applicazione durante lo stesso processo? Garann Means nel primo dei suoi due articoli ci dice che possiamo e ci spiega come Node.js pu\u00f2 velocizzare il nostro processo di design.<\/p>\n","protected":false},"author":818,"featured_media":7000698,"comment_status":"open","ping_status":"open","template":"","categories":[271,91],"tags":[],"coauthors":[391],"class_list":["post-377","article","type-article","status-publish","has-post-thumbnail","hentry","category-javascript","category-numero-74-27-maggio-2013"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=377"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000698"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=377"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}