Slide 1

Slide 1 text

FRONT-END WORKFLOWS WITH GULP @BERMONPAINTER / Confoo

Slide 2

Slide 2 text

A BUILD SYSTEM. A TASK RUNNER. A WORKFLOW AUTOMATOR. Automate your mundane and repetitive tasks like preprocessing, minifying, concatenating, and optimizing files.

Slide 3

Slide 3 text

WORKFLOW & INSTALLATION

Slide 4

Slide 4 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 5

Slide 5 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

$ npm install -g gulp

Slide 8

Slide 8 text

$ sudo npm install -g gulp

Slide 9

Slide 9 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 10

Slide 10 text

$ npm init

Slide 11

Slide 11 text

{ "name" : “gulp-project-name”, "version" : "0.0.0", }

Slide 12

Slide 12 text

$ npm install --save-dev gulp

Slide 13

Slide 13 text

{ "name": "gulp-project-name, "version": "0.0.0", "devDependencies": { "gulp": "^3.8.8" } }

Slide 14

Slide 14 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 15

Slide 15 text

$ touch gulpfile.js

Slide 16

Slide 16 text

var gulp = require('gulp');

Slide 17

Slide 17 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 18

Slide 18 text

var gulp = require('gulp'); gulp.task('task-name', function() { . . . }); gulp.task('default', ['task-name', 'task-name']);

Slide 19

Slide 19 text

$ gulp task-name

Slide 20

Slide 20 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 21

Slide 21 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 22

Slide 22 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 23

Slide 23 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 24

Slide 24 text

Install Node / Gulp Setup package.json Create gulpfile.js Write Gulp tasks

Slide 25

Slide 25 text

3 PRIMARY CONCEPTS

Slide 26

Slide 26 text

PLUGINS The core of everything in Gulp. Do one thing. Do it well.

Slide 27

Slide 27 text

http://gulpjs.com/plugins/

Slide 28

Slide 28 text

STREAMS How you move from one task to another.

Slide 29

Slide 29 text

TASKS Allow us to interact with plugins.

Slide 30

Slide 30 text

GULP vs GRUNT

Slide 31

Slide 31 text

• Code over configuration • Configuration over code

Slide 32

Slide 32 text

• Code over configuration • Stream based • Configuration over code • File based

Slide 33

Slide 33 text

• Code over configuration • Stream based • Configuration over code • File based, heavy IO

Slide 34

Slide 34 text

FILE HANDLING IN GRUNT .scss .scss .scss .scss .css .min.css

Slide 35

Slide 35 text

FILE HANDLING IN GULP .scss .scss .scss concat() sass() minify() .min.css rename()

Slide 36

Slide 36 text

FILE HANDLING IN GULP .scss .scss .scss concat() sass() minify() .min.css rename() PIPE

Slide 37

Slide 37 text

CODE OVER CONFIGURATION

Slide 38

Slide 38 text

HIGH QUALITY PLUGINS

Slide 39

Slide 39 text

FAST/EFFICIENT, LOW IO

Slide 40

Slide 40 text

THE GULP API

Slide 41

Slide 41 text

gulp.task

Slide 42

Slide 42 text

gulp.task('name', ['dependencies'], function(done) { . . . });

Slide 43

Slide 43 text

gulp.task('build',['compile-sass', 'lint-js', 'compress-images']);

Slide 44

Slide 44 text

gulp.task('default', ['task-name', 'task-name']);

Slide 45

Slide 45 text

gulp.src

Slide 46

Slide 46 text

gulp.src(['source/**/*.js', '. . .'])

Slide 47

Slide 47 text

gulp.dest

Slide 48

Slide 48 text

gulp.src(['. . .', 'build/assets/**/*.js'])

Slide 49

Slide 49 text

gulp.src('./source/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('./build/assets/css'));

Slide 50

Slide 50 text

gulp.watch

Slide 51

Slide 51 text

gulp.watch('source/**/*.scss', ['compile']);

Slide 52

Slide 52 text

gulp.task('watch', function () { gulp.watch('source/**/*.scss', ['compile']); }); watcher.on('change', function (event) { // added, changed or deleted files console.log('Event type: ' + event.type); // The path of the modified file console.log('Event path: ' + event.path); });

Slide 53

Slide 53 text

MAXIMUM CONCURRENCY

Slide 54

Slide 54 text

COMMON WORKFLOW TASKS

Slide 55

Slide 55 text

COMPILE SASS

Slide 56

Slide 56 text

npm install —save-dev gulp-ruby-sass

Slide 57

Slide 57 text

// Dependencies var sass = require('gulp-ruby-sass'); // Gulp task gulp.task('compile-sass', function(){ return gulp.src('source/sass/*.scss') .pipe(sass({sourcemap: true})) .pipe(gulp.dest('assets/css')); });

Slide 58

Slide 58 text

$ gulp compile-sass

Slide 59

Slide 59 text

COMPILE COFFESCRIPT

Slide 60

Slide 60 text

npm install —save-dev gulp-coffee

Slide 61

Slide 61 text

// Dependencies var coffee = require('gulp-coffee'); // Gulp Task gulp.task('compile-coffee', function() { gulp.src('./source/coffeescript/*.coffee') .pipe(coffee({bare: true}).on('error', gutil.log)) .pipe(gulp.dest('./assets/js')) });

Slide 62

Slide 62 text

$ gulp compile-coffee

Slide 63

Slide 63 text

COMPILE JADE

Slide 64

Slide 64 text

npm install —save-dev gulp-jade

Slide 65

Slide 65 text

// Dependencies var jade = require('gulp-jade'); // Gulp Task gulp.task('compile-jade', function() { var YOUR_LOCALS = {}; gulp.src('./source/*.jade') .pipe(jade({ locals: YOUR_LOCALS })) .pipe(gulp.dest('./build/')) });

Slide 66

Slide 66 text

$ gulp compile-jade

Slide 67

Slide 67 text

COMBINE

Slide 68

Slide 68 text

gulp.task('default', ['compile-sass', 'compile-jade', 'compile-coffee']);

Slide 69

Slide 69 text

STATIC SITE GENERATOR Excellent example courtesy of @andrewdc

Slide 70

Slide 70 text

var gulp = require('gulp'), gutil = require('gulp-util'), sass = require('gulp-sass'), rubysass = require('gulp-ruby-sass'), autoprefixer = require('gulp-autoprefixer'), fileinclude = require('gulp-file-include'), rename = require('gulp-rename'), notify = require('gulp-notify'), lr = require('tiny-lr'), livereload = require('gulp-livereload'), connect = require('gulp-connect'), plumber = require('gulp-plumber'), server = lr(), path = require("path"); var paths = { templates: './templates/', sass: 'css/source/' };

Slide 71

Slide 71 text

TEMPLATES & PARTIALS

Slide 72

Slide 72 text

// Handle templates and partials gulp.task('fileinclude', function() { return gulp.src(path.join(paths.templates, '*.tpl.html')) .pipe(fileinclude()) .pipe(rename({ extname: "" })) .pipe(rename({ extname: ".html" })) .pipe(gulp.dest('./')) .pipe(livereload(server)) .pipe(notify({ message: 'Includes: included' })); });

Slide 73

Slide 73 text

COMPILE SASS

Slide 74

Slide 74 text

// Compile Sass (Libsass) gulp.task('sass', function() { return gulp.src(path.join(paths.sass, '*.scss')) .pipe(sass({ style: 'expanded', sourceComments: 'map', errLogToConsole: true})) .pipe(autoprefixer('last 2 version', "> 1%", 'ie 8', 'ie 9')) .pipe(gulp.dest('css')) .pipe(livereload(server)) .pipe(notify({ message: 'LibSass files dropped!' })); });

Slide 75

Slide 75 text

// Compile Sass (Ruby version) gulp.task('rubysass', function() { return gulp.src(path.join(paths.sass, '*.scss')) .pipe(plumber()) .pipe(rubysass({ sourcemap: true, style: 'expanded'})) .pipe(autoprefixer('last 2 version', "> 1%", 'ie 8', 'ie 9')) .pipe(gulp.dest('css')) .pipe(livereload(server)) .pipe(notify({ message: 'Ruby Sass files dropped!' })); });

Slide 76

Slide 76 text

LOCAL SERVER

Slide 77

Slide 77 text

// Create server gulp.task('connect', connect.server({ port: 5678, root: [__dirname], livereload: false })); function createWatcher(task) { // Listen on port 35729 server.listen(35729, function (err) { if (err) { return console.error(err) }; //Watch task for sass gulp.watch(path.join(paths.sass, '**/*.scss'), [task]); // watch task for gulp-includes gulp.watch(path.join(paths.templates, '**/*.html'), ['fileinclude']); }); }

Slide 78

Slide 78 text

WATCHERS

Slide 79

Slide 79 text

// Watch for libsass changes gulp.task('watch', function() { createWatcher('sass'); });

Slide 80

Slide 80 text

// Watch for Ruby Sass changes gulp.task('rubywatch', function() { createWatcher('rubysass'); });

Slide 81

Slide 81 text

RUNNING GULP COMMANDS

Slide 82

Slide 82 text

// Default gulp command gulp.task('default', ['fileinclude', 'sass', 'connect', 'watch'], function() {});

Slide 83

Slide 83 text

$ gulp

Slide 84

Slide 84 text

// Ruby gulp command gulp.task('useruby', ['fileinclude', 'rubysass', 'connect', 'rubywatch'], function() { });

Slide 85

Slide 85 text

$ gulp useruby

Slide 86

Slide 86 text

MOST EXCELLENT PLUGINS

Slide 87

Slide 87 text

gulp-concat

Slide 88

Slide 88 text

var concat = require('gulp-concat'); gulp.task('concatinate', function() { return gulp.src('assets/javscript/*.js') .pipe(concat('all.js')) .pipe(gulp.dest('build/all.js')) });

Slide 89

Slide 89 text

gulp-uglify

Slide 90

Slide 90 text

var uglify = require('gulp-uglify'); gulp.task('minify', function() { return gulp.src('assets/javscript/*.js') .pipe(concat('all.js')) .pipe(uglify()) .pipe(gulp.dest('build/all.js')) });

Slide 91

Slide 91 text

gulp-clean

Slide 92

Slide 92 text

var gulp = require('gulp'); var clean = require('gulp-clean'); gulp.task('clean', function () { return gulp.src('build', {read: false}) .pipe(clean()); });

Slide 93

Slide 93 text

gulp-plumber

Slide 94

Slide 94 text

var gulpError = function (errorMessage) { gutil.beep(); console.log(errorMessage); }; gulp.task('compass-sass', function () { gulp.src('source/scss/style.scss') .pipe(plumber({ errorHandler: gulpError })) .pipe(rubysass()) .pipe(gulp.dest('build/assets')); });

Slide 95

Slide 95 text

gulp-rename

Slide 96

Slide 96 text

var rename = require('gulp-rename'); gulp.task('vendor', function() { return gulp.src('source/*.js') .pipe(concat('all.js')) .pipe(gulp.dest('build')) .pipe(uglify()) .pipe(rename('all.min.js')) .pipe(gulp.dest('build')) .on('error', gutil.log) });

Slide 97

Slide 97 text

gulp-watch

Slide 98

Slide 98 text

var watch = require('gulp-watch'); gulp.task('watch-assets', function () { watch({ glob: 'scss/**/*.scss', emit: 'one', emitOnGlob: false },function(files) { return files .pipe(less({ paths: [ path.join(__dirname, 'scss', 'includes') ] })) .pipe(gulp.dest('build/css')) .on('error', gutil.log); }); });

Slide 99

Slide 99 text

gulp-load-plugins

Slide 100

Slide 100 text

var gulp = require('gulp'), gulpLoadPlugins = require('gulp-load-plugins'), plugins = gulpLoadPlugins(); gulp.task('js', function () { return gulp.src('js/*.js') .pipe(plugins.jshint()) });

Slide 101

Slide 101 text

gulp-livereload

Slide 102

Slide 102 text

browser-sync

Slide 103

Slide 103 text

No content

Slide 104

Slide 104 text

gulp-util

Slide 105

Slide 105 text

generator-gulp-webapp

Slide 106

Slide 106 text

No content

Slide 107

Slide 107 text

No content

Slide 108

Slide 108 text

No content

Slide 109

Slide 109 text

fin.