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'); });
Материалы, которые вдохновляли на пост: