Kommandolinjen for webdesign Automatisering med Grunt

Så langt har du lært hvordan du gjør ting som å kompilere kode, autoprefixing, rengjøring, komprimering og reduksjon av alt bare ved å skrive noen ord. Dette er flott, men hva om du har et prosjekt som vil kreve at du kjører flere av disse kommandoene, den ene etter den andre, igjen og igjen til du fullfører arbeidet ditt? For eksempel:

  1. Samle preprosessor til CSS
  2. Autoprefix CSS
  3. Rengjør CSS
  4. Kompil Jade til HTML
  5. Sammenkoble og begrense JavaScript

Selv med bare noen få ord per kommando vil det raskt bli kjedelig i løpet av en typisk sideopprettingsprosess.

Dette er hvor "Oppgaveløpere" kommer inn for å lagre dagen. Med oppgaveløpere kan du sette opp en enkelt fil i prosjektet ditt som definerer alle oppgavene du trenger for å kjøre på prosjektet, og rekkefølgen de trenger for å kjøre inn. I denne filen kan du deretter definere egendefinerte kommandoer du kan bruke til å utføre alle de oppgaver en gang.

Du lærer hvordan du konfigurerer løpere på denne måten gjennom denne opplæringen, og i prosessen ser du også et eksempel på å få inn skript fra Bower-pakker for effektiv distribusjon i prosjektene dine..

Merk: Denne opplæringen forutsetter at du har fullført alle tidligere opplæringsprogrammer i denne serien. Hvis du ikke har gjort det, vil du finne det nyttig å gå gjennom dem før du starter her.

"Big Two" Task Runners

Det er faktisk flere oppdragsløpere som er tilgjengelige akkurat nå, men i denne veiledningen vil vi fokusere på de to som for tiden er mest populære: Grunt and Gulp.

Det er flere tekniske forskjeller mellom de to prosjektene, som jeg ikke vil gå inn i nå. Jeg vil heller ikke fortelle deg hvilken av de to du burde bruke. I stedet anbefaler jeg å følge trinnene for å bruke begge under, og deretter bestemme selv hvilken du foretrekker.

Lag et eksempel prosjekt

Vi skal skape et prosjekt som ser på og automatisk samler Stylus og Jade, og optimaliserer CSS og JavaScript. Vi oppnår dette først ved å bruke Grunt, og deretter (i neste opplæring) ved hjelp av Gulp.

Til å begynne med må vi sette opp et eksempelprosjekt med noen filer inni det som vår oppgaveløper kan operere på. Opprett en mappe med navnet "Grunt Project", legg deretter til en undermappe med navnet "build" og en undermappe kalt "kilde".

I «kilde» -mappen legger du til to nye undermapper med navnet "stylus", "jade". Legg til noen eksempelfiler av den aktuelle typen til hver mappe.

Filene kan inneholde hvilken som helst kode du vil ha, bare slik at du har noe du kan se kompileringsprosessen jobber med. 

Tips: Hvis du ikke er sikker på hvilken kode du vil legge til, kan du prøve å ta noen prøvekode fra Codepen: pennene merket penn, pennor merket jade.

For eksempel:

Vi skal da også dra nytte av det vi lærte om Bower i en tidligere leksjon, og ta tak i nedlastinger av jQuery og Modernizr, som vi vil kombinere og redusere senere.

Kjør kommandoene:

bower install jquery - save
bower install modernizr - save

Gjør nå en duplikat av hele prosjektmappen din og gi den navnet "Gulp Project".

På denne måten kan du følge trinnene med å bruke Grunt i mappen "Grunt Project", og trinnene for bruk av Gulp i mappen "Gulp Project".

Komme i gang med Grunt

Installer Grunt CLI

For at Grunt-kommandoer skal virke, må du installere CLI (kommandolinjegrensesnitt). Installer den globalt med:

[sudo] npm installere -g grunt-cli

Oppsett Prosjekt for Grunt

Legg til package.json-filen

Hvert prosjekt som bruker Grunt, trenger en "package.json" -fil i rotmappen.

Vi dekket å sette opp en "package.json" -fil ved å bruke kommandoen npm init i den forrige Taming 3parts pakken opplæringen. Hvis du ikke har fullført den delen, vennligst gå tilbake og følg den nå.

Installer Grunt-pakken

Installer Grunt inn i prosjektet ditt og lagre det som en utviklingsavhengighet med:

npm installere grunt - save-dev

Legg til Gruntfile

Hvert Grunt-prosjekt må også ha det som kalles a Gruntfile i rotmappen.

En Gruntfile er en fil med navnet "Gruntfile.js", eller "Gruntfile.coffee" hvis du foretrekker å skrive i CoffeeScript. I vårt tilfelle jobber vi med JavaScript, så legg til en fil med navnet "Gruntfile.js" til rotmappen din.

Når du fyller inn Gruntfile, kan du bestemme hvilke kommandoer som vil utløse hvilke oppgaver som skal kjøres. Du kan starte med å bare legge til et grunnleggende skall i Gruntfile. Vi konfigurerer den faktiske konfigurasjonskoden din senere.

Legg til følgende kode i Gruntfile.js:

module.exports = funksjon (grunt) ;

Installer Grunt Plugins

Du vil huske at når du ønsket å bruke pakker med npm eller Bower, måtte du søke på riktig sted for å få versjoner designet for å fungere med hvert system.

Det samme gjelder når du bruker pakker med Grunt. Gjennom Grunt kan du få tilgang til et økosystem med plugins, som egentlig er wrappers rundt vanilje npm-pakker. Disse pluginene leveres fortsatt via npm, men de er spesielt rustet til å jobbe med Grunt

For eksempel, i stedet for npm-pakken UglifyJS, med Grunt kan du bruke plugin "grunt-contrib-uglify".

Du kan søke etter Grunt-plugins på http://gruntjs.com/plugins

For vårt prosjekt vil vi installere disse seks Grunt-pluginene:

  • https://www.npmjs.com/package/grunt-contrib-stylus
  • https://www.npmjs.com/package/grunt-autoprefixer
  • https://www.npmjs.com/package/grunt-contrib-cssmin
  • https://www.npmjs.com/package/grunt-contrib-jade
  • https://www.npmjs.com/package/grunt-contrib-uglify
  • https://www.npmjs.com/package/grunt-contrib-watch

Hver enkelt vil bli installert i prosjektmappens "node_modules" undermappe, og lagret som en utviklingsavhengighet.

Kjør hver av disse kommandoene, en om gangen, med din terminal peket på mappen "Grunt Project":

npm installere grunt-contrib-stylus - save-dev
npm installere grunt-autoprefixer - save-dev
npm installere grunt-contrib-cssmin - save-dev
npm installere grunt-contrib-jade - save-dev
npm installere grunt-contrib-uglify - save-dev
npm installere grunt-contrib-watch - save-dev

Når du er ferdig, bør du se disse mappene i prosjektets "node_modules" -mappe:

Aktiver plugger via Gruntfile

Nå skal vi bruke grunt.loadNpmTasks metode for å aktivere våre plugins.

I de krøllete parentesene på din eksisterende Gruntfile legger vi til seks linjer, en for å aktivere hvert grunt-plugin, slik som:

module.exports = funksjon (grunt) // Last grunt plugins. grunt.loadNpmTasks ( 'grov-contrib-stylus'); grunt.loadNpmTasks ( 'grov-autoprefixer'); grunt.loadNpmTasks ( 'grov-contrib-cssmin'); grunt.loadNpmTasks ( 'grov-contrib-jade'); grunt.loadNpmTasks ( 'grov-contrib-uglify'); grunt.loadNpmTasks ( 'grynt-contrib-watch'); ;

Denne koden registrerer navnet på hvert plugin som en grunt-kommando, slik at vi kan bruke den kommandoen for å få pluginet til å løse en oppgave. For eksempel vil vi bruke kommandoen grunt stylus å kjøre en stylus oppgave,grunt autoprefixer å kjøre en autoprefixer oppgave og så videre.

Konfigurer oppgaver i Gruntfile

Våre grunt plugins er installert og kommandoene som skal brukes er operative, men hvis du brukte dem akkurat nå, ville du ikke se noe skje. Årsaken er at vi må sette opp en konfigurasjon for å avgjøre hva hver oppgave egentlig skal gjøre.

Dette gjøres ved å legge til grunt.initConfig metode til Gruntfile, og deretter overføre informasjon gjennom det som dikterer hvordan du vil at hver oppgave skal kjøres.

Først legger vi til grunt.initConfig metode over linjene du nettopp lagt til for å laste grunt plugins:

grunt.initConfig ();

Nå skal vi gi oss plass til å sende vår konfigurasjonsinformasjon gjennom. Legg til åpning og lukking i hakkene innenfor de vanlige parentesene, og legg deretter til en tom linje mellom dem:

grunt.initConfig ();

Nå kan vi gå videre og legge til konfigurasjonen for hvert av programtilleggene vi installerte.

Hver plugin har sitt eget utvalg av innstillinger du kan bruke, og disse alternativene er detaljert på sidene som er koblet til i "Install Grunt Plugins" -delen ovenfor.

Du kan også lese full detaljer om konfigurering av Grunt-oppgaver her: http://gruntjs.com/configuring-tasks

Grunt Oppgave Konfigurasjon Eksempel: Stylus

Vi skal begynne med å legge til konfigurasjon for vår pekepenn oppgave.

I mellom de krøllete parentesene du nettopp har lagt til, legger du til følgende kode på den tomme linjen:

 stylus: compile: options: komprim: false, paths: ['kilde / stylus'], filer: 'build / style.css': 'source / stylus / main.styl',

Din Gruntfile skal nå se slik ut:

Moduler: compunt: false, paths: ['source / stylus'], filer: 'build / style.css': ' kilde / stylus / main.styl ',); // Last grunt plugins. grunt.loadNpmTasks ( 'grov-contrib-stylus'); grunt.loadNpmTasks ( 'grov-autoprefixer'); grunt.loadNpmTasks ( 'grov-contrib-cssmin'); grunt.loadNpmTasks ( 'grov-contrib-jade'); grunt.loadNpmTasks ( 'grov-contrib-uglify'); grunt.loadNpmTasks ( 'grynt-contrib-watch'); ;

La oss gå gjennom en sammenbrudd av koden vi har lagt til her. Vi vil ikke bryte ned hver eneste oppgave, men å se på denne skal gi deg en ide om hvilken type syntaks som brukes når du setter sammen Grunt-oppgavekonfigurasjonen.

Som nevnt ovenfor har hver plugin forskjellige konfigurasjonsalternativer, så når du bruker en ny plugin, ta en god titt på bruksinstruksjonene den tilbyr.

Det første vi har gjort er å legge til en oppføring i vår config for vår pekepenn Oppgave med koden:

 stylus: ,

Innsiden som vi har lagt til en kompilere oppføring for å kontrollere hva som skjer under kompilering:

 stylus: compile: ,

Inne i kompilere Oppgave vi har opprettet en opsjoner område.

Vi har brukt det området til å angi komprimere alternativ til falsk, fordi vi skal gjøre vår kodeoptimalisering senere.

Vi har også satt baner alternativ til [ 'Kilde / stylus'] så hvis Stylus ser @importere Direktivet under samlingen vil se etter filer som skal importeres i prosjektets kilde / stylus-mappe:

 stylus: compile: options: compress: false, paths: ['kilde / stylus'],

Så etter opsjoner område vi har lagt til en filer område for å kontrollere utdatakatalog og filnavn, samt inngangskatalog og filnavn.

Vi har satt utgangsstedet til vår kompilerte CSS-fil for å være 'Build / style.css', mens Stylus-filen som skal behandles, er 'Kilde / pekepenn / main.styl'.

 stylus: compile: options: komprim: false, paths: ['kilde / stylus'], filer: 'build / style.css': 'source / stylus / main.styl',

Nå, med din terminal peket på hovedrotmappen din, kjør kommandoen:

grunt stylus

Se i "bygg" -mappen din, og du bør se en nyopprettet "style.css" -fil.

Konfigurer de gjenværende oppgavene

Vi beveger oss nå ganske raskt gjennom konfigurasjonen av hver gjenværende oppgave. Sett inn hver blokk av config-kode umiddelbart etter den du tidligere har lagt til.

Autoprefixer

Legg til denne koden:

 autoprefixer: compile: files: 'build / style.css': 'build / style.css',,,

Kjør autoprefixer oppgaven med:

grunt autoprefixer

Hvis du inspiserer filen "build / style.css", bør du nå se prefikser lagt til når det er nødvendig.

cssmin

Legg til denne koden:

 cssmin: ren: files: 'build / style.css': 'build / style.css',

Kjør oppgaven med cssmin med:

grunt cssmin

Hvis du ser på "build / style.css" igjen nå, vil du se at det har blitt pent rengjort og komprimert for deg.

jade

Legg til denne koden:

 jade: compile: files: [expand: true, cwd: "kilde / jade", src: "* .jade", dest: "build", ext: ".html"],

Kjør jadeoppgaven med:

grunt jade

Hvis du ser inn i mappen "build", bør du nå se en HTML-fil som samsvarer med hver Jade-fil du hadde i mappen "source / jade".

Uglify

Legg til denne koden:

 uglify: bower_js_files: files: 'build / output.min.js': ['bower_components / jquery / dist / jquery.js', 'bower_components / modernizr / modernizr.js'],

I dette eksemplet ser vi at vi refererer til plasseringene til Bower-komponentene vi installerte tidligere.

Vi tar de fulle utvidede versjonene av både jQuery og Modernizr ut av vår "bower_components" -mappe, og sammenkompilerer dem og minifiserer dem til en ny fil med navnet "output.min.js". Dette er en fin måte å distribuere skript du administrerer med Bower.

Kjør uglify oppgaven med:

grunt uglify

Du bør nå se en ny "output.min.js" -fil i mappen "build".

Legg til en "watch" -oppgave

Så langt kan det virke som om vi bare har erstattet en kommando for å gjøre en bestemt oppgave med en annen kommando, men det vi faktisk har gjort ligger i grunnlaget for hvor Grunt virkelig begynner å skinne.

Nøkkelen er Grunts evne til å ha en oppgave å kjøre en annen oppgave. Så nå skal vi sette opp en se oppgave som vil overvåke visse filer for endringer, så kjør vår pekepenn og jade oppgaver automatisk for oss.

Legg til denne koden:

 se: stylus: files: ['source / stylus / *. styl'], oppgaver: ['stylus', 'autoprefixer', 'cssmin'], jade: files: ['source / jade / *. jade '], oppgaver: [' jade '],

Vi har først lagt til vår se oppgave, og så inne at vi har oppsett et område for pekepenn og for jade.

De filer alternativ i hvert sett hvilke filer som skal overvåkes for endringer. De oppgaver alternativsett hvilke oppgaver skal da utføres når endringer skjer, og i hvilken rekkefølge.

Til pekepenn, Vi har satt klokkeoppgaven til å overvåke alle ". stil" -filer i mappen "kilde / stylus", og når den ser endringer, vil den kjøre pekepenn, autoprefixer og cssmin oppgaver i den rekkefølge.

Så nå når klokkeoppgaven kjører, er alt du trenger å gjøre, lagre noen av dine Stylus-filer, og du får automatisk en kompilert, autoprefixed og optimalisert CSS-fil skrevet inn i "build" -mappen for deg.

Likeledes for jade, Vi har satt alle ". jade" -filer i "kilde / jade" -mappen som skal overvåkes, og når en er lagret jade oppgaven vil automatisk kjøre og kompilere den tilsvarende HTML-filen i "build" .

Kjør klokkeoppgaven med:

grunt ur

Stopp det igjen med enten:

  • Lukker terminalen
  • Pressing CTRL + C

Legg til "standard" oppgave

På dette punktet lurer du kanskje på hva med JavaScript-ugliseringsoppgaven?

Grunnen til at vi ikke inkluderte den med se oppgaven er at du ikke skal gjøre endringer i jQuery- og Modernizr-filene som uglify-oppgaven behandler. Så fordi se oppgaven reagerer bare på endringer som det aldri ville bli utløst for å behandle JavaScript.

I stedet skal vi gjøre bruk av misligholde Oppgave som kan settes inn i Gruntfile. Dette er oppgaven som vil bli kjørt hvis du bruker kommandoen grynte av seg selv med ingenting vedlagt.

Etter det siste grunt.loadNpmTasks linje, men før avslutningen ; av filen, legg til denne linjen:

 grunt.registerTask ('standard', ['stylus', 'autoprefixer', 'cssmin', 'jade', 'uglify']);

Dette setter misligholde Oppgave å løpe pekepenn, autoprefixer, cssmin, jade og så uglify.

Så nå hvis du kjører kommandoen grynte uten noe etter det, vil det bygge hele prosjektet ditt, inkludert JavaScript.

I neste veiledning

Når vi kommer opp neste, gjentar vi prosessen vi nettopp har lært, men ved å bruke Gulp til å håndtere vår oppgave i stedet for Grunt.