Faceți cunoștință cu Grunt Instrumentul de construire pentru JavaScript

Dacă lucrați la un proiect mare, veți avea, fără îndoială, un script de construire sau o grămadă de scripturi de sarcină pentru a vă ajuta cu unele părți repetate ale procesului. Este posibil să utilizați Ant sau Rake, în funcție de limba în care este scris proiectul.

Dar ce folosiți dacă proiectul este în primul rând JavaScript? Aceasta este problema pe care Ben Alman a pornit-o să o rezolve când a creat Grunt.


Ce este Grunt, oricum?

Ce este Grunt? Ei bine, spune README despre Github

Grunt este un instrument de construire a liniei de comandă bazate pe sarcini pentru proiectele JavaScript.

Iată ideea: atunci când lucrați la un proiect JavaScript, există o grămadă de lucruri pe care veți dori să le faceți în mod regulat. Ca de ce, întrebi? Ei bine, cum ar fi concatenarea fișierelor date, executarea JSHint pe codul dvs., rularea testelor sau minificarea scripturilor. Dacă vă inserați JavaScript în JSHint online, probabil că realizați că există o modalitate mai bună de a face acest lucru; chiar dacă utilizați pisică pentru a concatena fișiere sau un minifier de linie de comandă, ar fi bine să aveți un singur set unic de comenzi pentru toate acele sarcini suplimentare, care au funcționat pentru fiecare proiect JavaScript, corect?

Asta vrea Grunt să fie. Are o grămadă de sarcini încorporate, care vă vor aduce destul de departe, cu capacitatea de a vă crea propriile pluginuri și scripturi care extind funcționalitatea de bază.

Pentru mai multă bunătate a lui Grunt, vezi postarea lui Ben pe blogul său personal și pe blogul Bocoup.


Cum instalez Grunt?

Grunt este construit pe Node.js și este disponibil ca pachet prin managerul de pachete Node (npm). Veți dori să o instalați la nivel global, deci utilizați această comandă:

npm install -g grunt

Veți observa că instalează câteva dependențe; există alte pachete npm pe care Grunt le folosește. Odată ce ați terminat, sunteți gata să plecați!


Cum folosesc Grunt?

După cum știți, Grunt este un instrument de linie de comandă; așadar, presupun că aveți o fereastră terminală deschisă pentru restul tutorialului.

Să începem prin crearea unui director de proiect; nu vom construi un proiect aici, dar vom vedea cum lucrează Grunt în acest director. Odată ce vă aflați în acel director, rulați mormăit (în conformitate cu documentația, dacă sunteți pe Windows, este posibil să fie necesar să rulați grunt.cmd). Probabil veți vedea ceva de genul:

 Imposibil de găsit fișierul de configurare "grunt.js". Aveți nevoie de ajutor? 

Înainte de a putea profita cu adevărat de Grunt la potențialul său maxim, veți avea nevoie de a grunt.js fișier în directorul de proiect. Din fericire, Grunt poate genera automat o grunt.js fișier și alte materiale schelet de proiect - cu init sarcină, care poate funcționa fără a grunt.js fișier în loc. Dar grunt init încă nu este suficient pentru a începe proiectul, așa cum veți vedea dacă îl executați. Trebuie să alegeți un tip de proiect de generat. Alergare grunt init vă va oferi o listă de tipuri de proiecte pentru a alege:

  • jquery: Un plugin jQuery
  • nodul: Un modul Nod
  • commonjs: Un modul CommonJS
  • gruntplugin: Un plugin Grunt
  • gruntfile: Un Gruntfile (grunt.js)

Dacă proiectul dvs. nu se potrivește cu nici unul dintre primele patru tipuri de proiecte, puteți folosi unul final: gruntfile: creează doar o bază grunt.js pe care le puteți completa. Deci, haideți să încercăm, cu șablonul de plugin jQuery. Alerga grunt init: jquery în terminalul tău.

Veți observa o mulțime de ieșiri inițiale. Dacă vă faceți timp să citiți notele șablonului, veți vedea că va trebui să completați câteva valori, cum ar fi numele proiectului și titlul proiectului. De fapt, după acea notă, veți vedea ceva de genul:

Răspundeți la următoarele: [?] Numele proiectului (jquery.demo)

Ori de câte ori inițializați un proiect, Grunt vă va întreba o serie de întrebări, astfel încât să puteți completa câteva opțiuni. Această valoare în paranteze? Aceasta este sugestia implicită, bazată pe tipul de proiect și pe numele directorului de proiect. Dacă doriți să o modificați, scrieți propriul nume de proiect la sfârșitul liniei și apăsați "enter"; în caz contrar, apăsați "enter" pentru a utiliza numele implicit.

Continuați și completați restul câmpurilor. Pentru un proiect de plugin jQuery, iată ce altceva veți avea nevoie să îl dați:

  • Titlul proiectului
  • Descriere
  • Versiune
  • Git repository de proiect
  • Pagina de start a proiectului
  • Probleme legate de proiect
  • Licențe
  • Numele autorului
  • E-mail autor
  • Autor URL
  • Versiunea necesară jQuery

Multe dintre acestea au valori implicite; dacă doriți să utilizați valoarea implicită, apăsați butonul Enter pentru acea linie; pentru a lăsa câmpul gol, puteți să tastați "none". Odată ce ați trecut prin toate opțiunile, veți vedea că Grunt creează câteva fișiere de proiect de bază. Precum ce? Asa:

LICENȚĂ-GPL LICENȚĂ-MIT README.md grunt.js libs | - jquery | | - jquery.js | - qunit | - qunit.css | - qunit.js package.json src | - jquery.demo.js test | - jquery.demo.html | - jquery.demo_test. js

După cum puteți vedea, acest lucru ne oferă un început bun: nu numai că avem fișierul plugin (src / jquery.demo.js), avem, de asemenea, teste Qunit (testare / jquery.demo_test.js). Iar acestea nu sunt dosare goale. Au un conținut inițial, cu un plug-in jQuery atât de super-bază și teste unitare. Continuați și verificați conținutul acestor fișiere, veți vedea ce vreau să spun.

Grunt face mai mult decât să înființeze proiectul pentru tine.

Bineînțeles, Grunt face mai mult decât să înființeze proiectul pentru tine. În special, proiectul nostru are acum grunt.js: un fișier de configurare specific proiectului; din cauza opțiunilor pe care le stabilește, acum putem folosi celelalte sarcini încorporate ale lui Grunt. În curând o vom deschide și vom face unele ajustări, dar pentru moment să facem niște sarcini.

Dacă alergi mormăit fără opțiuni acum, vom executa sarcina implicită, dacă a fost setată. În cazul unui proiect plugin jQuery, este echivalent cu executarea acestor patru comenzi:

  • mănâncă grunt: verifică JavaScript împotriva lui JSHint
  • grunt qunit: execută testele Qunit
  • grunt concat: concatenate fișierele de proiect împreună și pune noul fișier într-un dist pliant
  • grunt min: micifiază fișierul concat scoate.

Ar trebui să notez ceva despre testele Qunit aici: Testele Qunit sunt menite să ruleze în browser în mod implicit; doar deschis Teste / jquery.demo.html (sau echivalentul dvs.) în browser. Însă grunt qunit testul dorește să le execute pe terminal, ceea ce înseamnă că trebuie să aveți instalat PhantomJS. Nu este dificil: trebuie doar să mergeți la phantomjs.org și să descărcați și să instalați ultima versiune. Dacă Grunt poate găsi asta în calea ta, va putea să ruleze testele Qunit de la terminal.

Deci, alergând mormăit ar trebui să vă dau rezultate similare cu acestea:

După cum puteți vedea, fiecare dintre cele patru sarcini ale noastre a trecut. Dacă oricare dintre ele ar eșua, restul sarcinilor ar fi anulat (dacă nu îl sunați pe Grunt cu --forta steag).


Cum îmi personalizez sarcinile?

Deja, am obținut o mulțime de funcționalități extraordinare din Grunt, folosind-o exact așa cum vine. Cu toate acestea, hai să deschidem asta grunt.js fișier și faceți unele configurări.

Interior grunt.js, veți vedea că toate configurarea se face prin trecerea unui obiect literal grunt.initConfig (). Să ne uităm la câteva proprietăți ale obiectului config.

PKG

Această proprietate indică package.json fișier pe care Grunt la creat în directorul nostru de proiect. Având un package.json fișierul face parte din spec. CommonJs Packages; este un singur loc în care pot fi stocate majoritatea metadatelor despre proiect (nume, versiune, pagina de pornire, linkul repository ... multe dintre valorile pe care le-ați setat la inițierea proiectului). Totuși, asta PKG proprietatea nu indică mai mult decât fișierul pachet: notați sintaxa: ''. Aceasta este una dintre directivele încorporate ale lui Grunt: de fapt, încarcă fișierul JSON, astfel încât Grunt (sau tu) să poată accesa toate proprietățile din fișierul package.json de la PKG proprietate.

meta

meta proprietatea este un obiect cu o singură proprietate: un banner. Acest banner este un comentariu care se află în partea de sus a fișierelor de proiect concatenate sau minificate. După cum puteți vedea, este un șir cu unele etichete șablon (<%= %>); în majoritatea cazurilor, etichetele înconjoară un apel către o proprietate pe PKG proprietate, cum ar fi pkg.title. Cu toate acestea, puteți executa și funcții din interiorul acelor tag-uri: utilizarea grunt.template.today () și _.pluck () ne arată asta.

concat / min / qunit / puf / ceas

Am grupat următoarele cinci proprietăți împreună pentru că sunt foarte asemănătoare. Toate acestea au setat opțiuni pentru sarcini specifice, sarcinile pe care le poartă numele. Când configurați aceste sarcini, este important să rețineți că Grunt a distins între două tipuri de sarcini: sarcini regulate și mai multe sarcini. Practic, diferența este că sarcinile obișnuite au doar un singur set de opțiuni de configurare, în timp ce multitasking-urile pot avea mai multe seturi de instrucțiuni (numite obiective). Dintre cele cinci sarcini pe care le-am enumerat în antetul acestei secțiuni, singura care nu este o multitasc este ceas.

Observați că în obiectul nostru config, qunit și puf proprietățile sunt ambele obiecte cu fișiere proprietate. fișiere este o singură țintă pentru această sarcină. În ambele cazuri, acestea reprezintă o serie de fișiere care vor fi utilizate la executarea acestei sarcini. Să presupunem că vreau să pot linge doar fișierele din src sub-director. Aș putea adăuga o altă țintă, astfel încât puf proprietate ar arata astfel:

scuipă: fișiere: ['grunt.js', 'src / ** / *. js', 'test / ** / *. js'], src: ['src / ** / *.,

Acum, să nu lăsați numai fișierele în src, alerg rochia de scame: src: Trec numele de destinație după un colon. Dacă alerg numai mănâncă grunt, ambele obiective vor fi executate.

În cazul concat și min sarcini, obiectivele sunt mai complicate: ele sunt obiecte cu sursă (src) și destinație (dest) proprietăți. Bineînțeles, acest lucru îi spune lui Grunt unde să obțină fișierele și unde să le pună atunci când se termină prelucrarea lor, respectiv. Dacă adăugați alte fișiere în proiectul dvs., veți dori să le adăugați în locul potrivit pentru a vă asigura că sunt concatenate și minificate corect. Deci, dacă am adăugat o src / utils.js fișier pe care pluginul meu de jQuery depindea, aș schimba concat.dist.src la acest:

src: ['',' src / utils.js ','.js> '],

Privind mai îndeaproape unele dintre aceste sarcini, veți observa câteva alte directive: cea mai importantă este probabil cea directivă. Aceasta vă permite să accesați proprietățile altor sarcini pentru reutilizare. Veți observa că configurația pentru ceas utilizări de sarcină , astfel încât să opereze pe aceeași listă de fișiere pe care le-am dat puf sarcină. Puteți afla mai multe despre celelalte directive din docul Grunt.

Vorbind despre sarcina de ceas, ce anume face? Foarte simplu: execută sarcinile din sarcini atunci când se modifică un fișier din acea listă de fișiere. În mod implicit, funcția puf și qunit sarcinile sunt executate.

jshint

Această proprietate configurează pur și simplu ce "piese rele" JSHint caută în JavaScript. Lista completă a opțiunilor poate fi găsită pe paginile de opțiuni ale site-ului JSHint.


În fundul nostru grunt.js fișier, veți vedea această linie:

grunt.registerTask ("implicit", "lint qunit concat min");

Aceasta este ceea ce creează sarcina noastră implicită; știi, cel care rulează atunci când alergăm doar mormăit. De fapt, creați o sarcină de alias și puteți crea cât mai multe sarcini de alias pe care le doriți:

grunt.registerTask ('src', 'lint: src qunit: src concat: src min: src');

Presupunând că ai creat src ținte pentru fiecare dintre aceste sarcini, puteți să sunați acum grunt src și faceți exact ceea ce doriți.


Cum utilizez sarcinile terților??

În timp ce sarcinile care vin cu Grunt vor ajunge destul de departe, probabil vă puteți gândi la alte lucruri pe care ați vrea să le puteți automatiza. Nu vă faceți griji: Grunt vine cu un API care permite oricui să creeze sarcini Grunt și pluginuri. În timp ce nu vom crea sarcini Grunt în acest tutorial, dacă sunteți interesat să faceți acest lucru, ar trebui să începeți cu șablonul plugin Grunt (rulați grunt init: gruntplugin), apoi citiți prin documentele API. Odată ce ați scris sarcina dvs., o puteți încărca într-un proiect prin adăugarea acestei linii în interiorul proiectului dvs. grunt.js fişier:

grunt.loadTasks (PATH_TO_TASKS_FOLDER);

Rețineți că parametrul nu este calea către fișierul de sarcini în sine, este calea către dosarul în care se află fișierul de sarcini.

Cu toate acestea, alte pluginuri Grunt încep să apară, iar unele sunt disponibile pe NPM. După ce le instalați npm install, le veți încărca în proiectul dvs. cu această linie:

grunt.loadNpmTasks (PLUGIN_NAME);

Desigur, veți dori să verificați documentația pluginului pentru a vedea ce ar trebui să adăugați la obiectul de configurare.

Ce pluginuri Grunt sunt disponibile? Ei bine, din moment ce Grunt este atât de nou (mai puțin de o lună în timp ce scriu asta), nu sunt încă prea multe. Am gasit doua:

  • groh-css: pentru crapare și minificare CSS
  • mormăit-iasomie-sarcină: pentru rularea specificațiilor Jasmine

Dacă ați găsit pe alții, mi-ar plăcea să aud despre ele; postați-le în comentarii!


Concluzie

În timp ce Grunt este un proiect foarte nou, este greu incomplet; după cum am văzut, acesta vine cu tot ceea ce veți avea nevoie să îl utilizați într-un proiect mare și poate fi extins la fel de mult cum doriți.

Sper că Grunt va deveni un standard comunitar și că vom vedea în viitorul apropiat o mulțime de sarcini, pluginuri și șabloane init. Ce crezi despre asta?

Cod