SlideShare ist ein Scribd-Unternehmen logo
1 von 51
ASP05 - Npm, grunt e bower il
nuovo package manager di
Visual Studio 2015
Gianluca Carucci
Software Engineer & Agile Coach
gianluca@carucci.org - @rucka
http://gianluca.carucci.org
http://reboot.carucci.org http://blogs.ugidotnet.org/rucka
#CDays15 – Milano 24, 25 e 26 Marzo 2015
Grazie a
Platinum
Sponsor
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Obiettivi
• Automatizzare la gestione delle risorse web
• Automatizzare il packaging delle risorse web
• Ottimizzare le risorse web
• Rendere il progetto web accessibile ad un frontend developer
• Uscire entro le 19 dall’ufficio
• Non essere chiamato il sabato e la domenica per un problema in produzione
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Agenda
• Perché cambiare?
• Come?
• Si, ma ci ho guadagnato?
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Di cosa non parleremo
• ASP.NET
• NuGet
• Design del codice
• Coding style
• Pattern
• Sicurezza
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Di cosa parleremo
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Un po’ di spolier
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
L’esigenza
• Scaricare e gestire nel progetto le librerie esterne (jQuery, Angular,
Boostrap …)
• Ottimizzare le risorse utilizzate dal website (minificazione e compressione)
• Trasformare le risorse (file Sass, Less, TypeScript o CoffeeScript)
• Lanciare unit test client side
• Validare il codice JavaScript (JsHint)
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Cosa abbiamo oggi
NuGet
WebEssentials
Bundles
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Right tool for the right job
“Where does that leave NuGet? You can still use it for these, but it is
more ideally suited for .NET libraries. There are packages for angular,
for example, in NuGet. In fact, I co-maintain the Angular NuGet
packages with Scott Hanselman. But when I need to install client
libraries into any project type, I use bower. Right tool for the right job.
NuGet for .NET libraries, bower and npm for JavaScript libraries.”
John Papa
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Perché cambiare?
• Non è detto che i package NuGet siano gestiti da chi sviluppa la
libreria
• I folder Content includono files di librerie mischiate tra loro e a volte
anche in più versioni
• I bundle richiedono ASP.NET: dipendenza client dal server
• Risorse lato client e lato server mischiate
• Poca automatizzazione e molta confusione
Ai frontend developer chi ci pensa?
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Di cosa abbiamo bisogno
• Un package manager per le risorse client  Bower
• Un task runner per automatizzare il building degli asset 
Grunt
• Un package manager per gestire e scaricare i tool a
supporto dello sviluppo (Bower, Grunt etc…)  Npm
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Npm
• Package manager di Node.js (e delle librerie JavaScript
client side)
• Le dipendenze locali sono installate nel folder
node_modules
• Nested dependency tree
• Versioning dei package basato su semantic versioning
(semver)
• 53000+ moduli
• I moduli sono ricercabili sul sito https://www.npmjs.com o
tramite il comando npm search [--long] [search terms ...]
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Bower
• Package manager per le librerie client
• Le librerie sono scaricate nel folder bower_components
• Flat dependency tree
• Versioning delle librerie basato su semantic versioning
(semver)
• 7000+ librerie
• Le librerie sono ricercabili su http://bower.io/search o
tramite il comando bower search <name>
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
{package,bower}.json
{
‘name’ : ‘project name’
‘version’ : ‘project version’,
‘dependencies’ : {
‘package-name’ : ‘package version’
},
‘devDependencies’ : {
‘package-name’ : ‘packageversion’,
‘package-name’ : ‘packageversion’
}
}
Comandi:
npm init
npm install <package>
npm install <package> -g
npm install <package> --save
npm install <package> --save-dev
Comandi:
# da package registrato
$ bower install jquery#1.2.3
# da GitHub
$ bower install ashkenas/underscore
# da endpoint Git
$ bower install git://github.com/user/package.git
# da URL generico
$ bower install http://underscorejs.org/underscore.js
Nota: il comando install supporta --save e --save-dev come Npm
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Grunt
• E’ un task runner che automatizza attività ripetitive a corredo dello
sviluppo
• Se installate grunt-cli globale (npm install grunt-cli -g) i task possono essere
lanciati da linea di comando
• Il flag --verbose mostra a console i dettagli dei singoli task eseguiti da Grunt
• I task sono plugin distribuiti da Npm
• I task sono componibili in task alias
• In Visual Studio i task possono essere collegati agli eventi dell’ide (apertura
del progetto, build, clean)
• 3000+ plugin
• I plugin sono ricercabili sul sito http://gruntjs.com/plugins
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
GruntFile.{js,coffee}
module.export = function(grunt) {
grunt.initConfig({
‘pkg’: grunt.file.readJSON(‘package.json’),
taskName: {
targetName: {
options: {
task options
},
},
src: ‘files da processare’,
dest: ‘files di output’
}
});
grunt.loadNpmTask(‘grunt-contrib-taskName’);
grunt.registerTask(‘complexTask’, [‘taskName1’, ‘taskName2’,…]);
}
• Contiene la
configurazione dei task
• È codice Node.js:
possiamo usare moduli
esterni e le Node.js API
•Supporta codice
JavaScript e CoffeeScript
•I plugin sono moduli
scaricabili con Npm
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
grunt-bower-task
• Scarica e installa le dipendenze di
bower in un directory target (default
template Visual Studio wwwroot/lib)
• Nella directory target sono copiati:
• I file definiti nella sezione exportsOverride del
file bower.json del progetto, oppure
• I file specificati nella sezione main del file
bower.json delle librerie, oppure
• Tutti i file nella sorgenti (inclusi licenza, readme,
test…)
grunt.initConfig({
bower: {
install: {
options: {
targetDir: ‘wwwroot/lib',
layout: 'byType',
install: true,
verbose: false,
cleanTargetDir: false,
cleanBowerDir: false,
}
}
}
});
#CDays15 – Milano 24, 25 e 26 Marzo 2015
grunt-bower-task layout
byType byComponent
Il layout definisce la struttura
del folder target. Il layout
può essere customizzato
anche tramite una funzione
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
demo
Grunt, Npm e Bower in Visual Studio 2015
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
semver - versioning delle librerie
• Regola di versioning dei package: dato un numero di versione
MAJOR.MINOR.PATCH, incrementa il:
• MAJOR version in caso di cambiamento delle API incompatibile,
• MINOR version in caso di aggiunta di funzionalità backwards compatibile
• PATCH version in caso di bug fix backwards-compatible.
• Eccezione: major version zero (0.y.z) identifica uno sviluppo iniziale.
Tutto può variare a questo stadio  le e API NON devono essere
considerate stabili!
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
semver - definizione delle dipendenze
• Bower o Npm scaricano la versione della libreria richiesta,
secondo le regole semantiche indicate nelle dipendenze.
• Le dipendenze, possono contenere espressioni che
utilizzano gli operatori <, <=, >, >=, = e le wildcard *,X,^, ~
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
semver – Esempi
• "2.1.2" -> 2.1.2
• * -> tutte le versioni
• X sostituisce qualsiasi valore nella posizione occupata (1.x equivale a
>=1.0.0 < 2.0.0, 1.2.x equivale a >=1.2.0 < 1.3)
• ~ seleziona una patch se il patch number è specificato (‘~1.2.3` := `>=1.2.3
<1.(2+1).0`), qualsiasi patch altrimenti (`~1.2` := `>=1.2.0 <1.(2+1).0` )
• ^2.1 seleziona la versione per cui non è modificato il numero più
significativo diverso da zero partendo da sinistra (`^1.2.3` := `>=1.2.3
<2.0.0`,`^0.2.3` := `>=0.2.3 <0.3.0`)
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Supporto di Npm, Grunt e Bower in Visual
Studio 2015
• Visual Studio scarica i package automaticamente alla modifica del file
package.json (Npm) o bower.json (Bower)
• I task di Grunt possono essere lanciati dal Task Runner Explorer
• I task di Grunt possono essere associati agli eventi dell’IDE (build,
clean, open solution)
• Intellisense ovunque!
Attenzione! Visual Studio non da un feedback sul progress del
download dei package
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Ottimizziamo!
• Vogliamo:
• Minimizzare l’occupazione di spazio delle risorse (immagini, stili e script)
• Debug - agevole – delle stesse risorse minimizzate e rilasciate in ambiente di
produzione
• “only pay for what we use”
• Abbiamo bisogno di:
• Plugin di Grunt per ottimizzare le varie tipologie di risorse
• Grunt per orchestrare il processo di ottimizzazione
• Source Map per il debug degli script «come se fossero i file sorgente»
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Source map
• File in formato json (.map) che contiene il mapping tra i
simboli del sorgente e del file target
• Mappano (anche) files di tipo eterogeneo
• Interpretati dai DevTools dei browser per debuggare il file
originale
• Scaricano le risorse on demand
• Attenzione! Il debbugger di Visual Studio non supporta i
source map
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Plugin di Grunt
• grunt-bower-task  scarica e istalla le dipendenze
• grunt-contrib-copy  copia files e folders da una sorgente ad una
destinazione
• grunt-contrib-clean  cancella files o folders
• grunt-contrib-uglify  concatena, minifica e genera le source map a
partire da file JavaScript in ingressa
• grunt-contrib-cssmin  minifica files css
• grunt-uncss  elimina gli stili css non referenziati nell’html
• grunt-contrib-imagemin  comprime e ottimizza immagini
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Workflow
copy
/assets
scripts
images
styles
*.html
/wwwroot/src/assets
scripts
images
styles
*.html
/wwwroot/src/lib
bower.json
cssmin
bower
uglify
uncss
imagemin
/wwwroot
site.css
images
app.js, app.js.map
*.html
copia
trasformazione
scripts
styles
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
demo
Ottimizzare le risorse
#CDays15 – Milano 24, 25 e 26 Marzo 2015
Quanto ho risparmiato?
Prima
• Immagini 878Kb
• Stili 141Kb
• Script 1.07Mb
• TOTALE 2.08Mb
Dopo
• Immagini 804Kb
• Stili 18.3Kb
• Script 206Kb
• TOTALE 1.00Mb
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Grunt - globbing patterns
• ‘/’ è il separatore di directory
• ‘?’ indica un singolo carattere escluso ‘/’
• ‘*’ indica uno o più caratteri eccetto ‘/’
• ‘**’ indica uno o più caratteri incluso ‘/’
• ‘{}’ uno tra le stringhe separate da virgola
• ‘!’ nega il pattern successivo
• Supporta i template per utilizzare valori di
configurazione
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Grunt - static e dynamic mapping
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Ciclo di sviluppo
• Modifico i sorgenti
• Lancio un task di Grunt
• Riaggiorno la pagina del Browser
2 step su 3 sono superflui!
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Watch e Connect
• grunt-contrib-watch è un plugin che monitora files/folders e lancia un
task alla modifica di una o più risorse
• grunt-contrib-connect è un plugin che lancia un web server
customizzabile, per ospitare le risorse contenute in un folder fisico
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Livereload
“LiveReload is a tool for web developers and designers. See livereload.com
for more info.
To use LiveReload, you need a client (this script) in your browser and a server
running on your development machine.
This repository (livereload.js) implements the client side of the protocol. The
client connects to a LiveReload server via web sockets and listens for
incoming change notifications. When a CSS or an image file is modified, it is
live-refreshed without reloading the page. When any other file is modified,
the page is reloaded.
The server notifies the client whenever a change is made”
https://github.com/livereload/livereload-js
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Livereload e Grunt
• Livereload è uno script che apre un websocket in ascolto sulla pagina e
scatena il reload della stessa una volta invocato
• Lo script di Livereload può essere iniettato manualmente, tramite un
extension del browser o dal plugin di connect
• Il server di Livereload è istanziato dal plugin watch
• Grunt scatena il reload automatico della pagina alla conclusione del task
Istruendo opportunamente i plugin grunt-contrib-watch e grunt-contrib-
connect abbiamo l’aggiornamento automatico della pagina ad ogni modifica
di una risorsa
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Ciclo di sviluppo (Update)
• Premessa: avvio il task di Grunt di watch all’apertura del progetto o
aggancio - tramite Task Runner Explorer di Visual Studio - il task
all’apertura del progetto
• Modifico i sorgenti
 Watch si accorge della modifica
 Watch rilancia il task di build
 Livereload invoca aggiorna la pagina alla conclusione della build
• Lancio un task di Grunt
• Riaggiorno la pagina del Browser Meglio, vero?
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Trasformare le risorse
• Compiliamo i file Less in Css con grunt-contrib-less
• Compiliamo I file TypeScript con grunt-typescript
• TypeScript compila, concatena i files e produce il file source map per il
debug del codice TypeScript all’interno del browser
• Il source map prodotto da TypeScript può essere l’input del source
map generato a valle dal task uglify
• Il task grunt-contrib-less permette di assegnare le variabili Less
all’interno della configurazione dei task
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
demo
Watch, Livereload e file transformation (Less, TypeScript)
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Voglio di più!
• Mocking dei servizi
• Lanciare unit test
• Validare JavaScript con JsHint
• Autoprefix nei Css
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Mocking dei servizi
• Utilizziamo i custom task per scegliere quale versione del servizio
(mock o reale) utilizzare in base al valore di una variabile di
configurazione. La variabile è valorizzata dal task chiamante:
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
demo
Grunt to the max
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
La command line
• Inizializzare un progetto: npm init
• Installare un package con npm : npm install <package> [--savedev]
• Installare Grunt: npm install grunt --savedev
• Aggiornare le dipendenze di npm: npm update
• Verificare le dipendenze npm: npm list [-g] [--depth=0]
• Inizializzare bower: bower init
• Scaricare librerie con bower: bower install <libreria> [--save]
• Eseguire grunt: grunt <nome-task> [--verbose]
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Mamma, mi si è rotto Npm
• [Windows]Attenzione ad usare Npm da linea di comando la prima volta
• Unable to use NPM with fresh Install on Windows
• Se usate Windows npm install può fallire nel caso in cui moduli innestati
richiedano path > 260 caratteri
• Ci sono differenti discussioni e proposte di workaround tra le issue del
progetto Npm su GitHub
• https://github.com/npm/npm/issues/3697
• http://stackoverflow.com/questions/26155135/node-npm-windows-file-paths-are-
too-long-to-install-packages
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Cosa fare?
Verificate con npm link il grafo dei moduli per identificare se c’è qualche
errore. Se si, scegliete tra:
• Appiattite la gerarchia dichiarando alcuni sottomoduli nel file
package.json
• Appiattite la gerarchia usando i link simbolici
• Usate l’utility npm-flatten
• Usate il comando npm dedupe
• Attendere prego…
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
npm@3
“npm will add dedupe-at-install-time by default. This is significantly
more feasible than Node's module system changing, but it is still not
exactly trivial, and involves a lot of reworking of some long-entrenched
patterns.”
https://github.com/npm/npm/issues/6912
more on http://blog.npmjs.org/
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Npm, Windows e Visual Studio: manuale di
sopravvivenza
• Visual Studio non dà notifica di quando il download di un
package si è concluso  aspettate o usate la CLI
• Se Npm va in errore e non capite il perchè:
• Munitevi di tanta pazienza
• Leggete il file npm-debug.log
• Lanciate il comando npm list per verificare le dipendenze
• Verificate la versione di node e npm richiesta dai packages
• In caso l’errore persista, lanciate npm update per aggiornare le
dipendenze
• In caso l’errore persista, lanciate npm cache clear e riprovate
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Cosa ci ho guadagnato?
• Ordine e separazione delle responsabilità dei tools
• Automatizzazione: possiamo concentrarci (quasi) solo sui requisiti
funzionali
• Netta separazione tra client da sviluppo server
• Nuove funzionalità non presenti in Visual Studio
…Ho fatto contento il frontend developer
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Se oggi voglio usare Visual Studio con Grunt e
Bower?
• Visual Studio 2015 CTP6
• Visual Studio 2013
• Introducing Gulp, Grunt, Bower, and npm support for Visual Studio
• Task Runner Explorer Extension
• NPM/Bower Package Intellisense
• Grunt Launcher
• Usare Visual Studio come editor e Npm, Grunt e Bower a
linea di comando
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Link utili
• Bower
• http://bower.io
• http://bower.io/search/
• Npm
• https://www.npmjs.com
• http://blog.npmjs.org
• Grunt
• http://gruntjs.com
• http://gruntjs.com/plugins
• http://reboot.carucci.org/frontend-life-is-easy-with-grunt
• Source Map
• http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/
• Livereload
• http://livereload.com
#CDays14 – Milano 25, 26 e 27 Febbraio 2014
Q&A
Tutto il materiale di questa sessione su
http://www.communitydays.it/
Lascia subito il feedback su questa sessione,
potrai essere estratto per i nostri premi!
Seguici su
Twitter @CommunityDaysIT
Facebook http://facebook.com/cdaysit
#CDays15

Weitere ähnliche Inhalte

Ähnlich wie CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL STUDIO 2015

CDays15 - AZ08 - DocumentDB: il NoSql secondo Azure
CDays15 - AZ08 - DocumentDB: il NoSql secondo AzureCDays15 - AZ08 - DocumentDB: il NoSql secondo Azure
CDays15 - AZ08 - DocumentDB: il NoSql secondo AzureDavide Benvegnù
 
Single Page Applications
Single Page ApplicationsSingle Page Applications
Single Page ApplicationsRoberto Messora
 
Sviluppare applicazioni web (completamente) on-line con Visual Studio Online ...
Sviluppare applicazioni web (completamente) on-line con Visual Studio Online ...Sviluppare applicazioni web (completamente) on-line con Visual Studio Online ...
Sviluppare applicazioni web (completamente) on-line con Visual Studio Online ...Marco Parenzan
 
DbUp - A real case of database migration
DbUp - A real case of database migrationDbUp - A real case of database migration
DbUp - A real case of database migrationAndrea Cirioni
 
Meetup Azure DevOps
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOpsdotnetcode
 
Meetup Azure DevOps
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOpsdotnetcode
 
Azure No-Sql approach: DocumentDB
Azure No-Sql approach: DocumentDBAzure No-Sql approach: DocumentDB
Azure No-Sql approach: DocumentDBDavide Benvegnù
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaXPeppers
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
 
Azure cointainer instances e sql server
Azure cointainer instances e sql serverAzure cointainer instances e sql server
Azure cointainer instances e sql serverDanilo Dominici
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationTiziano Serritella
 
Da JavaScript a TypeScript
Da JavaScript a TypeScriptDa JavaScript a TypeScript
Da JavaScript a TypeScriptRoberto Messora
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Web app slots and WebAPI versioning
Web app slots and WebAPI versioningWeb app slots and WebAPI versioning
Web app slots and WebAPI versioningNicolò Carandini
 

Ähnlich wie CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL STUDIO 2015 (20)

CDays15 - AZ08 - DocumentDB: il NoSql secondo Azure
CDays15 - AZ08 - DocumentDB: il NoSql secondo AzureCDays15 - AZ08 - DocumentDB: il NoSql secondo Azure
CDays15 - AZ08 - DocumentDB: il NoSql secondo Azure
 
Single Page Applications
Single Page ApplicationsSingle Page Applications
Single Page Applications
 
Sviluppare applicazioni web (completamente) on-line con Visual Studio Online ...
Sviluppare applicazioni web (completamente) on-line con Visual Studio Online ...Sviluppare applicazioni web (completamente) on-line con Visual Studio Online ...
Sviluppare applicazioni web (completamente) on-line con Visual Studio Online ...
 
Sviluppare SPA con Vue
Sviluppare SPA con VueSviluppare SPA con Vue
Sviluppare SPA con Vue
 
Sviluppare SPA con Vue.js
Sviluppare SPA con Vue.jsSviluppare SPA con Vue.js
Sviluppare SPA con Vue.js
 
DbUp - A real case of database migration
DbUp - A real case of database migrationDbUp - A real case of database migration
DbUp - A real case of database migration
 
Meetup Azure DevOps
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOps
 
Meetup Azure DevOps
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOps
 
VS Package @ CD2008
VS Package @ CD2008VS Package @ CD2008
VS Package @ CD2008
 
Azure No-Sql approach: DocumentDB
Azure No-Sql approach: DocumentDBAzure No-Sql approach: DocumentDB
Azure No-Sql approach: DocumentDB
 
Javascript Unit Testing
Javascript Unit TestingJavascript Unit Testing
Javascript Unit Testing
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastruttura
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
 
Azure cointainer instances e sql server
Azure cointainer instances e sql serverAzure cointainer instances e sql server
Azure cointainer instances e sql server
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automation
 
Hadoop analyzerJR
Hadoop analyzerJRHadoop analyzerJR
Hadoop analyzerJR
 
Da JavaScript a TypeScript
Da JavaScript a TypeScriptDa JavaScript a TypeScript
Da JavaScript a TypeScript
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
Web app slots and WebAPI versioning
Web app slots and WebAPI versioningWeb app slots and WebAPI versioning
Web app slots and WebAPI versioning
 

Mehr von Gianluca Carucci

AI&ML Conference 2019 - Deep Learning from zero to hero
AI&ML Conference 2019 - Deep Learning from zero to heroAI&ML Conference 2019 - Deep Learning from zero to hero
AI&ML Conference 2019 - Deep Learning from zero to heroGianluca Carucci
 
Working Software 2019 - TypeScript come (forse) non lo hai mai visto
Working Software 2019 - TypeScript come (forse) non lo hai mai vistoWorking Software 2019 - TypeScript come (forse) non lo hai mai visto
Working Software 2019 - TypeScript come (forse) non lo hai mai vistoGianluca Carucci
 
KLab 2019 Meetup - TypeScript come (forse) non lo hai mai visto
KLab 2019 Meetup - TypeScript come (forse) non lo hai mai vistoKLab 2019 Meetup - TypeScript come (forse) non lo hai mai visto
KLab 2019 Meetup - TypeScript come (forse) non lo hai mai vistoGianluca Carucci
 
Pycon9 - Deep Learning from zero to hero
Pycon9 - Deep Learning from zero to heroPycon9 - Deep Learning from zero to hero
Pycon9 - Deep Learning from zero to heroGianluca Carucci
 
Ask The Expert - Typescript: A stitch in time saves nine
Ask The Expert - Typescript: A stitch in time saves nineAsk The Expert - Typescript: A stitch in time saves nine
Ask The Expert - Typescript: A stitch in time saves nineGianluca Carucci
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETGianluca Carucci
 

Mehr von Gianluca Carucci (6)

AI&ML Conference 2019 - Deep Learning from zero to hero
AI&ML Conference 2019 - Deep Learning from zero to heroAI&ML Conference 2019 - Deep Learning from zero to hero
AI&ML Conference 2019 - Deep Learning from zero to hero
 
Working Software 2019 - TypeScript come (forse) non lo hai mai visto
Working Software 2019 - TypeScript come (forse) non lo hai mai vistoWorking Software 2019 - TypeScript come (forse) non lo hai mai visto
Working Software 2019 - TypeScript come (forse) non lo hai mai visto
 
KLab 2019 Meetup - TypeScript come (forse) non lo hai mai visto
KLab 2019 Meetup - TypeScript come (forse) non lo hai mai vistoKLab 2019 Meetup - TypeScript come (forse) non lo hai mai visto
KLab 2019 Meetup - TypeScript come (forse) non lo hai mai visto
 
Pycon9 - Deep Learning from zero to hero
Pycon9 - Deep Learning from zero to heroPycon9 - Deep Learning from zero to hero
Pycon9 - Deep Learning from zero to hero
 
Ask The Expert - Typescript: A stitch in time saves nine
Ask The Expert - Typescript: A stitch in time saves nineAsk The Expert - Typescript: A stitch in time saves nine
Ask The Expert - Typescript: A stitch in time saves nine
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NET
 

CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL STUDIO 2015

  • 1. ASP05 - Npm, grunt e bower il nuovo package manager di Visual Studio 2015 Gianluca Carucci Software Engineer & Agile Coach gianluca@carucci.org - @rucka http://gianluca.carucci.org http://reboot.carucci.org http://blogs.ugidotnet.org/rucka
  • 2. #CDays15 – Milano 24, 25 e 26 Marzo 2015 Grazie a Platinum Sponsor
  • 3. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Obiettivi • Automatizzare la gestione delle risorse web • Automatizzare il packaging delle risorse web • Ottimizzare le risorse web • Rendere il progetto web accessibile ad un frontend developer • Uscire entro le 19 dall’ufficio • Non essere chiamato il sabato e la domenica per un problema in produzione
  • 4. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Agenda • Perché cambiare? • Come? • Si, ma ci ho guadagnato?
  • 5. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Di cosa non parleremo • ASP.NET • NuGet • Design del codice • Coding style • Pattern • Sicurezza
  • 6. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Di cosa parleremo
  • 7. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Un po’ di spolier
  • 8. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 L’esigenza • Scaricare e gestire nel progetto le librerie esterne (jQuery, Angular, Boostrap …) • Ottimizzare le risorse utilizzate dal website (minificazione e compressione) • Trasformare le risorse (file Sass, Less, TypeScript o CoffeeScript) • Lanciare unit test client side • Validare il codice JavaScript (JsHint)
  • 9. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Cosa abbiamo oggi NuGet WebEssentials Bundles
  • 10. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Right tool for the right job “Where does that leave NuGet? You can still use it for these, but it is more ideally suited for .NET libraries. There are packages for angular, for example, in NuGet. In fact, I co-maintain the Angular NuGet packages with Scott Hanselman. But when I need to install client libraries into any project type, I use bower. Right tool for the right job. NuGet for .NET libraries, bower and npm for JavaScript libraries.” John Papa
  • 11. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Perché cambiare? • Non è detto che i package NuGet siano gestiti da chi sviluppa la libreria • I folder Content includono files di librerie mischiate tra loro e a volte anche in più versioni • I bundle richiedono ASP.NET: dipendenza client dal server • Risorse lato client e lato server mischiate • Poca automatizzazione e molta confusione Ai frontend developer chi ci pensa?
  • 12. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Di cosa abbiamo bisogno • Un package manager per le risorse client  Bower • Un task runner per automatizzare il building degli asset  Grunt • Un package manager per gestire e scaricare i tool a supporto dello sviluppo (Bower, Grunt etc…)  Npm
  • 13. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Npm • Package manager di Node.js (e delle librerie JavaScript client side) • Le dipendenze locali sono installate nel folder node_modules • Nested dependency tree • Versioning dei package basato su semantic versioning (semver) • 53000+ moduli • I moduli sono ricercabili sul sito https://www.npmjs.com o tramite il comando npm search [--long] [search terms ...]
  • 14. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Bower • Package manager per le librerie client • Le librerie sono scaricate nel folder bower_components • Flat dependency tree • Versioning delle librerie basato su semantic versioning (semver) • 7000+ librerie • Le librerie sono ricercabili su http://bower.io/search o tramite il comando bower search <name>
  • 15. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 {package,bower}.json { ‘name’ : ‘project name’ ‘version’ : ‘project version’, ‘dependencies’ : { ‘package-name’ : ‘package version’ }, ‘devDependencies’ : { ‘package-name’ : ‘packageversion’, ‘package-name’ : ‘packageversion’ } } Comandi: npm init npm install <package> npm install <package> -g npm install <package> --save npm install <package> --save-dev Comandi: # da package registrato $ bower install jquery#1.2.3 # da GitHub $ bower install ashkenas/underscore # da endpoint Git $ bower install git://github.com/user/package.git # da URL generico $ bower install http://underscorejs.org/underscore.js Nota: il comando install supporta --save e --save-dev come Npm
  • 16. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Grunt • E’ un task runner che automatizza attività ripetitive a corredo dello sviluppo • Se installate grunt-cli globale (npm install grunt-cli -g) i task possono essere lanciati da linea di comando • Il flag --verbose mostra a console i dettagli dei singoli task eseguiti da Grunt • I task sono plugin distribuiti da Npm • I task sono componibili in task alias • In Visual Studio i task possono essere collegati agli eventi dell’ide (apertura del progetto, build, clean) • 3000+ plugin • I plugin sono ricercabili sul sito http://gruntjs.com/plugins
  • 17. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 GruntFile.{js,coffee} module.export = function(grunt) { grunt.initConfig({ ‘pkg’: grunt.file.readJSON(‘package.json’), taskName: { targetName: { options: { task options }, }, src: ‘files da processare’, dest: ‘files di output’ } }); grunt.loadNpmTask(‘grunt-contrib-taskName’); grunt.registerTask(‘complexTask’, [‘taskName1’, ‘taskName2’,…]); } • Contiene la configurazione dei task • È codice Node.js: possiamo usare moduli esterni e le Node.js API •Supporta codice JavaScript e CoffeeScript •I plugin sono moduli scaricabili con Npm
  • 18. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 grunt-bower-task • Scarica e installa le dipendenze di bower in un directory target (default template Visual Studio wwwroot/lib) • Nella directory target sono copiati: • I file definiti nella sezione exportsOverride del file bower.json del progetto, oppure • I file specificati nella sezione main del file bower.json delle librerie, oppure • Tutti i file nella sorgenti (inclusi licenza, readme, test…) grunt.initConfig({ bower: { install: { options: { targetDir: ‘wwwroot/lib', layout: 'byType', install: true, verbose: false, cleanTargetDir: false, cleanBowerDir: false, } } } });
  • 19. #CDays15 – Milano 24, 25 e 26 Marzo 2015 grunt-bower-task layout byType byComponent Il layout definisce la struttura del folder target. Il layout può essere customizzato anche tramite una funzione
  • 20. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 demo Grunt, Npm e Bower in Visual Studio 2015
  • 21. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 semver - versioning delle librerie • Regola di versioning dei package: dato un numero di versione MAJOR.MINOR.PATCH, incrementa il: • MAJOR version in caso di cambiamento delle API incompatibile, • MINOR version in caso di aggiunta di funzionalità backwards compatibile • PATCH version in caso di bug fix backwards-compatible. • Eccezione: major version zero (0.y.z) identifica uno sviluppo iniziale. Tutto può variare a questo stadio  le e API NON devono essere considerate stabili!
  • 22. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 semver - definizione delle dipendenze • Bower o Npm scaricano la versione della libreria richiesta, secondo le regole semantiche indicate nelle dipendenze. • Le dipendenze, possono contenere espressioni che utilizzano gli operatori <, <=, >, >=, = e le wildcard *,X,^, ~
  • 23. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 semver – Esempi • "2.1.2" -> 2.1.2 • * -> tutte le versioni • X sostituisce qualsiasi valore nella posizione occupata (1.x equivale a >=1.0.0 < 2.0.0, 1.2.x equivale a >=1.2.0 < 1.3) • ~ seleziona una patch se il patch number è specificato (‘~1.2.3` := `>=1.2.3 <1.(2+1).0`), qualsiasi patch altrimenti (`~1.2` := `>=1.2.0 <1.(2+1).0` ) • ^2.1 seleziona la versione per cui non è modificato il numero più significativo diverso da zero partendo da sinistra (`^1.2.3` := `>=1.2.3 <2.0.0`,`^0.2.3` := `>=0.2.3 <0.3.0`)
  • 24. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Supporto di Npm, Grunt e Bower in Visual Studio 2015 • Visual Studio scarica i package automaticamente alla modifica del file package.json (Npm) o bower.json (Bower) • I task di Grunt possono essere lanciati dal Task Runner Explorer • I task di Grunt possono essere associati agli eventi dell’IDE (build, clean, open solution) • Intellisense ovunque! Attenzione! Visual Studio non da un feedback sul progress del download dei package
  • 25. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Ottimizziamo! • Vogliamo: • Minimizzare l’occupazione di spazio delle risorse (immagini, stili e script) • Debug - agevole – delle stesse risorse minimizzate e rilasciate in ambiente di produzione • “only pay for what we use” • Abbiamo bisogno di: • Plugin di Grunt per ottimizzare le varie tipologie di risorse • Grunt per orchestrare il processo di ottimizzazione • Source Map per il debug degli script «come se fossero i file sorgente»
  • 26. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Source map • File in formato json (.map) che contiene il mapping tra i simboli del sorgente e del file target • Mappano (anche) files di tipo eterogeneo • Interpretati dai DevTools dei browser per debuggare il file originale • Scaricano le risorse on demand • Attenzione! Il debbugger di Visual Studio non supporta i source map
  • 27. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Plugin di Grunt • grunt-bower-task  scarica e istalla le dipendenze • grunt-contrib-copy  copia files e folders da una sorgente ad una destinazione • grunt-contrib-clean  cancella files o folders • grunt-contrib-uglify  concatena, minifica e genera le source map a partire da file JavaScript in ingressa • grunt-contrib-cssmin  minifica files css • grunt-uncss  elimina gli stili css non referenziati nell’html • grunt-contrib-imagemin  comprime e ottimizza immagini
  • 28. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Workflow copy /assets scripts images styles *.html /wwwroot/src/assets scripts images styles *.html /wwwroot/src/lib bower.json cssmin bower uglify uncss imagemin /wwwroot site.css images app.js, app.js.map *.html copia trasformazione scripts styles
  • 29. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 demo Ottimizzare le risorse
  • 30. #CDays15 – Milano 24, 25 e 26 Marzo 2015 Quanto ho risparmiato? Prima • Immagini 878Kb • Stili 141Kb • Script 1.07Mb • TOTALE 2.08Mb Dopo • Immagini 804Kb • Stili 18.3Kb • Script 206Kb • TOTALE 1.00Mb
  • 31. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Grunt - globbing patterns • ‘/’ è il separatore di directory • ‘?’ indica un singolo carattere escluso ‘/’ • ‘*’ indica uno o più caratteri eccetto ‘/’ • ‘**’ indica uno o più caratteri incluso ‘/’ • ‘{}’ uno tra le stringhe separate da virgola • ‘!’ nega il pattern successivo • Supporta i template per utilizzare valori di configurazione
  • 32. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Grunt - static e dynamic mapping
  • 33. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Ciclo di sviluppo • Modifico i sorgenti • Lancio un task di Grunt • Riaggiorno la pagina del Browser 2 step su 3 sono superflui!
  • 34. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Watch e Connect • grunt-contrib-watch è un plugin che monitora files/folders e lancia un task alla modifica di una o più risorse • grunt-contrib-connect è un plugin che lancia un web server customizzabile, per ospitare le risorse contenute in un folder fisico
  • 35. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Livereload “LiveReload is a tool for web developers and designers. See livereload.com for more info. To use LiveReload, you need a client (this script) in your browser and a server running on your development machine. This repository (livereload.js) implements the client side of the protocol. The client connects to a LiveReload server via web sockets and listens for incoming change notifications. When a CSS or an image file is modified, it is live-refreshed without reloading the page. When any other file is modified, the page is reloaded. The server notifies the client whenever a change is made” https://github.com/livereload/livereload-js
  • 36. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Livereload e Grunt • Livereload è uno script che apre un websocket in ascolto sulla pagina e scatena il reload della stessa una volta invocato • Lo script di Livereload può essere iniettato manualmente, tramite un extension del browser o dal plugin di connect • Il server di Livereload è istanziato dal plugin watch • Grunt scatena il reload automatico della pagina alla conclusione del task Istruendo opportunamente i plugin grunt-contrib-watch e grunt-contrib- connect abbiamo l’aggiornamento automatico della pagina ad ogni modifica di una risorsa
  • 37. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Ciclo di sviluppo (Update) • Premessa: avvio il task di Grunt di watch all’apertura del progetto o aggancio - tramite Task Runner Explorer di Visual Studio - il task all’apertura del progetto • Modifico i sorgenti  Watch si accorge della modifica  Watch rilancia il task di build  Livereload invoca aggiorna la pagina alla conclusione della build • Lancio un task di Grunt • Riaggiorno la pagina del Browser Meglio, vero?
  • 38. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Trasformare le risorse • Compiliamo i file Less in Css con grunt-contrib-less • Compiliamo I file TypeScript con grunt-typescript • TypeScript compila, concatena i files e produce il file source map per il debug del codice TypeScript all’interno del browser • Il source map prodotto da TypeScript può essere l’input del source map generato a valle dal task uglify • Il task grunt-contrib-less permette di assegnare le variabili Less all’interno della configurazione dei task
  • 39. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 demo Watch, Livereload e file transformation (Less, TypeScript)
  • 40. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Voglio di più! • Mocking dei servizi • Lanciare unit test • Validare JavaScript con JsHint • Autoprefix nei Css
  • 41. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Mocking dei servizi • Utilizziamo i custom task per scegliere quale versione del servizio (mock o reale) utilizzare in base al valore di una variabile di configurazione. La variabile è valorizzata dal task chiamante:
  • 42. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 demo Grunt to the max
  • 43. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 La command line • Inizializzare un progetto: npm init • Installare un package con npm : npm install <package> [--savedev] • Installare Grunt: npm install grunt --savedev • Aggiornare le dipendenze di npm: npm update • Verificare le dipendenze npm: npm list [-g] [--depth=0] • Inizializzare bower: bower init • Scaricare librerie con bower: bower install <libreria> [--save] • Eseguire grunt: grunt <nome-task> [--verbose]
  • 44. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Mamma, mi si è rotto Npm • [Windows]Attenzione ad usare Npm da linea di comando la prima volta • Unable to use NPM with fresh Install on Windows • Se usate Windows npm install può fallire nel caso in cui moduli innestati richiedano path > 260 caratteri • Ci sono differenti discussioni e proposte di workaround tra le issue del progetto Npm su GitHub • https://github.com/npm/npm/issues/3697 • http://stackoverflow.com/questions/26155135/node-npm-windows-file-paths-are- too-long-to-install-packages
  • 45. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Cosa fare? Verificate con npm link il grafo dei moduli per identificare se c’è qualche errore. Se si, scegliete tra: • Appiattite la gerarchia dichiarando alcuni sottomoduli nel file package.json • Appiattite la gerarchia usando i link simbolici • Usate l’utility npm-flatten • Usate il comando npm dedupe • Attendere prego…
  • 46. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 npm@3 “npm will add dedupe-at-install-time by default. This is significantly more feasible than Node's module system changing, but it is still not exactly trivial, and involves a lot of reworking of some long-entrenched patterns.” https://github.com/npm/npm/issues/6912 more on http://blog.npmjs.org/
  • 47. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Npm, Windows e Visual Studio: manuale di sopravvivenza • Visual Studio non dà notifica di quando il download di un package si è concluso  aspettate o usate la CLI • Se Npm va in errore e non capite il perchè: • Munitevi di tanta pazienza • Leggete il file npm-debug.log • Lanciate il comando npm list per verificare le dipendenze • Verificate la versione di node e npm richiesta dai packages • In caso l’errore persista, lanciate npm update per aggiornare le dipendenze • In caso l’errore persista, lanciate npm cache clear e riprovate
  • 48. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Cosa ci ho guadagnato? • Ordine e separazione delle responsabilità dei tools • Automatizzazione: possiamo concentrarci (quasi) solo sui requisiti funzionali • Netta separazione tra client da sviluppo server • Nuove funzionalità non presenti in Visual Studio …Ho fatto contento il frontend developer
  • 49. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Se oggi voglio usare Visual Studio con Grunt e Bower? • Visual Studio 2015 CTP6 • Visual Studio 2013 • Introducing Gulp, Grunt, Bower, and npm support for Visual Studio • Task Runner Explorer Extension • NPM/Bower Package Intellisense • Grunt Launcher • Usare Visual Studio come editor e Npm, Grunt e Bower a linea di comando
  • 50. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Link utili • Bower • http://bower.io • http://bower.io/search/ • Npm • https://www.npmjs.com • http://blog.npmjs.org • Grunt • http://gruntjs.com • http://gruntjs.com/plugins • http://reboot.carucci.org/frontend-life-is-easy-with-grunt • Source Map • http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/ • Livereload • http://livereload.com
  • 51. #CDays14 – Milano 25, 26 e 27 Febbraio 2014 Q&A Tutto il materiale di questa sessione su http://www.communitydays.it/ Lascia subito il feedback su questa sessione, potrai essere estratto per i nostri premi! Seguici su Twitter @CommunityDaysIT Facebook http://facebook.com/cdaysit #CDays15