Grunt - Guida rapida
Cos'è Grunt?
Grunt è un Task Runner JavaScript che può essere utilizzato come strumento da riga di comando per oggetti JavaScript. È un task manager scritto sopra NodeJS.
Perché usare Grunt?
Grunt può eseguire facilmente attività ripetitive, come compilazione, test di unità, minimizzazione di file, test in esecuzione, ecc.
Grunt include attività integrate che estendono la funzionalità dei tuoi plugin e script.
L'ecosistema di Grunt è enorme; puoi automatizzare qualsiasi cosa con uno sforzo molto minore.
Storia
Le prime righe di codice sorgente sono state aggiunte a GruntJS nel 2011. Il Grunt v0.4 è stato rilasciato il 18 febbraio 2013. Il Grunt v0.4.5 è stato rilasciato il 12 maggio 2014. La versione stabile di Grunt è 1.0.0 rc1 che è stato rilasciato l'11 febbraio 2016.
Vantaggi
Utilizzando Grunt, puoi eseguire facilmente la minificazione, la compilazione e il test dei file.
Grunt unifica i flussi di lavoro degli sviluppatori web.
Puoi facilmente lavorare con una nuova base di codice usando Grunt perché contiene meno infrastruttura.
Accelera il flusso di lavoro di sviluppo e migliora le prestazioni dei progetti.
Svantaggi
Ogni volta npm pacchetti vengono aggiornati, è necessario attendere che l'autore del Grunt lo aggiorni.
Ogni attività è progettata per svolgere un lavoro specifico. Se vuoi estendere un'attività specifica, devi usare alcuni trucchi per portare a termine il lavoro.
Grunt include un gran numero di parametri di configurazione per i singoli plugin. Di solito, i file di configurazione di Grunt sono più lunghi.
Grunt è un task runner basato su JavaScript, il che significa che può automatizzare attività ripetitive in un flusso di lavoro e può essere utilizzato come strumento da riga di comando per oggetti JavaScript.
Alcune delle caratteristiche più importanti di GruntJS sono elencate di seguito:
Grunt rende il flusso di lavoro facile come scrivere un file di installazione.
Puoi automatizzare le attività ripetitive con il minimo sforzo.
Grunt è un popolare task runner basato su NodeJS. È flessibile e ampiamente adottato.
Ha un approccio diretto che include attività in JS e configurazione in JSON.
Grunt minimizza JavaScript, file CSS, file di test, compilazione di file del preprocessore CSS (SASS, LESS), ecc.
Grunt include attività integrate che estendono la funzionalità dei tuoi plugin e script.
Accelera il flusso di lavoro di sviluppo e migliora le prestazioni dei progetti.
Puoi facilmente lavorare con una nuova base di codice usando Grunt perché contiene meno infrastruttura.
L'ecosistema di Grunt è enorme; puoi automatizzare qualsiasi cosa con uno sforzo molto minore.
Grunt riduce la possibilità di ricevere errori durante l'esecuzione di attività ripetitive.
Grunt ha attualmente oltre 4000 plugin.
Può essere utilizzato in grandi siti di produzione.
Questo capitolo fornisce una procedura passo passo su come installare Grunt sul tuo sistema.
Requisiti di sistema per Grunt
Operating System - Cross-platform
Browser Support - IE (Internet Explorer 8+), Firefox, Google Chrome, Safari, Opera
Installazione di Grunt
Step 1- Abbiamo bisogno di NodeJ per eseguire Grunt. Per scaricare NodeJs, apri il linkhttps://nodejs.org/en/, vedrai una schermata come mostrato di seguito -
Scarica la versione con le funzionalità più recenti del file zip.
Step 2- Quindi, esegui il setup per installare i NodeJ sul tuo computer.
Step 3- Successivamente, è necessario impostare le variabili di ambiente .
Path User Variable
- Fare clic con il tasto destro su My Computer.
- Selezionare Properties.
- Quindi seleziona Advanced scheda e fare clic su Environment Variables.
Nella finestra Variabili d'ambiente , fare doppio clic sul PERCORSO come mostrato nella schermata.
Otterrai una finestra Modifica variabile utente come mostrato. Aggiungi il percorso della cartella NodeJs nel campo Valore variabile come C: \ Programmi \ nodejs \ node_modules \ npm . Se il percorso è già impostato per altri file, è necessario inserire un punto e virgola (;) dopo di che e aggiungere il percorso NodeJs come mostrato di seguito -
Alla fine, fai clic sul pulsante OK .
System Variable
In Variabili di sistema , fare doppio clic su Percorso come mostrato nella schermata seguente.
Otterrai una finestra Modifica variabile di sistema come mostrato. Aggiungi il percorso della cartella NodeJs nel campo Valore variabile come C: \ Programmi \ nodejs \ e fai clic su OK come mostrato di seguito -
Step 4 - Per installare grunt sul tuo sistema devi installare l'interfaccia a riga di comando (CLI) di Grunt a livello globale come mostrato di seguito -
npm install -g grunt-cli
L'esecuzione del comando precedente inserirà il comando grunt nel percorso di sistema, che lo farà eseguire da qualsiasi directory.
L'installazione del grunt-cli non installa Grunt task runner. Il ruolo del grunt-cli è quello di eseguire la versione di Grunt che è stata installata accanto a un Gruntfile . Consente a una macchina di installare più versioni di Grunt contemporaneamente.
Step 5 - Ora creeremo configuration files per eseguire Grunt.
package.json
Il file package.json si trova nella directory root del progetto, accanto al Gruntfile . Il package.json viene utilizzato per eseguire correttamente ciascuna dipendenza elencata ogni volta che si esegue il comandonpm install nella stessa cartella di package.json.
Il pacchetto base.json può essere creato digitando il seguente comando nel prompt dei comandi:
npm init
Il file package.json di base sarà come mostrato di seguito:
{
"name": "tutorialspoint",
"version": "0.1.0",
"devDependencies": {
"grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-nodeunit": "~0.4.1",
"grunt-contrib-uglify": "~0.5.0"
}
}
Puoi aggiungere Grunt e gruntplugins in un file pacakge.json esistente tramite il seguente comando:
npm install <module> --save-dev
Nel comando precedente, <module> rappresenta il modulo da installare localmente. Il comando precedente aggiungerà anche il <module> a devDependencies automaticamente.
Ad esempio, il seguente comando installerà l'ultima versione di Grunt e la aggiungerà a devDependencies -
npm install grunt --save-dev
Gruntfile.js
Il file Gruntfile.js viene utilizzato per definire la nostra configurazione per Grunt. È il luogo in cui verranno scritte le nostre impostazioni. Il file Gruntfile.js di base è come mostrato di seguito:
// our wrapper function (required by grunt and its plugins)
// all configuration goes inside this function
module.exports = function(grunt) {
// CONFIGURE GRUNT
grunt.initConfig({
// get the configuration info from package.json file
// this way we can use things like name and version (pkg.name)
pkg: grunt.file.readJSON('package.json'),
// all of our configuration goes here
uglify: {
// uglify task configuration
options: {},
build: {}
}
});
// log something
grunt.log.write('Hello world! Welcome to Tutorialspoint!!\n');
// Load the plugin that provides the "uglify" task.
grunt.loadNpmTasks('grunt-contrib-uglify');
// Default task(s).
grunt.registerTask('default', ['uglify']);
};
Per utilizzare Grunt, è necessario che Node.js sia installato. L'installazione di Node.js è stata spiegata nel capitolo precedente . Puoi installare i plugin Grunt e Grunt utilizzando il gestore di pacchetti Node.js.
Prima di configurare Grunt sul sistema, puoi aggiornare il gestore di pacchetti Node utilizzando il seguente comando:
npm update -g npm
Se stai usando Mac o Linux, devi usare sudo word all'inizio della riga di comando per concedere l'accesso come amministratore come mostrato di seguito -
sudo npm update -g npm
Installazione CLI
CLI sta per Command Line Interface che esegue la versione di Grunt che è stata installata. Per iniziare con Grunt, è necessario installare globalmente l'interfaccia a riga di comando (CLI) di Grunt come mostrato di seguito -
npm install -g grunt-cli
L'esecuzione del comando precedente inserirà il comando grunt nel percorso di sistema, che lo farà eseguire da qualsiasi directory. Non è possibile installare Grunt task runner installando grunt-cli . Consente a una macchina di installare più versioni di Grunt contemporaneamente.
Funzionamento della CLI
La CLI cerca il Grunt installato sul tuo sistema usando il sistema require () ogni volta che Grunt viene eseguito. Usando grunt-cli , puoi eseguire Grunt da qualsiasi directory nel tuo progetto. Se stai usando Grunt installato localmente, grunt-cli usa la libreria Grunt installata localmente e applica la configurazione dal file Grunt.
Lavorare con un progetto nuovo e esistente
Se stai lavorando con un progetto già configurato che include package.json e Gruntfile , segui i semplici passaggi come specificato di seguito:
- Trova il percorso della directory principale del progetto.
- È possibile installare le dipendenze utilizzando il comando npm install .
- Esegui Grunt usando il comando grunt .
Se stai creando un nuovo progetto, includi i due file package.json e Gruntfile nel tuo progetto.
package.json- Il file package.json viene posizionato nella directory principale del progetto e viene utilizzato per eseguire ciascuna dipendenza elencata ogni volta che si esegue il comando npm install nella stessa cartella.
Gruntfile.js - Il file Gruntfile.js viene utilizzato per scrivere le impostazioni di configurazione per il progetto.
package.json
Il file package.json si trova nella directory principale del progetto, accanto al Gruntfile e viene utilizzato per eseguire ogni dipendenza elencata ogni volta che si esegue il comando npm install nella stessa cartella.
Puoi creare il package.json in diversi modi come elencato di seguito:
- Puoi grunt-init per creare il file package.json.
- È inoltre possibile creare il file package.json utilizzando il comando npm-init .
È possibile scrivere le specifiche come mostrato di seguito -
{
"name": "tutorialspoint",
"version": "0.1.0",
"devDependencies": {
"grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-nodeunit": "~0.4.1",
"grunt-contrib-uglify": "~0.5.0"
}
}
Puoi aggiungere Grunt e gruntplugins in un file pacakge.json esistente utilizzando il seguente comando:
npm install <module> --save-dev
Qui, <module> rappresenta il modulo da installare localmente. Il comando precedente installerà il modulo specificato e lo aggiungerà automaticamente alla sezione devDependencies .
Ad esempio, il seguente comando installerà l'ultima versione di Grunt e la aggiungerà a devDependencies -
npm install grunt --save-dev
Gruntfile
Il file Gruntfile.js è un luogo predefinito in cui verranno inserite le impostazioni di configurazione per Grunt. Il file Grunt include le seguenti parti:
- La funzione wrapper
- Configurazione progetto e attività
- Caricamento di plug-in e attività di Grunt
- Attività personalizzate
Il file Gruntfile.js di base è come mostrato di seguito:
// our wrapper function (required by grunt and its plugins)
// all configuration goes inside this function
module.exports = function(grunt) {
// CONFIGURE GRUNT
grunt.initConfig({
// get the configuration info from package.json file
// this way we can use things like name and version (pkg.name)
pkg: grunt.file.readJSON('package.json'),
// all of our configuration goes here
});
// Load the plugin that provides the "uglify" task
grunt.loadNpmTasks('grunt-contrib-uglify');
// Default task(s)
grunt.registerTask('default', ['uglify']);
};
Funzione wrapper
Nel codice sopra, module.exports è una funzione wrapper in cui l'intera configurazione va all'interno di questa funzione. È un modo per mostrare la configurazione al resto dell'applicazione.
module.exports = function(grunt) {
//do grunt-related things here
}
Configurazione di progetti e attività
Puoi configurare le attività di Grunt, una volta che la configurazione di Grunt è pronta. La configurazione del progetto può essere scritta nella sezione grunt.initConfig () . All'interno della funzione grunt.initConfig () , prendi le informazioni di configurazione dal file package.json e salvalo in pkg . Puoi chiamare il nome del tuo progetto usando pkg.name e version con pkg.version .
Caricamento di plug-in e attività di Grunt
Carica le attività da un plug-in specificato utilizzando il metodo grunt.loadNpmTasks . È possibile installare il plug-in in locale utilizzandonpme deve essere relativo al Gruntfile. Puoi caricare il plugin con un semplice comando come mostrato di seguito -
grunt.task.loadNpmTasks(pluginName)
Attività personalizzate
Quando esegui Grunt tramite la riga di comando, il Grunt cercherà l' attività predefinita . Nel codice sopra, stiamo usando un'attività chiamata uglify che può essere eseguita usando il comando grunt . È lo stesso dell'esecuzione esplicita del comando grunt uglify e puoi specificare il numero di attività nell'array.
grunt.registerTask('default', ['uglify']);
È possibile definire i dati di configurazione specifici del progetto per Grunt nel file Gruntfile.js .
Configurazione Grunt
I dati di configurazione dell'attività possono essere inizializzati nel Gruntfile utilizzando il metodo grunt.initConfig () . All'interno della funzione grunt.initConfig () , prendi le informazioni di configurazione dal file package.json. La configurazione conterrà un'attività denominataproperties e qualsiasi dato arbitrario.
grunt.initConfig({
jshint: {
// configuration for jshint task
},
cssmin: {
// configuration for cssmin task
},
// Arbitrary non-task-specific properties
my_files: ['dir1/*.js', 'dir2/*.js'],
});
Configurazione e obiettivi delle attività
Quando esegui un'attività, Grunt cerca la configurazione nella proprietà denominata attività. Definiremo attività con più configurazioni e opzioni di destinazione come mostrato di seguito:
grunt.initConfig({
jshint: {
myfile1: {
// configuration for "myfile1" target options
},
myfile2: {
// configuration for "myfile2" target options
},
},
cssmin: {
myfile3: {
// configuration for "myfile3" target options
},
},
});
Qui, l' attività jshint ha destinazioni myfile1 e myfile2 e l' attività cssmin ha destinazione myfile3 . Quando esegui il grunt jshint , itererà sia sull'attività che sulla destinazione per elaborare la configurazione della destinazione specificata.
Opzioni
Definire la proprietà delle opzioni all'interno della configurazione dell'attività che sovrascrive le impostazioni predefinite dell'attività. Ogni destinazione include proprietà di opzioni che sovrascrivono le opzioni a livello di attività. Avrà il seguente formato:
grunt.initConfig({
jshint: {
options: {
// task-level options that overrides task defaults
},
myfile: {
options: {
// "myfile" target options overrides task defaults
},
},
myfile1: {
// there is no option, target will use task-level options
},
},
});
File
Grunt fornisce alcune idee per specificare su quali file deve operare l'attività e utilizza modi diversi per specificare le mappature dei file src-dest . Di seguito sono riportate alcune delle proprietà aggiuntive supportate dalle mappature src e dest :
filter- È una funzione che specifica il percorso del file src corrispondente e restituisce valori vero o falso.
nonull - Definisce i modelli non corrispondenti quando è impostato su true.
dot - Corrisponde ai nomi dei file che iniziano con un punto o in altro modo.
matchBase - Corrisponde ai modelli che contengono barre con il nome di base del percorso.
expand - Elabora la mappatura del file src-dest.
Formato compatto
Specifica la mappatura del file src-dest per destinazione che può essere utilizzata per attività di sola lettura e richiede solo la proprietà src e nessuna proprietà dest .
grunt.initConfig({
jshint: {
myfile1: {
src: ['src/file1.js','src/file2.js']
},
},
cssmin: {
myfile2: {
src: ['src/file3.js','src/file4.js'],
dest: 'dest/destfile.js',
},
},
});
Formato oggetto file
Specifica la mappatura del file src-dest per destinazione in cui il nome della proprietà è file dest e il suo valore è file src .
grunt.initConfig({
jshint: {
myfile1: {
files: {
'dest/destfile.js':['src/file1.js','src/file2.js'],
'dest/destfile1.js':['src/file3.js','src/file4.js'],
},
},
myfile2: {
files: {
'dest/destfile2.js':['src/file22.js','src/file23.js'],
'dest/destfile21.js':['src/file24.js','src/file25.js'],
},
},
},
});
Formato di array di file
Specifica il mapping del file src-dest per destinazione utilizzando proprietà aggiuntive per mapping.
grunt.initConfig({
jshint: {
myfile1: {
files: [
{src:['src/file1.js','src/file2.js'],dest:'dest/file3.js'},
{src:['src/file4.js','src/file4.js'],dest:'dest/file5.js'},
],
},
myfile2: {
files: [
{src:['src/file6.js','src/file7.js'],dest:'dest/file8/', nonull:true},
{src:['src/file9.js','src/file10.js'],dest:'dest/file11/', filter:'isFalse'},
],
},
},
});
Formati precedenti
Il formato del file dest-as-target era presente prima dell'esistenza delle multitasks in cui il percorso del file di destinazione è il nome del target. Il formato seguente è deprecato e non deve essere utilizzato nel codice.
grunt.initConfig({
jshint: {
'dest/destfile2.js':['src/file3.js','src/file4.js'],
'dest/destfile5.js':['src/file6.js','src/file7.js'],
},
});
Funzione di filtro personalizzato
Puoi aiutare i file di destinazione con un grande livello di dettaglio utilizzando la proprietà del filtro . Il seguente formato pulisce i file solo se corrisponde a un file effettivo.
grunt.initConfig({
clean: {
myfile:{
src: ['temp/**/*'],
filter: 'isFile',
},
},
});
Modelli di globbing
Globbing significa espandere il nome del file. Grunt supporta il globbing utilizzando le librerie incorporate di node-glob e minimatch . Il modello di globbing include i seguenti punti:
- * corrisponde a qualsiasi numero di caratteri, ma non / .
- ? corrisponde a un singolo carattere, ma non / .
- ** corrisponde a un numero di caratteri incluso / .
- {} specifica un elenco separato da virgole di espressioni "o".
- ! annullerà la corrispondenza del pattern all'inizio.
Ad esempio -
{src: 'myfile/file1.js', dest: ...} // it specifies the single file
{src: 'myfile/*.js', dest: ...} //it matches all the files ending wth .js
{src: 'myfile/{file1,file2}*.js', dest: ...} //defines the single node glob pattern
{src: ['myfile/*.js', '!myfile/file1.js'], dest: ...} // all files will display in alpha
// order except for file1.js
Creazione dinamica dell'oggetto File
Quando si lavora con singoli file, è possibile utilizzare proprietà aggiuntive per creare dinamicamente un elenco di file. Quando imposti il fileexpand proprietà su true, abiliterà alcune delle seguenti proprietà:
cwd abbina tutti gli src a questo percorso.
src corrisponde ai modelli da abbinare, rispetto a cwd .
La proprietà dest specifica il prefisso del percorso di destinazione.
ext sostituirà un'estensione esistente con un valore generato nei percorsi di destinazione .
extDot indica dove si trova il periodo che indica l'estensione. Utilizza il primo o l' ultimo periodo; per impostazione predefinita, è impostato sul primo periodo
flatten rimuove tutte le parti del percorso dai percorsi di destinazione .
rinomina specifica una stringa contenente la nuova destinazione e il nome del file.
La proprietà Rename
È una funzione JavaScript unica che restituisce una stringa e non è possibile utilizzare un valore stringa per rinominare. Nel seguente esempio, l' attività di copia creerà un backup di README.md.
grunt.initConfig({
copy: {
backup: {
files: [{
expand: true,
src: ['docs/README.md'], // creating a backup of README.md
rename: function () { // specifies the rename function
return 'docs/BACKUP.txt'; // returns a string with the complete destination
}
}]
}
}
});
Modelli
È possibile specificare i modelli utilizzando i delimitatori < %% > . Verranno espansi automaticamente quando vengono letti dal file di configurazione. Include due tipi di proprietà:
<%= prop.subprop %>viene utilizzata per espandere il valore di prop.subprop nella configurazione che può fare riferimento a valori di stringa, array e altri oggetti.
<% %> esegue il codice JavaScript inline utilizzato per il flusso di controllo o il ciclo.
Ad esempio -
grunt.initConfig({
concat: {
myfile: {
options: {
banner: '/* <%= val %> */\n',
},
src: ['<%= myval %>', 'file3/*.js'],
dest: 'build/<%= file3 %>.js',
},
},
// properties used in task configuration templates
file1: 'c',
file2: 'b<%= file1 %>d',
file3: 'a<%= file2 %>e',
myval: ['file1/*.js', 'file2/*.js'],
});
Importazione di dati esterni
È possibile importare dati esterni dal file package.json . Il plugin grunt- contrib- uglify può essere usato per minimizzare il file sorgente e crea un commento banner usando i metadati. Puoi utilizzare grunt.file.readJSON e grunt.file.readYAML per importare dati JSON e YAML.
Ad esempio -
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
dist: {
src: 'src/<%= pkg.name %>.js',
dest: 'dist/<%= pkg.name %>.min.js'
}
}
});
In questo capitolo, creiamo un semplice file Grunt usando i seguenti plugin:
- grunt-contrib-uglify
- grunt-contrib-concat
- grunt-contrib-jshint
- grunt-contrib-watch
Installa tutti i plugin di cui sopra e segui i passaggi indicati di seguito per creare un semplice Gruntfile.js -
Step 1- Devi creare una funzione wrapper , che incapsuli le configurazioni per il tuo Grunt.
module.exports = function(grunt) {};
Step 2 - Inizializza il tuo oggetto di configurazione come mostrato di seguito -
grunt.initConfig({});
Step 3- Successivamente, leggi le impostazioni del progetto dal file package.json nella proprietà pkg . Ci consente di fare riferimento ai valori delle proprietà all'interno del file package.json .
pkg: grunt.file.readJSON('package.json')
Step 4- Successivamente, puoi definire le configurazioni per le attività. Creiamo il nostro primo task concat per concatenare tutti i file presenti nella cartella src / e archiviare il file .js concatenato nella cartella dist / .
concat: {
options: {
// define a string to insert between files in the concatenated output
separator: ';'
},
dist: {
// files needs to be concatenated
src: ['src/**/*.js'],
// location of the concatenated output JS file
dest: 'dist/<%= pkg.name %>.js'
}
}
Step 5- Ora, creiamo un'altra attività chiamata uglify per minimizzare il nostro JavaScript.
uglify: {
options: {
// banner will be inserted at the top of the output which displays the date and time
banner: '/*! <%= pkg.name %> <%= grunt.template.today() %> */\n'
},
dist: {
files: {
'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
}
}
}
L'attività precedente crea un file all'interno della cartella dist / che contiene i file .js minimizzati. Il<%= concat.dist.dest %>istruirà uglify a minimizzare il file generato dall'attività concatenata .
Step 6- Configuriamo il plugin JSHint creando un'attività jshint .
jshint: {
// define the files to lint
files: ['Gruntfile.js', 'src/**/*.js'],
// configure JSHint
options: {
// more options here if you want to override JSHint defaults
globals: {
jQuery: true,
}
}
}
L' attività jshint sopra accetta un array di file e quindi un oggetto di opzioni. L'attività precedente cercherà qualsiasi violazione del codice nei file Gruntfile.js e src / ** / *. Js .
Step 7- Successivamente, abbiamo l' attività di controllo che cerca le modifiche in uno qualsiasi dei file specificati ed esegue le attività specificate.
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint']
}
Step 8- Successivamente, dobbiamo caricare i plugin Grunt che sono stati tutti installati tramite _npm .
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
Step 9- Infine, dobbiamo definire l' attività predefinita .
grunt.registerTask('default', ['jshint', 'concat', 'uglify']);
L' attività predefinita può essere eseguita semplicemente digitando il comando grunt sulla riga di comando.
Ecco il tuo Gruntfile.js completo -
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
options: {
separator: ';'
},
dist: {
src: ['src/**/*.js'],
dest: 'dist/<%= pkg.name %>.js'
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today() %> */\n'
},
dist: {
files: {
'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
}
}
},
jshint: {
// define the files to lint
files: ['Gruntfile.js', 'src/**/*.js'],
// configure JSHint
options: {
// more options here if you want to override JSHint defaults
globals: {
jQuery: true,
}
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint']
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('default', ['jshint', 'concat', 'uglify']);
};
In questo capitolo, impariamo a creare attività . Ogni volta che esegui Grunt, vengono specificate una o più attività da eseguire che notificano a Grunt cosa vorresti che facesse. Se si specifica l' attività predefinita , verrà eseguita per impostazione predefinita.
Attività alias
Ogni volta che viene specificato un elenco di attività, una o più altre attività possono essere sottoposte ad alias da una nuova attività. L'esecuzione dell'alias eseguirà a sua volta tutte le attività specificate in taskList . L' argomento taskList dovrebbe essere un array di attività come mostrato di seguito:
grunt.registerTask(taskName, [description, ] taskList)
Ad esempio, quando si definisce un taskList con attività jshint , concat e uglify e si specifica taskName come predefinito , tutte le attività elencate verranno eseguite automaticamente se Grunt viene eseguito senza specificare alcuna attività.
grunt.registerTask('default', ['jshint', 'concat', 'uglify']);
È inoltre possibile specificare gli argomenti dell'attività come mostrato di seguito:
grunt.registerTask('dist', ['concat:dist', 'uglify:dist']);
Nell'attività precedente, l'alias dist esegue sia le attività concat sia quelle uglify .
Multi Tasks
Ogni volta che esegui più attività, Grunt cerca una proprietà con lo stesso nome nella configurazione di Grunt. Queste attività possono avere più configurazioni, che verranno definite utilizzando destinazioni con nomi arbitrari .
Quando si specificano sia un'attività che una destinazione, verrà elaborata solo la configurazione della destinazione specificata.
grunt concat:foo
Il comando precedente eseguirà solo il foo di destinazione .
Quando si specifica solo un'attività, verranno elaborati tutti i target.
grunt concat
Il comando precedente itererà su tutti gli obiettivi dell'attività concatenata .
Quando si rinomina un'attività con grunt.task.renameTask , Grunt cerca una proprietà con un nuovo nome di attività nell'oggetto config.
grunt.initConfig({
log: {
foo: [1, 2, 3],
bar: 'Welcome to tutorialspoint',
sap: true
}
});
grunt.registerMultiTask('log', 'Log stuff.', function() {
grunt.log.writeln(this.target + ': ' + this.data);
});
Nell'esempio precedente, multi task registrerà foo: 1,2,3 se Grunt è stato eseguito tramite grunt log: foo o registrerà bar: Benvenuto in tutorialspoint ogni volta che verrà eseguito attraverso grunt log: bar . Registrerà foo: 1,2,3 quindi bar: Welcome to tutorialspoint quindi sap: true quando Grunt viene eseguito come registro grugnito .
Attività di base
Ogni volta che esegui un'attività di base, Grunt non cercherà la configurazione o l'ambiente. Invece esegue la funzione task che è specificata, passa tutti gli argomenti separati da due punti specificati in come argomenti della funzione.
grunt.registerTask(taskName, [description, ] taskFunction)
Nell'esempio seguente, l'attività registra foo, testando 123 se Grunt viene eseguito tramite il comando grunt foo: testing: 123 . Ogni volta che l'attività viene eseguita senza argomenti come grugnito foo , l'attività registrerà foo, senza argomenti .
grunt.registerTask('foo', 'A simple task to logs stuff.', function(arg1, arg2) {
if (arguments.length === 0) {
grunt.log.writeln(this.name + ", no args");
} else {
grunt.log.writeln(this.name + ", " + arg1 + " " + arg2);
}
});
Attività personalizzate
Se non vuoi seguire la struttura multi-task , puoi definire la tua attività personalizzata come mostrato di seguito -
grunt.registerTask('default', 'My "default" task description.', function() {
grunt.log.writeln('Currently running the "default" task.');
});
È possibile eseguire un'attività all'interno di un'altra attività come mostrato di seguito:
grunt.registerTask('foo', 'My "foo" task.', function() {
// Enqueue bar and baz tasks, to run after foo completes, in-order.
grunt.task.run('bar', 'baz');
// Or:
grunt.task.run(['bar', 'baz']);
});
Puoi anche creare attività asincrone come mostrato di seguito:
grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
// Force task into async mode and grab a handle to the done() function.
var done = this.async();
// Run some sync stuff.
grunt.log.writeln('Processing your task..');
// Run some async stuff.
setTimeout(function() {
grunt.log.writeln('Finished!');
done();
}, 1000);
});
È possibile creare attività che possono accedere al loro nome e argomenti come mostrato di seguito:
grunt.registerTask('foo', 'My task "foo" .', function(a, b) {
grunt.log.writeln(this.name, a, b);
});
// Usage:
// grunt foo
// logs: "foo", undefined, undefined
// grunt foo:bar
// logs: "foo", "bar", undefined
// grunt foo:bar:baz
// logs: "foo", "bar", "baz"
È possibile creare l'attività in modo tale che, ogni volta che vengono registrati errori, le attività possono fallire come mostrato di seguito:
grunt.registerTask('foo', 'My task "foo" .', function() {
if (failureOfSomeKind) {
grunt.log.error('This is an error message.');
}
// If this task had errors then fail by returning false
if (ifErrors) { return false; }
grunt.log.writeln('This is success message');
});
Ogni volta che un'attività fallisce, ogni attività successiva verrà terminata a meno che non sia stato specificato --force .
grunt.registerTask('foo', 'My task "foo" .', function() {
// Fail synchronously.
return false;
});
grunt.registerTask('bar', 'My task "bar" .', function() {
var done = this.async();
setTimeout(function() {
// Fail asynchronously.
done(false);
}, 1000);
});
Le attività possono dipendere da altre attività per l'esecuzione corretta. Ricorda che grunt.task.requires non eseguirà effettivamente altre attività, ma controllerà solo se è stato eseguito e non è fallito.
grunt.registerTask('foo', 'My task "foo" .', function() {
return false;
});
grunt.registerTask('bar', 'My task "bar" .', function() {
// Fail task if foo task failed or never ran.
grunt.task.requires('foo');
// This code executes if the foo task executed successfully.
grunt.log.writeln('Hello, World.. Welcome to Tutorialspoint!..');
});
// Usage:
// grunt foo bar doesn't log, because foo failed to execute.
// **Note: This is an example of space-separated sequential commands,
// (similar to executing two lines of code: `grunt foo` then `grunt bar`)
// grunt bar doesn't log, because foo never ran.
Le attività possono anche fallire ogni volta che le proprietà di configurazione richieste non vengono trovate.
grunt.registerTask('foo', 'My task "foo" .', function() {
// Fail task if meta.name config properties is missing
// Format 1: String
grunt.config.requires('meta.name');
// or Format 2: Array
grunt.config.requires(['meta', 'name']);
// Log... conditionally.
grunt.log.writeln('This only log if meta.name is defined in the config.');
});
Le attività possono accedere alle proprietà di configurazione come mostrato di seguito:
grunt.registerTask('foo', 'My task "foo" .', function() {
// Log the value of the property. Returns null if the property is undefined.
grunt.log.writeln('The meta.name property is: ' + grunt.config('meta.name'));
// Also logs the value of the property. Returns null if the property is undefined.
grunt.log.writeln('The meta.name property is: ' + grunt.config(['meta', 'name']));
});