What is Gulp.js?
Gulp.js is what we call a JavaScript Task Runner, it is Open Source and available on GitHub. It helps you automate repetitive tasks such as minification, compilation, unit testing, linting, etc. Gulp.js does not revolutionize automation but simplifies it tremendously.
Today the Web automation ecosystem is dominated by Grunt.js (which is a great tool BTW) but lately Gulp.js is getting more trending and soon will be overtaking Grunt.js (according to the GitHub popularity, aka “stars”: 7900 for Grunt.js and 6250 for Gulp.js).
How is it better than Grunt or Cakefile?
I would say it is no better nor worse than Grunt or Cakefile, it is different. While Cakefile or Grunt use files to execute tasks, Gulp.js uses streams. It means that a typical Cakefile or Grunt workflow would be to execute a task that dumps a temporary file, than based on this file to execute another task that dumps another temporary file an so on…
With Gulp.js everything happens on the fly using Node’s stream, temporary files are not needed anymore which make it easy to learn, use and enjoy.
Installation
Use the -g options to install Gulp globally on your machine.
sudo npm install -g gulpPractical examples
Now let’s use Gulp a little bit. Throughout those examples we will discover how to use plugins to create specific tasks such as minifying, concatenate or even linting your code.
Source available on Github
HTML Minification
Using gulp-minify-html
npm install --save-dev gulp-minify-htmlgulpfile.js:
// including plugins
var gulp = require('gulp')
, minifyHtml = require("gulp-minify-html");
// task
gulp.task('minify-html', function () {
gulp.src('./Html/*.html') // path to your files
.pipe(minifyHtml())
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp minify-htmlCSS Minification
Using gulp-minify-css
npm install --save-dev gulp-minify-cssgulpfile.js:
// including plugins
var gulp = require('gulp')
, minifyCss = require("gulp-minify-css");
// task
gulp.task('minify-css', function () {
gulp.src('./Css/one.css') // path to your file
.pipe(minifyCss())
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp minify-cssJS Minification
Using gulp-uglify
npm install --save-dev gulp-uglifygulpfile.js:
// including plugins
var gulp = require('gulp')
, uglify = require("gulp-uglify");
// task
gulp.task('minify-js', function () {
gulp.src('./JavaScript/*.js') // path to your files
.pipe(uglify())
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp minify-jsCoffeeScript Compilation
Using gulp-coffee
npm install --save-dev gulp-coffeegulpfile.js:
// including plugins
var gulp = require('gulp')
, coffee = require("gulp-coffee");
// task
gulp.task('compile-coffee', function () {
gulp.src('./CoffeeScript/one.coffee') // path to your file
.pipe(coffee())
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp compile-coffeeLess Compilation
Using gulp-less
npm install --save-dev gulp-lessgulpfile.js:
// including plugins
var gulp = require('gulp')
, less = require("gulp-less");
// task
gulp.task('compile-less', function () {
gulp.src('./Less/one.less') // path to your file
.pipe(less())
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp compile-lessSass Compilation
Using gulp-sass
npm install --save-dev gulp-sass// including plugins
var gulp = require('gulp')
, sass = require("gulp-sass");
// task
gulp.task('compile-sass', function () {
gulp.src('./Sass/one.sass') // path to your file
.pipe(sass())
.pipe(gulp.dest('path/to/destination'));
});
gulp compile-sassECMAScript 6 Compilation
Using gulp-babel
npm install --save-dev gulp-babelgulpfile.js:
// including plugins
var gulp = require('gulp')
, babel = require("gulp-babel");
// task
gulp.task('compile-es6', function () {
gulp.src('./ES6/one.es6.js')
.pipe(babel())
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp compile-es6JavaScript Linting
Using gulp-jshint
npm install --save-dev gulp-jshintgulpfile.js:
// including plugins
var gulp = require('gulp')
, jshint = require("gulp-jshint");
// task
gulp.task('jsLint', function () {
gulp.src('./JavaScript/*.js') // path to your files
.pipe(jshint())
.pipe(jshint.reporter()); // Dump results
});
In case of success:
[gulp] Starting 'jsLint'...
[gulp] Finished 'jsLint' after 6.47 msIn case of failure:
[gulp] Starting 'jsLint'...
[gulp] Finished 'jsLint' after 5.86 ms
/var/www/gulp-examples/JavaScript/two.js: line 3, col 15, Expected '}' to match '{' from line 3 and instead saw '['.
/var/www/gulp-examples/JavaScript/two.js: line 3, col 16, Missing semicolon.
/var/www/gulp-examples/JavaScript/two.js: line 3, col 154, Expected an assignment or function call and instead saw an expression.
3 errorsRun:
gulp jsLintCoffeeScript Linting
Using gulp-coffeelint
npm install --save-dev gulp-coffeelintgulpfile.js:
// including plugins
var gulp = require('gulp')
, coffeelint = require("gulp-coffeelint");
// task
gulp.task('coffeeLint', function () {
gulp.src('./CoffeeScript/*.coffee') // path to your files
.pipe(coffeelint())
.pipe(coffeelint.reporter());
});
In case of success:
[gulp] Starting 'coffeeLint'...
[gulp] Finished 'coffeeLint' after 7.37 msIn case of failure:
[gulp] Starting 'coffeeLint'...
[gulp] Finished 'coffeeLint' after 6.25 ms
one.coffee
? line 3 Line contains a trailing semicolon
? 1 errorRun:
gulp coffeeLintRename a file
Using gulp-rename
npm install --save-dev gulp-renamegulpfile.js:
// including plugins
var gulp = require('gulp')
, rename = require('gulp-rename')
, coffee = require("gulp-coffee");
// task
gulp.task('rename', function () {
gulp.src('./CoffeeScript/one.coffee') // path to your file
.pipe(coffee()) // compile coffeeScript
.pipe(rename('renamed.js')) // rename into "renamed.js" (original name "one.js")
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp renameConcatenate files
Using gulp-concat
npm install --save-dev gulp-concatgulpfile.js:
// including plugins
var gulp = require('gulp')
, concat = require("gulp-concat");
// task
gulp.task('concat', function () {
gulp.src('./JavaScript/*.js') // path to your files
.pipe(concat('concat.js')) // concat and name it "concat.js"
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp concatAdd copyright
Using gulp-header
npm install --save-dev gulp-headerCopyright
[text] /* Gulp Examples by @julienrenaux:
- https://github.com/shprink
- https://twitter.com/julienrenaux
- https://www.facebook.com/julienrenauxblog
Full source at https://github.com/shprink/gulp-examples
MIT License, https://github.com/shprink/gulp-examples/blob/master/LICENSE */ [/text]
gulpfile.js:
// including plugins
var gulp = require('gulp')
, fs = require('fs')
, concat = require("gulp-concat")
, header = require("gulp-header");
// functions
// Get copyright using NodeJs file system
var getCopyright = function () {
return fs.readFileSync('Copyright');
};
// task
gulp.task('concat-copyright', function () {
gulp.src('./JavaScript/*.js') // path to your files
.pipe(concat('concat-copyright.js')) // concat and name it "concat-copyright.js"
.pipe(header(getCopyright()))
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp concat-copyrightAdd copyright with version
Using gulp-header and Node’s file system
npm install --save-dev gulp-headerCopyright
[text] /* Gulp Examples by @julienrenaux:
- https://github.com/shprink
- https://twitter.com/julienrenaux
- https://www.facebook.com/julienrenauxblog
Version: <%= version %> Full source at https://github.com/shprink/gulp-examples
MIT License, https://github.com/shprink/gulp-examples/blob/master/LICENSE */ [/text]
Version
[text] 1.0.0 [/text]
gulpfile.js:
// including plugins
var gulp = require('gulp')
, fs = require('fs')
, concat = require("gulp-concat")
, header = require("gulp-header");
// functions
// Get version using NodeJs file system
var getVersion = function () {
return fs.readFileSync('Version');
};
// Get copyright using NodeJs file system
var getCopyright = function () {
return fs.readFileSync('Copyright');
};
// task
gulp.task('concat-copyright-version', function () {
gulp.src('./JavaScript/*.js')
.pipe(concat('concat-copyright-version.js')) // concat and name it "concat-copyright-version.js"
.pipe(header(getCopyrightVersion(), {version: getVersion()}))
.pipe(gulp.dest('path/to/destination'));
});
Run:
gulp concat-copyright-versionMix them up (Lint, Concat, Compile, Minify etc.)
The purpose of this task is to mix the previous tasks into just one.
Copyright
[text] /* Gulp Examples by @julienrenaux:
- https://github.com/shprink
- https://twitter.com/julienrenaux
- https://www.facebook.com/julienrenauxblog
Version: <%= version %> Full source at https://github.com/shprink/gulp-examples
MIT License, https://github.com/shprink/gulp-examples/blob/master/LICENSE */ [/text]
Version
[text] 1.0.0 [/text]
gulpfile.js:
// including plugins
var gulp = require('gulp')
, fs = require('fs')
, coffeelint = require("gulp-coffeelint")
, coffee = require("gulp-coffee")
, uglify = require("gulp-uglify")
, concat = require("gulp-concat")
, header = require("gulp-header");
// functions
// Get version using NodeJs file system
var getVersion = function () {
return fs.readFileSync('Version');
};
// Get copyright using NodeJs file system
var getCopyright = function () {
return fs.readFileSync('Copyright');
};
// task
gulp.task('bundle-one', function () {
gulp.src('./CoffeeScript/*.coffee') // path to your files
.pipe(coffeelint()) // lint files
.pipe(coffeelint.reporter('fail')) // make sure the task fails if not compliant
.pipe(concat('bundleOne.js')) // concat files
.pipe(coffee()) // compile coffee
.pipe(uglify()) // minify files
.pipe(header(getCopyrightVersion(), {version: getVersion()})) // Add the copyright
.pipe(gulp.dest('path/to/destination'));
});
gulp bundle-oneTasks automation
Using gulp.watch you can easily automate any tasks when files are modified. It is really convenient because you do not have to run single tasks by hand every time a file is modified, and therefore your code is always up to date.
// including plugins
var gulp = require('gulp');
// task
gulp.task('watch-coffeescript', function () {
gulp.watch(['./CoffeeScript/*.coffee'], ['compile-coffee']);
});
Now run the task:
gulp watch-coffeescriptand see what happens when you modify one of the source file.