Adesso utilizzeremo la nuova sintassi di ES6, che rappresenta un notevole miglioramento rispetto alla "vecchia" sintassi ES5. Tutti i browser sono in grado di comprendere la sintassi ES5, ma per il momento non supportano ancora ES6. Utilizzeremo un tool chiamato Babel per trasformere il codice ES6 in codice compatibile con ES5. Per eseguire Babel, utilizzeremo Gulp, un task runner. È simile ai comandi presenti nella sezione scripts
del package.json
, ma scrivere i tuoi task in un file JS è più facile e pulito rispetto e scriverli in un file JSON, installeremo quindi Gulp, ed il suo plugin per Babel:
- Esegui
yarn add --dev gulp
- Esegui
yarn add --dev gulp-babel
- Esegui
yarn add --dev babel-preset-latest
- Esegui
yarn add --dev del
(per il taskclean
come vedrai fra poco) - Nel
package.json
, aggiungi un campobabel
per la configurazione di Babel. Fagli utilizzare l'ultima versione di Babel inserendo:
"babel": {
"presets": [
"latest"
]
},
Nota: Un file .babelrc
nella cartella principale del tuo progetto può essere utilizzato al posto del campo babel
nel package.json
. La cartella principale del tuo progetto diventerà sempre più piena con l'avanzare dello sviluppo, cerca quindi di utilizzare package.json
per mantenere la configurazione di Babel.
- Sposta il file
index.js
in una nuova cartellasrc
. Là dentro è dove scriverai tutto il tuo codice ES6. La cartellalib
conterrà il codice ricompilato in ES5. Gulp e Babel si occuperanno di creare il tutto. Rimuovi tutti il codice precedente relativo acolor
-related nel fileindex.js
, e sostituiscilo con:
const str = 'ES6';
console.log(`Hello ${str}`);
Stiamo utilizzando un modello (template) di stringa, si tratta di una nuova funzionalità di ES6 che permette di inserire variabili direttamente all'interno di una stringa, senza concatenazioni, utilizzando ${}
. Fai attenzione che le stringhe template vengono create utilizzando gli apici inversi.
- Crea un file
gulpfile.js
contenente:
const gulp = require('gulp');
const babel = require('gulp-babel');
const del = require('del');
const exec = require('child_process').exec;
const paths = {
allSrcJs: 'src/**/*.js',
libDir: 'lib',
};
gulp.task('clean', () => {
return del(paths.libDir);
});
gulp.task('build', ['clean'], () => {
return gulp.src(paths.allSrcJs)
.pipe(babel())
.pipe(gulp.dest(paths.libDir));
});
gulp.task('main', ['build'], (callback) => {
exec(`node ${paths.libDir}`, (error, stdout) => {
console.log(stdout);
return callback(error);
});
});
gulp.task('watch', () => {
gulp.watch(paths.allSrcJs, ['main']);
});
gulp.task('default', ['watch', 'main']);
Cerchiamo di capire il contenuto di questo file.
Le API di Gulp sono abbastanza lineari. Definiscono dei gulp.task
, che possono fare riferimento a dei file sorgente gulp.src
, applicandogli una catena di modificatori tramite .pipe()
(ad esempio nel nostro caso babel()
) e inserisce il file di outputi in gulp.dest
. Può inoltre utilizzare gulp.watch
per controllare i cambiamenti nei file. I task i Gulppossono eseguire degli altri task preparatori, utilizzando un array in questo formato (es: ['build']
) come secondo parametro di gulp.task
. Fai riferimento alla documentazione per una spiegazione più articolata.
Prima definiamo un oggetto paths
per memorizzare tutti i percorsi dei file e mantenere una configurazione pulita.
Definiamo poi 5 task: build
, clean
, main
, watch
, e default
.
build
è dove viene chiamato Babel per trasformare tutti i nostri file sorgente nella cartellasrc
e scrivere quelli trasformati inlib
.clean
cancella tutti i file autogenerati inlib
, prima di eseguire un taskbuild
. Questo è utile per ripulire tutti i file compilati che non sono più necessari, ad esempio perchè gli originali insrc
sono stati cancellati o rinominati , o per assicurarci che la cartellalib
sia sempre sincronizzata consrc
nel caso in cui la build fallisca. Utilizziamo il pacchettodel
per cancellare i file in un modo che si integra bene con il flusso di processamento di Gulp (questo è il metodo raccomandato per cancellare file con Gulp).main
è l'equivalente dinode .
che abbiamo utilizzato nel capitolo precedente, con l'eccezione che questa volta vogliamo eseguirlo sul filelib/index.js
. Siccomeindex.js
è il file che Node cerca di default, possiamo semplicemente scriverenode lib
(utilizziamo la variabilelibDir
per mantenere la configurazione pulita).require('child_process').exec
eexec
sono delle funzioni native di Node per l'esecuzione di comandi su shell. Redirigiamostdout
suconsole.log()
ritorniamo eventuali errori tramite la callback digulp.task
. Non preoccuparti se non capisci nei dettagli quello che sta succedendo, ricordati che è semplicemente l'equivalente di eseguirenode lib
.watch
esegue il taskmain
quando vengono riscontrate delle modifiche nei file elencati.default
è un task specifico che viene eseguito se esegui semplicementegulp
da terminale. Nel nostro caso vogliamo fargli eseguire siawatch
chemain
(per la prima esecuzione).
Nota: Potresti chiederti perchè stiamo utilizzando direttamente del codice ES6 nel file Gulp, senza convertirlo in ES5 con Babel. È perchè stiamo utilizzando una versione di Node che supporta nativamente ES6 (assicurati di utilizzare Node > 6.5.0 con il comando node -v
).
OK! Vediamo se funziona tutto.
-
Nel
package.json
, cambia lo scriptstart
con:"start": "gulp"
. -
Esegui
yarn start
. Dovrebbe scrivere "Hello ES6" ed iniziare a controllare le modifiche sui file. Prova ad inserire del codice non funzionante insrc/index.js
per verificare che Gulp ti mostra automaticamente l'errore appena salvi il file. -
Aggiungi
/lib/
al tuo.gitignore
Prossima sezione: 4 - Utilizzare la sintassi ES6 con una classe
Torna alla sezione precedente o all'indice.