Gulp
The streaming build system
WAIT...
Builds for web apps?
YES!
Plenty of reasons:
- Optimize images
- Inline base64 encoded images
- Automate retina stylesheet
- Concat all require.js modules
- Minifiy JS
- Compress HTML
- etc...
And now?
Let's hack a PHP script
No.
Because, no.
Use GruntJS!
Good intentions, but...
-
Ant-style builds for the JS world
- Massive configuration file
- Complex flow control
- Global install (ok, not anymore)
Sample Gruntfile
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
options: {
separator: ';'
},
dist: {
src: ['src/**/*.js'],
dest: 'dist/<%= pkg.name %>.js'
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
dist: {
files: {
'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
}
}
},
qunit: {
files: ['test/**/*.html']
},
jshint: {
files: ['gruntfile.js', 'src/**/*.js', 'test/**/*.js'],
options: {
// options here to override JSHint defaults
globals: {
jQuery: true,
console: true,
module: true,
document: true
}
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['jshint', 'qunit']
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('test', ['jshint', 'qunit']);
grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);
};
Enter Gulp
The streaming build system
Why streams?
Picture a build system in your head.
(It should take in files, modify them, and output the new ones)
You pictured this
Not this
Gulp JS
- Really small API (only 5 functions)
-
Crazy fast! (Maximum concurrency by default)
- Community growth's been wild (430+ plugins)
- Config is simpler (if you like Javascript)
How does it look?
Takes source
-> does stuff
-> does more stuff
-> outputs
gulp.src('*.js')
.pipe(...)
.pipe(...)
.pipe(gulp.dest('dist'));
Yes, you can keep piping!
HOW DO WE USE IT?
Styles
Compile LESS stylesheet
Generate retina stylesheet
Optimize images
Inline all images in CSS (base64)
Concat all styles
Optimize and compress styles
Cache busting
Javascript
Optimize and combine with require.js
Minimize our code
(and some 3rd party)
Concat all scripts
Cache bust
...and also...
Compress HTML
Generate .htaccess for deployment
DEV WORKFLOW!
Watch & LiveReload
Static server
and more to come...
Congratulations
You are now a Gulp expert
Gulp
By Gonzalo Casas
Gulp
Streaming build systems
- 1,231