YOU ARE DOWNLOADING DOCUMENT

Please tick the box to continue:

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!


Related Documents