Top Banner
Advanced JavaScript Build Pipelines with Gulp.js
67

Advanced JavaScript build pipelines using Gulp.js

Jan 16, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Advanced JavaScript build pipelines using Gulp.js

Advanced JavaScript

Build Pipelines

with Gulp.js

Page 2: Advanced JavaScript build pipelines using Gulp.js

Let's talk a

short bit about

the JS build tool

revolution

Page 3: Advanced JavaScript build pipelines using Gulp.js

HTML

CSS

JavaScript

Page 4: Advanced JavaScript build pipelines using Gulp.js

Sass CoffeeScript LESS

P o s t C S S H A M L J a d e

U g l i f y E S 6 R e a c t J S

Browserify AngularJS

Ember CSSMin JSLint

ESHint ImageOptim Mocha

Jasmine TypeScript

Page 5: Advanced JavaScript build pipelines using Gulp.js
Page 6: Advanced JavaScript build pipelines using Gulp.js
Page 7: Advanced JavaScript build pipelines using Gulp.js
Page 8: Advanced JavaScript build pipelines using Gulp.js

1530 lines of code

original Ant tasks used:

concat — copy — delete — mkdir

Page 9: Advanced JavaScript build pipelines using Gulp.js
Page 10: Advanced JavaScript build pipelines using Gulp.js

Maybe Java isn't the right

tool?

Java is to JavaScript whatAlf is to Gandalf

Page 11: Advanced JavaScript build pipelines using Gulp.js

Grunt started a boom

Page 12: Advanced JavaScript build pipelines using Gulp.js

Gruntfiles get long

Page 13: Advanced JavaScript build pipelines using Gulp.js

Grunt tasks get slow:

lots of reads

and writes

Page 14: Advanced JavaScript build pipelines using Gulp.js

One unmanageable horde

of (sometimes)

low quality plug-ins

Page 15: Advanced JavaScript build pipelines using Gulp.js

And then came Gulp

Page 16: Advanced JavaScript build pipelines using Gulp.js

React is in love with

Webpack

Page 17: Advanced JavaScript build pipelines using Gulp.js

Ember.js digs Broccoli.js

Page 18: Advanced JavaScript build pipelines using Gulp.js

Ember.js digs Broccoli.js

Page 19: Advanced JavaScript build pipelines using Gulp.js
Page 20: Advanced JavaScript build pipelines using Gulp.js

So… every community seems

to have its preference

Stick with your communities

preference!

Page 21: Advanced JavaScript build pipelines using Gulp.js

For all the rest?

Gulp might be a good,

very good option

Page 22: Advanced JavaScript build pipelines using Gulp.js

Disclaimer

Page 23: Advanced JavaScript build pipelines using Gulp.js

I (occasionally) contribute to

Gulp

Page 24: Advanced JavaScript build pipelines using Gulp.js

I'm writing a book on Gulp

http://bit.ly/gulp-tool-book

39% off with 39baumgarcoupon code!

Page 25: Advanced JavaScript build pipelines using Gulp.js

gulp.src(…) gulp.dest(…)

Reads files Writes files

Page 26: Advanced JavaScript build pipelines using Gulp.js

gulp.src(…) .pipe(uglify()) gulp.dest(…)

Page 27: Advanced JavaScript build pipelines using Gulp.js

gulp.src(…) .pipe(uglify()) gulp.dest(…).pipe(concat())

Page 28: Advanced JavaScript build pipelines using Gulp.js

task

manager

streaming

file

system

file watcher

Page 29: Advanced JavaScript build pipelines using Gulp.js

gulp.task('scripts', function() { !

return gulp.src(‘src/**/*.js') !

.pipe(uglify()) !

.pipe(concat('main.min.js')) !

.pipe(gulp.dest('dist')); !

}); !

!

gulp.task('default', function(done) { !

gulp.watch(‘src/**/*.js', gulp.parallel(‘scripts')); !

done(); !

}); !

Page 30: Advanced JavaScript build pipelines using Gulp.js

undertaker.task('scripts', function() { !

return vinyl.src(‘src/**/*.js') !

.pipe(uglify()) !

.pipe(concat('main.min.js')) !

.pipe(vinyl.dest('dist')); !

}); !

!

undertaker.task('default', function(done) { !

chokidar.watch(‘src/**/*.js', undertaker.parallel(‘scripts')); !

done(); !

}); !

Page 31: Advanced JavaScript build pipelines using Gulp.js

so similar … yet so

different?

Gulp

Streams

Browserify

Streams

Page 32: Advanced JavaScript build pipelines using Gulp.js

var source = require(‘vinyl-source-stream’); !

!

var b = browserify({ !

entries: ['_js/main.js'] !

}); !

!

var bundle = function() { !

return b.bundle() !

.pipe(source(‘main.js’)) !

.pipe(gulp.dest('js')); !

} !

!

gulp.task(‘bundle’, bundle); !

Page 33: Advanced JavaScript build pipelines using Gulp.js

This also goes the

other way around…

Page 34: Advanced JavaScript build pipelines using Gulp.js

var app = express(); !

var router = express.Router(); !

!

router.get('/*', function(req, res) { !

var stream = request('http://host.to.forward.to' + req.originalUrl); !

stream.pipe(res); !

stream !

.pipe(source('.' + req.originalUrl)) !

.pipe(gulp.dest('./cachedir')); !

}); !

!

app.use(express.static('_site')); !

app.use(express.static('cachedir')); !

app.use(router); !

Page 35: Advanced JavaScript build pipelines using Gulp.js

var app = express(); !

var router = express.Router(); !

!

router.get('/*', function(req, res) { !

var stream = request('http://host.to.forward.to' + req.originalUrl); !

stream.pipe(res); !

stream !

.pipe(source('.' + req.originalUrl)) !

.pipe(gulp.dest('./cachedir'));!

}); !

!

app.use(express.static('_site')); !

app.use(express.static('cachedir')); !

app.use(router); !

Page 36: Advanced JavaScript build pipelines using Gulp.js

So start thinking

streams …

Page 37: Advanced JavaScript build pipelines using Gulp.js

Multiple input formats

return gulp.src(‘src/**/*.coffee) !

.pipe(coffee()) !

.pipe(uglify()) !

.pipe(concat(‘main.js’)) !

.pipe(gulp.dest(‘build’)) !

Page 38: Advanced JavaScript build pipelines using Gulp.js

Multiple input formats

return gulp.src(‘src/**/*.js) !

.pipe(uglify()) !

.pipe(concat(‘main.js’)) !

.pipe(gulp.dest(‘build’)) !

Page 39: Advanced JavaScript build pipelines using Gulp.js

Multiple input formats

return gulp.src(‘src/**/*.js) !

.pipe(uglify()) !

.pipe(concat(‘main.js’)) !

.pipe(gulp.dest(‘build’)) !

the same!

Page 40: Advanced JavaScript build pipelines using Gulp.js

Multiple input formats

And actually, you just want

one bundle in the end

Page 41: Advanced JavaScript build pipelines using Gulp.js

What if we could

reuse parts of the

stream?

Page 42: Advanced JavaScript build pipelines using Gulp.js

return gulp.src(‘app1/src/**/*.coffee’) !

.pipe(coffee()) !

.pipe(uglify() !

.pipe(concat(‘main.js’)) !

.pipe(gulp.dest('build')); !

Page 43: Advanced JavaScript build pipelines using Gulp.js

var merge = require(‘merge2’); !

!

return merge(gulp.src(‘app1/src/**/*.coffee’) !

.pipe(coffee()), !

gulp.src(‘app1/src/**/*.js’)) !

.pipe(uglify() !

.pipe(concat(‘main.js’)) !

.pipe(gulp.dest('build')); !

Page 44: Advanced JavaScript build pipelines using Gulp.js

var merge = require(‘merge2’); !

!

return gulp.src(‘app1/src/**/*.coffee’) !

.pipe(markdown()), !

.pipe(gulp.src(‘app1/src/**/*.js’), {passthrough: true}) !

.pipe(rename(blogFn)) !

.pipe(wrap(layoutStr)) !

.pipe(swig()) !

.pipe(gulp.dest('build')); !

Page 45: Advanced JavaScript build pipelines using Gulp.js

Multiple bundles

And now we need this

over and over again

for all our applications…

Page 46: Advanced JavaScript build pipelines using Gulp.js

var elems = [ !

{ dir: ‘app1’, bundleName: ‘app1.min.js’ }, !

{ dir: ‘app2’, bundleName: ‘app2.min.js’ } !

]; !

Page 47: Advanced JavaScript build pipelines using Gulp.js

!

var streams = elems.map(function(el) { !

return gulp.src(el.dir + ‘src/**/*.coffee’) !

.pipe(coffee()), !

.pipe(gulp.src(el.dir + ‘src/**/*.js’), {passthrough: true}) !

.pipe(uglify()) !

.pipe(concat(el.bundleName)) !

}); !

return merge(streams) !

.pipe(gulp.dest('build')); !

Page 48: Advanced JavaScript build pipelines using Gulp.js

Incremental

builds

Page 49: Advanced JavaScript build pipelines using Gulp.js

Some tasks take long

gulp.src(‘scripts/*.js’) !

.pipe(uglify()) !

.pipe(gulp.dest()) !

.pipe(concat()) !

Too much is going on!

Each change: Uglify all

the files?

Page 50: Advanced JavaScript build pipelines using Gulp.js

filter files

that have changed

do performance

heavy operations

remember the

old files

and continue

with the other ops

Page 51: Advanced JavaScript build pipelines using Gulp.js

gulp.task('scripts', function () { !

return gulp.src('app/scripts/**/*.js') !

.pipe(cached('ugly')) !

.pipe(uglify()) !

.pipe(remember('ugly')) !

.pipe(concat('main.min.js')) !

.pipe(gulp.dest('dist/scripts')); !

}); !

Page 52: Advanced JavaScript build pipelines using Gulp.js

gulp.task('scripts', function () { !

return gulp.src('app/scripts/**/*.js') !

.pipe(cached('ugly')) !

.pipe(uglify()) !

.pipe(remember('ugly')) !

.pipe(concat('main.min.js')) !

.pipe(gulp.dest('dist/scripts')); !

}); !

we use the cache to

check if files have

changed

Page 53: Advanced JavaScript build pipelines using Gulp.js

gulp.task('scripts', function () { !

return gulp.src('app/scripts/**/*.js') !

.pipe(cached('ugly')) !

.pipe(uglify()) !

.pipe(remember('ugly')) !

.pipe(concat('main.min.js')) !

.pipe(gulp.dest('dist/scripts')); !

}); !

once we are done,

we remember all

the other files

we stored in

the cache

Page 54: Advanced JavaScript build pipelines using Gulp.js

gulp.task('lint', function () { !

return gulp.src(‘src/**/*.js’) !

.pipe(jshint()) !

.pipe(jshint.reporter(‘default’)) !

.pipe(jshint.reporter(‘fail’)); !

}); !

Page 55: Advanced JavaScript build pipelines using Gulp.js

gulp.task('lint', function () { !

return gulp.src(‘src/**/*.js’, { since: gulp.lastRun(‘lint’) }) !

.pipe(jshint()) !

.pipe(jshint.reporter(‘default’)) !

.pipe(jshint.reporter(‘fail’)); !

}); !

Page 56: Advanced JavaScript build pipelines using Gulp.js

gulp.task('images', function () { !

return gulp.src(‘src/images/**/*.*’) !

!

.pipe(imagemin()) !

.pipe(gulp.dest(‘dist’)); !

}); !

Page 57: Advanced JavaScript build pipelines using Gulp.js

gulp.task('images', function () { !

return gulp.src(‘src/images/**/*.*’) !

.pipe(newer(‘dist’)) !

.pipe(imagemin()) !

.pipe(gulp.dest(‘dist’)); !

}); !

Page 58: Advanced JavaScript build pipelines using Gulp.js

When architecting

Gulp build pipelines…

Page 59: Advanced JavaScript build pipelines using Gulp.js

Separate the process

from the content

Page 60: Advanced JavaScript build pipelines using Gulp.js

Think about how the

basic pipeline would

look like

Page 61: Advanced JavaScript build pipelines using Gulp.js

Think about how

your data looks like

Page 62: Advanced JavaScript build pipelines using Gulp.js

And then posh your pipes up

with stream tools that

change your data accordingly

Page 63: Advanced JavaScript build pipelines using Gulp.js

Thank you … !

Page 64: Advanced JavaScript build pipelines using Gulp.js

@ddprrt

Page 65: Advanced JavaScript build pipelines using Gulp.js

Material

Page 66: Advanced JavaScript build pipelines using Gulp.js

Workshop files

https://github.com/frontend-tooling

https://github.com/frontend-tooling/sample-project-gulp

https://github.com/frontend-tooling/static-site-generator

http://fettblog.eu

http://speakerdeck.com/ddprrt

Page 67: Advanced JavaScript build pipelines using Gulp.js

Reading Material

http://bit.ly/gulp-tool-book

39% off with 39baumgarcoupon code!