W jednym z poprzednich artykułów poruszony został temat preprocesorów CSS. Natomiast w niniejszym porównam dwa narzędzia przydatne do automatyzacji pracy każdego web developera. Ułatwiają pracę z preprocesorami, takimi jak Sass czy LESS, optymalizują zasobu CSS czy JavaScript oraz wczytują zmiany automatycznie za każdym razem, gdy plik zostanie zapisany.
Instalacja Gulp i Grunt
Oba narzędzia oparte są o platformę Node.js, dopiero po jej instalacji będzie możliwa instalacja Gulp’a lub Grunt’a, a odbywa się to poprzez wywołanie odpowiedniej komendy w konsoli.
GULP: npm install -g gulp
GRUNT: npm install -g grunt-cli
Obie komendy służą do instalacji globalnej, komenda do instalacji lokalnej wygląda następująco:
GULP: npm install gulp --save-dev
GRUNT: npm install grunt --save-dev
Przed rozpoczęciem korzystania z Gulpa czy Grunta musimy najpierw stworzyć plik konfiguracyjny i umieścić go w głównym katalogu naszego projektu. W przypadku Gulp’a będzie to gulpfile.js, a w przypadku Grunt’a gruntfile.js, oba pliki można stworzyć z konsoli za pomocą komendy touch nazwa_pliku.
Podstawy konfiguracji Gulp
Przykładowa minimalna zawartość pliku, w nim zawarta będzie cała konfiguracja:
var gulp = require('gulp');
gulp.task(‘default’,function() {
console.log(‘Hello!’);
});
Transformacja pliku LESS do CSS
W tym celu należy zainstalować wtyczkę gulp-less, w tym celu w konsoli wpisujemy:
npm install --save-dev gulp-less
Następnym krokiem będzie konfiguracja zadania i w tym celu wykorzystany nasz wcześniej utworzony plik gulpfile.js:
gulp = require('gulp'),
less = require('gulp-less'),
path = require('path');
gulp.task('less', function () {
return gulp.src('./layout/**/*.less')
.pipe(less({
paths: [ path.join(__dirname, 'less', 'includes') ]
}))
.pipe(gulp.dest('./public/css'));
});
Na początku należy zaimportować wtyczki za pomocą require. Zadanie definiujemy poprzez użycie funkcji task. Zostaną tutaj przekazane dwa parametry,mianowicie nazwa zadania oraz funkcja, która mówi gdzie implementujemy nasze zadanie. Jedna z linii przekazuje ścieżkę do plików LESS, użycie *.less informuje o tym, że interesują nas tylko pliki z takim rozszerzeniem. Kolejne linie kodu (8-10) służą do transformacji plików LESS na CSS, w tym celu użyto funkcji pipe. Linia 11 zwraca nam plik wynikowy transformacji.
Najważniejsze funkcje
gulp.task– służy do definiowania naszych zadańgulp.watch– uruchamia daną funkcję jak tylko zostaną zmienione plikigulp.src– wskazuje na pliki z których korzystamygulp.dest– zapisuje plik do określonej lokalizacji
Podstawy konfiguracji Grunt
Podstawowa zawartość pliku
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
taskName: { //nazwa zadania
options: { //opcje
},
operations: { //operacje
}
}
});
grunt.loadNpmTasks('grunt-module'); // w taki sposób ładujemy nasze moduły
grunt.registerTask('default', ['taskName']); // określany jakie zadania wykonują się po wpisaniu w konsoli grunt
};
Transformacja pliku SASS do CSS
W konsoli wpisujemy następujące polecenie:
npm install grunt-libsass --save-dev
Po zainstalowaniu wtyczki możemy przejść do konfiguracji w pliku gulpfile.js
libsass: { // zadanie główne
files: {
expand: true,
src: ['css/style.scss'], // pliki na których domyślnie ma być wykonane zadanie
dest: '', // gdzie mają się zapisać skompilowane pliki CSS (w tym przypadku zapisze się w lokalizacji pliku Sass)
ext: '.css' // rozszerzenie po skompilowaniu
}
}
Załadowanie zadanie odbywa się poprzez użycie:
grunt.loadNpmTasks('grunt-libsass');
Nasz plik powinien teraz wyglądać następująco:
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
libsass: {
files: {
expand: true,
src: ['css/style.scss'],
dest: '',
ext: '.css'
}
}
});
grunt.loadNpmTasks('grunt-libsass');
};
Aby zmiany były widoczne zaraz po zapisaniu ich w danym pliku warto dopisać jeszcze:
watch: {
scss: { // możemy określić dowolną nazwę
files: ['css/*.scss'], // określamy na jakich plikach pracujemy
tasks: ['libsass'] // wybieramy zadania jakie na nich wykonujemy, po kolei
}
}
Natomiast zadanie ładujemy za pomocą:
grunt.loadNpmTasks('grunt-contrib-watch');
Dodajemy również funkcję watch do domyślnych zadań:
grunt.registerTask('default', ['watch']);
Po zapisaniu pliku gulpfile.js i wywołania w konsoli polecenia grunt, każda modyfikacja wykonana na pliku SASS w folderze css będzie kompilowana i zapisywana do pliku wynikowego. Trzeba jednak pamiętać, że zamknięcie konsoli, zamknie nam zadanie i kompilacja zostanie przerwana.
Konfiguracja Grunta – initConfig
grunt-contrib-qunit– odpalenie testówgrunt-contrib-uglify– zminifikuje pliki JavaScriptgrunt-contrib-cssmin– zminifikuje pliki CSSgrunt-contrib-concat– połączy pliki w jedengrunt-contrib-copy– kopiuje pliki z jednej lokalizacji do drugiejgrunt-contrib-htmlmin– zminifikuje pliki HTML
Wady i zalety – Gulp vs Grunt
| Gulp | Grunt | |
| Zalety | zapewnia minifikację i konkatenację używa czystego kodu JavaScript konwertuje pliki (np Sass do CSS) operacje wykonywane są w pamięci sposób definiowania tasków jest przejrzysty ponad 2000 wtyczek | łatwość w wykonywaniu minifikacji, kompilacji i testowaniu plików operacje są wykonywane na plikach tymczasowych, przez co jest mniej wydajny ponad 5000 wtyczek |
| Wady | nie można wykonywać wiele zadań nowicjusz w porównaniu z Gruntem | sposób definiowania tasków jest nieczytelny pakiety nie są jednocześnie aktualizowane Node.js jeśli pakiety npm zostały zaktualizowane, trzeba czekać aż autor Grunta aktualizuje go |
Pomimo iż zauważyłem, że Gulp jest rzadziej zalecanym narzędziem do automatyzacji pracy web developera, to liczba jego zwolenników z dnia na dzień wzrasta. Z nim mam największą styczność przy pracy w różnych projektach. Z informacji od kolegów i tego co wyczytałem na forach, to właśnie Gulp jest tym narzędziem, który wykonuje operacje w szybciej i to dlatego coraz częściej się po niego sięga.