Använda Grunt med WordPress Development

I den här handledningen kommer vi att ta en titt på hur man använder Grunt, speciellt för att hjälpa och påskynda ditt WordPress-utvecklings arbetsflöde.

Grunt är en JavaScript-uppdragsrunner installerad via NPM som körs på din server. För att använda informationen i den här handledningen behöver du kommandoradsåtkomst till en server. För korthetens skull hänvisar jag dig till den här handledningen för att få Grunt igång och redo att användas.

Grunt är en beprövad task runner, som används på många olika sätt, på många olika plattformar. Här kommer vi att se på att definiera en solid grund för att basera din WordPress-utveckling.

Vanliga uppgifter

Grunt's community är otroligt stark, vilket har lett till utvecklingen av en enorm katalog av plugins. Det är lätt att gå vilse och spendera mycket tid på att leta efter, och vetting, vilka som ska användas.

Så vad är några vanliga uppgifter som helst WordPress-tema eller plugin behöver utföra eller tillhandahålla?

  1. Lokalisera språksträngar med hjälp av WordPress-översättningsfunktionerna
  2. Förvaltning av tillgångsfiler. Det vill säga, arbetar med utveckling och minifiera versioner av både JavaScript och CSS-filer.

Lokalisering

Grunt har ett mycket framgångsrikt WordPress-specifikt lokaliseringspaket som heter grunt-wp-i18n. Detta Grunt-paket är ovärderligt eftersom det kommer att skanna din temat / plugin-mapp, hitta alla översättningssträngar och kompilera a .pott filen på den angivna platsen. Detta .pott filen kan sedan användas för att konvertera .po och .mo filer för andra användare att översätta ditt tema / plugin.

För att konfigurera paketet, lägg till följande i din Gruntfile.js initConfig alternativ:

makepot: target: options: include: ['path / to / some / file.php'], typ: 'wp-plugin' // eller 'wp-theme'

Ring sedan Grunt-uppgiften som så (medan i Gruntfile.js mapp):

grunt makepot

Hela din mapp skannas och alla strängar överensstämmer med en pottfil.

Asset Files

Alla teman och plugins använder regelbundet JavaScript och CSS-filer. Tyvärr är mycket tid då behovet av utvecklings- och produktionsversioner av filerna förbises.

Med hjälp av signaler från WordPress, syftar jag till att se till att jag har kommenterat och omarbetat fullständigt filer:

  • filename.js
  • filename.min.js
  • filename.css
  • filename.min.css

Varför? Jag gillar att veta vad som händer i dessa filer, men jag gillar också att mina besökare serveras optimerade versioner av filerna.

Att göra det utan någon form av uppgift skulle innebära att man byter tillgångsadresser som registrerats i WordPress under utveckling för att se den ändrade, oförminerade versionen, med någon form av JavaScript och CSS-kompressor innan den släpptes en uppdatering och sedan byta de registrerade webbadresserna . Och det är inte kul.

Med Grunt kan du använda Uglify-paketet för att minimera och optimera JavaScript-filer på flyg och för att ta CSS vidare kan vi använda Sass-uppgiften att kompilera Sass-filer till CSS i flygningen. För vad det är värt, använder jag Sass eftersom det är vad WordPress använder under huven, men det finns en MINDER kompilator för Grunt, liksom.

uglify: dist: options: banner: '/ *! <%= pkg.name %> <%= pkg.version %> filename.min.js <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ', rapport:' gzip ', filer: ' assets / js / filename.min.js ': [' assets / path / to / file.js ',' assets / path / file.js ',' assets / dynamic / paths / ** / * .js '], dev: alternativ: banner:' / *! <%= pkg.name %> <%= pkg.version %> filename.js <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ', försköna: true, komprimera: false, mangle: false, filer: ' assets / js / filename.js ': [' assets / path / to / file.js ',' assets / path / till / annan / file.js ',' assets / dynamic / paths / ** / * .js ']
sass: dist: options: banner: '/ *! <%= pkg.name %> <%= pkg.version %> filename.min.css <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ", stil:" komprimerad ", filer: [expand: true, cwd: 'assets / scss', src: ['* .scss'], dest:" tillgångar / css ", ext: .min.css '], dev: alternativ: banner:' / *! <%= pkg.name %> <%= pkg.version %> filename.css <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ', stil:' expanded ', filer: [expand: true, cwd:' assets / scss ', src: [' * .scss '], dest: "tillgångar / css", ext: .css ']

Tips: Om du använder sass-uppgiften lägg till .sass-cache till din .gitignore för att förhindra att kompilatorns cache läggs till i ditt arkiv.

Avancerade uppgifter

Vi har täckt två nyckelområden Grunt kan hjälpa till i WordPress-utveckling, men låt oss ta det ett steg längre och hitta ytterligare kraft i att använda en arbetslöpare.

Titta på filer

Vi tillhandahåller redan uppgifter för att arbeta på filer så varför inte optimera det? Med uppgiften ovan måste vi springa grunt *** varje gång vi gjorde en förändring, varför installera inte Grunt-Contrib-Watch-paketet? När du har konfigurerat, kommer detta att instruera Grunt att köra dessa uppgifter varje gång en filändring detekteras.

grunt klocka

Presto! Det går inte att springa Grunt på varje filändring, bara starta klockan och redigera dina filer.

JavaScript Kvalitet

Skulle det inte vara trevligt att springa JSHint på våra JavaScript-filer för att spåra dessa buggar eller sakna semikolon? Installera bara grunt-contrib-jshint-uppgiften och den till tittarens uppgift innan filer sammanställs. Nu kommer Grunt att varna dig för eventuella fel och sluta köra vidare uppgifter.

jshint: files: ['assets / js / filename.js', 'assets / dynamic / paths / ** / *. js'], alternativ: expr: true, globals: jQuery: true, console: true, modul: true, document: true

Kombinera tillgångar

Detta har varit särskilt användbart för mig när man utvecklar den flytande ramen. Den flytande ramen är en uppsättning klasser som bland annat skapar alternativsidor och metakasser.

För att underlätta utveckling av enkla fält har jag en filstruktur som denna:

tillgångar / ├── js / | ├── filename.js ├── fält / ├── text / | ├── js / | ├── text.js ├── select / ├── js / ├── select.js

Det gör det väldigt enkelt att hitta fältet jag jobbar med och ändra bara JavaScript som behövs för det fältet.

Från användarens synvinkel vill jag bara tjäna en enda JavaScript-fil med alla gemensamma och fältbaserade JavaScript i kombination. Låt oss använda grunt-contrib-uglify uppgiften att uppnå detta.

uglify: dist: options: banner: '/ *! <%= pkg.name %> <%= pkg.version %> filename.min.js <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ', rapport:' gzip ', filer: ' assets / js / filename.min.js ': [' assets / path / to / file.js ',' assets / path / file.js ',' assets / dynamic / paths / ** / * .js '], dev: alternativ: banner:' / *! <%= pkg.name %> <%= pkg.version %> filename.js <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ', försköna: true, komprimera: false, mangle: false, filer: ' assets / js / filename.js ': [' assets / path / to / file.js ',' assets / path / till / annan / file.js ',' assets / dynamic / paths / ** / * .js ']

Med denna konfiguration kommer den att kombinera alla JavaScript-filer till en utvecklingsfil och produktionsfil efter det att den passerat JSHint.

Kopiera filer

WordPress.org kräver en Readme.txt fil som specificerar temat / plugin-informationen, men versionskontrollsystem som GitHub och BitBucket föredrar Readme.md filer. Vi behöver inte manuellt duplicera eller behålla dessa filer i synkronisering. Låt oss bara låta Grunt göra det för oss!

Installera grunt-contrib-copy-uppgiften och konfigurera den så här:

kopiera: dist: src: 'readme.txt', dest: 'README.md'

Hämta data

En annan användbar Grunt-uppgift är Grunt cURL-paketet. Ett av de flytande ramfälten behövde åtkomst till Google Fonts API-data. Att ladda detta som Google reccomends skulle vara en HTTP-begäran varje gång sidan laddas. Alternativt, om du manuellt kopierar innehållet i filen ner, riskerar du att bli föråldrad. Det bästa av båda världarna är att använda Grunt Curl för att spara oss en förfrågan och få uppdateringar.

För att hålla sig uppdaterad laddades vi enkelt upp cURL-uppgiften, gav den webbadressen för att hämta typsnittsdata från och var att spara svaret.

curl: 'google-teckensnitt-källa': src: 'https://www.googleapis.com/webfonts/v1/webfonts?key=*******', dest: 'tillgångar / säljare / google -fonter-source.json '

Nu, varje gång vi kör uppgiften, hämtas den senaste teckensnittslistan och sparas i ramfilen.

Dokumentation

Denna uppgift används bäst på teman, plugins och ramar där många utvecklingsögon kommer att bli nyfikna. Och kontext är aldrig en dålig sak för de som kramar runt kodbasen.

PHP Documentor är ett utmärkt verktyg för automatisk generering av data. Det hjälper dig också att fokusera på att ge meningsfulla DocBlocks i din kod.

phpdocumentor: dist: options: ignore: 'node_modules'

Tips: Lägg till docs till din .gitignore om du inte vill begå dokumentationen och alla dess cachefiler.

Få alltid att falla på plats

Här är package.json och den Gruntfile.js för de uppgifter som beskrivs ovan.

package.json

"namn": "paketnamn", "version": "1.0.0", "beskrivning": "...", "huvud": "filnamn.php", "skript": "test" \ "Fel: inget test specificerat \" && avsluta 1 "," förvar ": " typ ":" git "," url ":" http://repo-url.com "," nyckelord ": [ "wordpress"], "author": "Ditt namn", "licens": "GPL", "devDependencies": "grunt": "~ 0.4.2", "grunt-contrib-copy": "~ 0,5. 0 "," grunt-contrib-jshint ":" ~ 0.8.0 "," grunt-contrib-sass ":" ^ 0.7.3 "," grunt-contrib-uglify ":" ~ 0.3.3 " -curl ":" * "," grunt-phpdocumentor ":" ~ 0.4.1 "," grunt-wp-i18n ":" ~ 0.4.0 "

Gruntfile.js

module.exports = funktion (grunt) grunt.initConfig (pkg: grunt.file.readJSON ('package.json'), kopia: dist: src: 'readme.txt', dest: 'README.md' , curl: 'google-teckensnitt-källa': src: 'https://www.googleapis.com/webfonts/v1/webfonts?key=*******', dest: "tillgångar / leverantör / google-teckensnitt-source.json ', makepot: target: options: include: [' path / to / some / file.php '], typ:' wp-plugin '// eller' wp -theme ', jshint: files: [' assets / js / filename.js ',' assets / dynamic / paths / ** / * .js '], alternativ: expr: true, globals: jQuery : sant, konsol: sant, modul: sant, dokument: true, phpdocumentor: dist: alternativ: ignorera: 'node_modules', sass: dist: options: banner: '/ *! <%= pkg.name %> <%= pkg.version %> filename.min.css <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ", stil:" komprimerad ", filer: [expand: true, cwd: 'assets / scss', src: ['* .scss'], dest:" tillgångar / css ", ext: .min.css '], dev: alternativ: banner:' / *! <%= pkg.name %> <%= pkg.version %> filename.css <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ', stil:' expanded ', filer: [expand: true, cwd:' assets / scss ', src: [' * .scss '], dest: "tillgångar / css", ext: .css '], uglify: dist: options: banner:' / *! <%= pkg.name %> <%= pkg.version %> filename.min.js <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ', rapport:' gzip ', filer: ' assets / js / filename.min.js ': [' assets / path / to / file.js ',' assets / path / file.js ',' assets / dynamic / paths / ** / * .js '], dev: alternativ: banner:' / *! <%= pkg.name %> <%= pkg.version %> filename.js <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %> * / \ n ', försköna: true, komprimera: false, mangle: false, filer: ' assets / js / filename.js ': [' assets / path / to / file.js ',' assets / path / till / annan / file.js ',' assets / dynamic / paths / ** / * .js '])); grunt.loadNpmTasks ( 'grunt-contrib-copy'); grunt.loadNpmTasks ( 'grunt-contrib-jshint'); grunt.loadNpmTasks ( 'grunt-contrib-sass'); grunt.loadNpmTasks ( 'grunt-contrib-uglify'); grunt.loadNpmTasks ( 'grunt-curl'); grunt.loadNpmTasks ( 'grunt-phpdocumentor'); grunt.loadNpmTasks ( 'grunt-wp-i18n'); grunt.registerTask ('default', ['jshint', 'uglify: dev', 'uglify: dist', 'sass: dev', 'sass: dist', 'makepot', 'copy']); grunt.registerTask ('docs', ['phpdocumentor: dist']); grunt.registerTask ('googlefonts', ['curl: google-fonts-source']); ;

Tips: Lägg till node_modules och NPM-debug.log till din .gitignore för att förhindra att uppgifterna som tillhörande filer läggs till i ditt förråd.

Slutsats

Som du kan se från ovanstående uppgifter kan Grunt användas för att automatisera WordPress-utveckling och ge dig mer tid att fokusera på att skriva kod, inte hantera det.

Vi har detaljerade några få uppgifter för WordPress, men det finns många andra paket där ute för projektspecifika behov, som bildoptimeringsuppgifter och mycket, mycket mer, så gå och utforska!

Grunt är nu en väletablerad arbetslöpare, och dokumentationen är i nivå med WordPress själv, varför inte överväga att göra en uppgift som inte redan är tänkt på och dela den med samhället?

Medel

  • Grymta
  • Node.js
  • Grunt Komma igång

Grunt-uppgifter används

  • Grunt JSHint
  • Grunt Uglify
  • Grunt Sass
  • Grunt WPi18n
  • Grunt Watch
  • Grunt Copy
  • Grunt PHPDocumentor
  • Grunt Curl