
Gulp.js это потоковый сборщик проектов на JavaScript, интересная альтернатива Grunt.js.
Установка
сначала глобально, чтобы можно было вызывать из командной строки:
$ sudo npm install gulp -g
потом локально, в папку проекта, чтобы его могла вызывать нода:
$ npm install gulp
проверим:
$ gulp --version [gulp] CLI version 3.5.2 [gulp] Local version 3.5.2
установка плагинов:
$ npm install gulp-livereload gulp-imagemin gulp-uglify gulp-concat
Создание конфигурационного файла
Для gulp конфигурационным файлом является gulpfile.js.
Для начала можем создать этот файл со следующим содержимым:
var gulp = require('gulp');
gulp.task('default', function(){
// place code for your default task here
});
и запустить, выполнив команду:
$ gulp [gulp] Using file .../gulpfile.js [gulp] Working directory changed to ... [gulp] Running 'default'... [gulp] Finished 'default' in 58 μs
Принцип вызова тасков из командной строки полностью идентичен Grunt.js.
Инициализация/подключение плагинов:
var livereload = require('gulp-livereload'),
uglify = require('gulp-uglify'),
concat = require('gulp-concat'),
connect = require('connect');
Пишем свои задания
Методы gulp, которые могут понадобиться при создании таска:
| Метод | Синтаксис | ПримеР |
|---|---|---|
| gulp.task | gulp.task(name[, deps], fn) |
gulp.task('do-log',
function(){console.log('Hello!')
});
gulp.task('test', ['do-log']);
|
| gulp.src | gulp.src(globs[, options]) |
gulp.src('./gulpfile.js')
|
| gulp.dest | gulp.dest(path) |
gulp.dest('main.min.css')
|
| gulp.watch | gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb]) |
var watcher = gulp.watch('js/**/*.js',
['uglify','reload']);
watcher.on('change', function(event){
console.log(event.path+' -> '+event.type);
});
gulp.watch('gulpfile.js', function(changes){
console.log(changes) });
|
| gulp.run | gulp.run(task) |
gulp.run('subtask')
|
Если собрать все методы в одном примере получим:
var gulp = require('gulp'),
jshint = require('gulp-jshint');
gulp.task('jshint', function() {
gulp.src('./gulpfile.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
gulp.task('do-log', function(){
gulp.watch('*.js', function(changes){
console.log(changes);
gulp.run('jshint');
});
});
gulp.task('start', ['do-log']);
– при изменении любого javascript файла (*.js) – выводим изменения в консоль и запускаем jshint-задание.
Вы уже вероятно обратили внимание что вся последовательность действий связанна через pipe-метод передающий по цепочке поток данных (stream). Концепция взята из node.js стримов.
С gulp можно прекрасно работать и не понимая, что происходит внутри pipe, но если вы уже перешли на следующий уровень и хотите “вклиниться в поток” либо написать свой плагин, то думаю вам может помочь разобраться этот пример:
function myPlugin(){
var stream = through.obj(function (file, enc, callback) {
console.log(file, enc, callback);
this.push(file);
return callback();
});
return stream;
}
var through = require('through2');
gulp.task('jshint', function() {
gulp.src('./gulpfile.js')
.pipe(myPlugin())
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
Методом myPlugin мы вклиниваемся в поток выполнения при этом не нарушая его: возвращаем stream. Вместо
console.log(file, enc, callback);
может быть ваш код по изменению контента.
Запуск локального сервера
так же делается довольно просто
var connect = require('gulp-connect');
gulp.task('server', function() {
connect
.use(connect.static('./public'))
.listen('3000');
});
Материалы, которые вдохновляли на пост: