SlideShare a Scribd company logo
Gulp
Devenez le plus heureux des front-end
Rémy Savard
Développeur web et formateur/conférencier
remysavard.com | @remysavard | /in/remysavard
Pourquoi automatiser
Gulp et Grunt
Gulp - Installation et Code
Gulp - Extensions
@remysavard
HTML
CSS
JS
Photo: ©
« Beaucoup d’outils! »
Photo: ©
Syntaxe et balisage (Haml, Markdown)
Templates (Underscore, Handlebars, Jade)
Tests et erreurs (W3C, JSHint, Mocha, Karma)
Préprocesseur CSS (Sass, Less, Stylus, Compass)
Préprocesseur JavaScript (CoffeeScript, TypeScript)
Minification de fichiers CSS et JS (Uglify, CodeKit)
Concaténation de fichiers CSS et JS (CodeKit)
Optimisation d’image (TinyPNG, CodeKit)
Génération de sprites (SpriteCow)
…
Photo: ©
« L’écosystème des outils devient de plus en
plus complexe, mais vous devez
les connaître, les utiliser et les aimer »
Photo: ©
« Soyez productifs et efficaces - Automatisez »
Exécutez du JS sur le serveur
Exécutez du JS en ligne de commande
GRUNT
JavaScript Task Runner
5 500+ extensions
Passez du temps à configurer vos extensions
Utilise des fichiers et répertoires temporaires
Exécute l'une après l'autre les tâches
OPEN SOURCE PROJECT OF THE YEAR | Winner
GULP
Streaming Build System
2 200+ extensions
Passez du temps à coder au lieu de configurer
Mise en mémoire des fichiers grâce aux Streams
Exécute les tâches en concurrence maximum
OPEN SOURCE PROJECT OF THE YEAR | Nomination
Photo: ©
« Peu importe lequel vous choisissez,
Aimez-le et utilisez-le »
- Ashley Nolan
@AshNolan_
« I asked 2028 front-end developers: 

What task runner do you prefer using … »
Gulp: 44%
Grunt: 28%
- Ashley Nolan
@AshNolan_
- Nick DeNardis
@nickdenardis
« After @gruntjs revolutionized my webdev
workflow… »
- Nick DeNardis
@nickdenardis
« …@gulpjs comes along and optimizes the
shit out of it. #iaminlove »
- Sindre Sorhus
Yeoman team, NPM contributor - @sindresorhus
« Getting started with @gulpjs […]
Think @gruntjs, but faster and less config »
- Wes Cruver
@WesCruver
« Woah, my @gruntjs watch task went from over
2s to 21ms after switching to @gulpjs […] »
- MichaelSharer
Developer for @NHL - @MichaelSharer
« We at the @NHL use @gulpjs »
Devenez le plus heureux des Front-end avec Gulp.js
GULP
En quelques mots
Extraction des fichiers du disque dur
Transformations dans la mémoire
Réécriture des fichiers sur le disque dur
gulp
});
gulp
});
« CODE »
Installez Node - https://nodejs.org/
GAME CHANGER OF THE YEAR | Nomination
npm install --global gulp
npm install --save-dev gulp
Créez le fichier gulpfile.js
npm init
Ligne de commande
npm install --global gulp
npm install --save-dev gulp
Créez le fichier gulpfile.js
npm init
Ligne de commande
{
"name": "gulp-confoo-2016",
"description": "Gulp pour confoo 2016",
"version": "1.0.0",
"author": "remysavard.com",
"copyright": "2016",
"devDependencies": {},
"dependencies": {}
}
package.json
npm install --global gulp
npm install --save-dev gulp
Créez le fichier gulpfile.js
npm init
Ligne de commande
{
"name": "gulp-confoo-2016",
"description": "Gulp pour confoo 2016",
"version": "1.0.0",
"author": "remysavard.com",
"copyright": "2016",
"devDependencies": {
"gulp": "^3.9.1"
},
"dependencies": {}
}
package.json
npm install --global gulp
npm install --save-dev gulp
Créez le fichier gulpfile.js
npm init
Ligne de commande
gulpfile.js
packages.json
node_modules/
src/
| index.html
| scss/
| | components/
| | | _alerts.scss
| | | _buttons.scss
| | style.scss
| js/
| | jquery.validate.js
| | fastclick.js
| | script.js
| img/
| | image-xl.png
public/
| index.html
| assets/
| | css/
| | | style.css
| | | style.min.css
| | js/
| | | script.js
| | | script.min.js
| | img/
gulpfile.js
packages.json
node_modules/
src/
| index.html
| scss/
| | components/
| | | _alerts.scss
| | | _buttons.scss
| | style.scss
| js/
| | jquery.validate.js
| | fastclick.js
| | script.js
| img/
| | image-xl.png
public/
| index.html
| assets/
| | css/
| | | style.css
| | | style.min.css
| | js/
| | | script.js
| | | script.min.js
| | img/
gulpfile.js
packages.json
node_modules/
src/
| index.html
| scss/
| | components/
| | | _alerts.scss
| | | _buttons.scss
| | style.scss
| js/
| | jquery.validate.js
| | fastclick.js
| | script.js
| img/
| | image-xl.png
public/
| index.html
| assets/
| | css/
| | | style.css
| | | style.min.css
| | js/
| | | script.js
| | | script.min.js
| | img/
Photo: ©
« 4 fonctions à retenir »
gulp.task()
var gulp = require('gulp');
gulp.task('default', function() {
console.log('Bonjour confoo 2016');
});
gulpfile.js
var gulp = require('gulp');
gulp.task('default', function() {
console.log('Bonjour confoo 2016');
});
gulpfile.js
var gulp = require('gulp');
gulp.task('default', function() {
console.log('Bonjour confoo 2016');
});
gulpfile.js
var gulp = require('gulp');
gulp.task('default', function() {
console.log('Bonjour confoo 2016');
});
gulpfile.js
Ligne de commande
> gulp
[14:40:44] Using gulpfile ~/…/gulpfile.js
[14:40:44] Starting 'default'...
Bonjour confoo 2016
[14:40:44] Finished 'default' after 75 μs
Ligne de commande
> gulp
[14:40:44] Using gulpfile ~/…/gulpfile.js
[14:40:44] Starting 'default'...
Bonjour confoo 2016
[14:40:44] Finished 'default' after 75 μs
Ligne de commande
> gulp
[14:40:44] Using gulpfile ~/…/gulpfile.js
[14:40:44] Starting 'default'...
Bonjour confoo 2016
[14:40:44] Finished 'default' after 75 μs
var gulp = require('gulp');
gulp.task('confoo', function() {
console.log('Bonjour confoo 2016');
});
gulpfile.js
Ligne de commande
> gulp confoo
[14:40:44] Using gulpfile ~/…/gulpfile.js
[14:40:44] Starting 'confoo'...
Bonjour confoo 2016
[14:40:44] Finished 'confoo' after 75 μs
Ligne de commande
> gulp confoo
[14:40:44] Using gulpfile ~/…/gulpfile.js
[14:40:44] Starting 'confoo'...
Bonjour confoo 2016
[14:40:44] Finished 'confoo' after 75 μs
gulp.src()
Compilation de fichiers .scss en .css
SASS
npm install --save-dev gulp-sass
Ligne de commande
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulpfile.js
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulpfile.js
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulpfile.js
gulp.src('src/scss/style.scss')
gulp.src('src/scss/*.scss')
gulp.src('src/scss/**/*.scss')
gulp.src('!src/scss/style.not.scss')
gulp.src('*.+(js|css)')
gulpfile.js
gulp.src('src/scss/style.scss')
gulp.src('src/scss/*.scss')
gulp.src('src/scss/**/*.scss')
gulp.src('!src/scss/style.not.scss')
gulp.src('*.+(js|css)')
gulpfile.js
gulp.src('src/scss/style.scss')
gulp.src('src/scss/*.scss')
gulp.src('src/scss/**/*.scss')
gulp.src('!src/scss/style.not.scss')
gulp.src('*.+(js|css)')
gulpfile.js
gulp.src('src/scss/style.scss')
gulp.src('src/scss/*.scss')
gulp.src('src/scss/**/*.scss')
gulp.src('!src/scss/style.not.scss')
gulp.src('*.+(js|css)')
gulpfile.js
gulp.src('src/scss/style.scss')
gulp.src('src/scss/*.scss')
gulp.src('src/scss/**/*.scss')
gulp.src('!src/scss/style.not.scss')
gulp.src('*.+(js|css)')
gulpfile.js
// Variables
var paths = {
src: 'src/',
scss: 'src/scss/**/*.scss',
html: 'src/*.html',
assets: 'assets/',
images: 'assets/img/**/*',
css: 'assets/css/**/*.css',
scripts: 'assets/js/**/*.js'
};
gulp.src(paths.scss)
gulpfile.js
// Variables
var paths = {
src: 'src/',
scss: 'src/scss/**/*.scss',
html: 'src/*.html',
assets: 'assets/',
images: 'assets/img/**/*',
css: 'assets/css/**/*.css',
scripts: 'assets/js/**/*.js'
};
gulp.src(paths.scss)
gulpfile.js
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulpfile.js
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulpfile.js
gulp.dest()
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulpfile.js
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulpfile.js
gulp.watch()
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulp.task('watch', function () {
gulp.watch('src/scss/*.scss', ['sass']);
});
gulpfile.js
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulp.task('watch', function () {
gulp.watch('src/scss/*.scss', ['sass']);
});
gulpfile.js
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulp.task('watch', function () {
gulp.watch('src/scss/*.scss', ['sass']);
});
gulpfile.js
var gulp = require('gulp'),
sass = require('gulp-sass');
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'));
});
gulp.task('watch', function () {
gulp.watch('src/scss/*.scss', ['sass']);
});
gulpfile.js
Dépendance des
tâches
Compilation de fichiers .scss en .css
Minification des fichiers CSS
Renommer les fichiers avec l’extension .min.css
CSS
npm install --save-dev gulp-csso
npm install --save-dev gulp-rename
Ligne de commande
npm install --save-dev gulp-csso
npm install --save-dev gulp-rename
Ligne de commande
var gulp = require('gulp'), …
gulp.task('minify-css', ['sass'], function()
{
gulp.src('public/assets/css/style.css')
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('minify-css', ['sass'], function()
{
gulp.src('public/assets/css/style.css')
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('minify-css', ['sass'], function()
{
gulp.src('public/assets/css/style.css')
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('minify-css', ['sass'], function()
{
gulp.src('public/assets/css/style.css')
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('minify-css', ['sass'], function()
{
gulp.src('public/assets/css/style.css')
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('minify-css', ['sass'], function()
{
gulp.src('public/assets/css/style.css')
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('minify-css', ['sass'], function()
{
gulp.src('public/assets/css/style.css')
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
« Vous êtes prêt !!! »
Photo: ©
« Extensions - Point de départ »
Réduire la quantité de Requêtes HTTP
Réduire le poids des fichiers
Performances Web
Compilation de fichiers .scss en .css
Ajout automatique de préfixes avec Can I Use
Concaténation de fichiers CSS
Suppression des CSS inutilisés
Minification des fichiers CSS
Renommer les fichiers avec l’extension .min.css
CSS
npm install --save-dev gulp-autoprefixer
npm install --save-dev gulp-uncss
npm install --save-dev gulp-concat
Ligne de commande
npm install --save-dev gulp-autoprefixer
npm install --save-dev gulp-uncss
npm install --save-dev gulp-concat
Ligne de commande
npm install --save-dev gulp-autoprefixer
npm install --save-dev gulp-uncss
npm install --save-dev gulp-concat
Ligne de commande
var gulp = require('gulp'), …
gulp.task('styles', function() {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(autoprefixer('last 2 version'))
.pipe(gulp.dest('public/assets/css'))
.pipe(concat('all.css'))
.pipe(gulp.dest('public/assets/css/'))
.pipe(uncss({html: ['public/index.html']}))
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('styles', function() {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(autoprefixer('last 2 version'))
.pipe(gulp.dest('public/assets/css'))
.pipe(concat('all.css'))
.pipe(gulp.dest('public/assets/css/'))
.pipe(uncss({html: ['public/index.html']}))
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('styles', function() {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(autoprefixer('last 2 version'))
.pipe(gulp.dest('public/assets/css'))
.pipe(concat('all.css'))
.pipe(gulp.dest('public/assets/css/'))
.pipe(uncss({html: ['public/index.html']}))
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('styles', function() {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(autoprefixer('last 2 version'))
.pipe(gulp.dest('public/assets/css'))
.pipe(concat('all.css'))
.pipe(gulp.dest('public/assets/css/'))
.pipe(uncss({html: ['public/index.html']}))
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('styles', function() {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(autoprefixer('last 2 version'))
.pipe(gulp.dest('public/assets/css'))
.pipe(concat('all.css'))
.pipe(gulp.dest('public/assets/css/'))
.pipe(uncss({html: ['public/index.html']}))
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('styles', function() {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(autoprefixer('last 2 version'))
.pipe(gulp.dest('public/assets/css'))
.pipe(concat('all.css'))
.pipe(gulp.dest('public/assets/css/'))
.pipe(uncss({html: ['public/index.html']}))
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('styles', function() {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(autoprefixer('last 2 version'))
.pipe(gulp.dest('public/assets/css'))
.pipe(concat('all.css'))
.pipe(gulp.dest('public/assets/css/'))
.pipe(uncss({html: ['public/index.html']}))
.pipe(csso())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/css/'));
});
gulpfile.js
Rapports d’erreurs avec JSHint
Concaténation de fichiers JS
Minification Uglify de fichiers JS
JavaScript
npm install --save-dev gulp-jshint
npm install --save-dev gulp-uglify
Ligne de commande
npm install --save-dev gulp-jshint
npm install --save-dev gulp-uglify
Ligne de commande
var gulp = require('gulp'), …
gulp.task('scripts', function() {
gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('script.js'))
.pipe(gulp.dest('public/assets/js'))
.pipe(uglify())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/js'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('scripts', function() {
gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('script.js'))
.pipe(gulp.dest('public/assets/js'))
.pipe(uglify())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/js'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('scripts', function() {
gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('script.js'))
.pipe(gulp.dest('public/assets/js'))
.pipe(uglify())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/js'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('scripts', function() {
gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('script.js'))
.pipe(gulp.dest('public/assets/js'))
.pipe(uglify())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/js'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('scripts', function() {
gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('script.js'))
.pipe(gulp.dest('public/assets/js'))
.pipe(uglify())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/js'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('scripts', function() {
gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('script.js'))
.pipe(gulp.dest('public/assets/js'))
.pipe(uglify())
.pipe(rename({suffix: '.min'}))
.pipe(gulp.dest('public/assets/js'));
});
gulpfile.js
Optimisation d’images (PNG, JPEG, GIF, SVG)
Génération de sprites
Images
npm install --save-dev gulp-imagemin
npm install --save-dev gulp-spritesmith
Ligne de commande
npm install --save-dev gulp-imagemin
npm install --save-dev gulp.spritesmith
Ligne de commande
gulpfile.js
var gulp = require('gulp'), …
gulp.task('images', function() {
gulp.src('src/img/**/*')
.pipe(imagemin({
optimizationLevel: 3,
progressive: true,
interlaced: true
}))
.pipe(gulp.dest('public/assets/img'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('images', function() {
gulp.src('src/img/**/*')
.pipe(imagemin({
optimizationLevel: 3,
progressive: true,
interlaced: true
}))
.pipe(gulp.dest('public/assets/img'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('images', function() {
gulp.src('src/img/**/*')
.pipe(imagemin({
optimizationLevel: 3,
progressive: true,
interlaced: true
}))
.pipe(gulp.dest('public/assets/img'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('images', function() {
gulp.src('src/img/**/*')
.pipe(imagemin({
optimizationLevel: 3,
progressive: true,
interlaced: true
}))
.pipe(gulp.dest('public/assets/img'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('images', function() {
gulp.src('src/img/**/*')
.pipe(imagemin({
optimizationLevel: 3,
progressive: true,
interlaced: true
}))
.pipe(gulp.dest('public/assets/img'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('sprite', function () {
gulp.src('src/img/sprites/*.png')
.pipe(spritesmith({
imgName: 'sprite.png',
cssName: 'sprite.css'
}))
.pipe(gulp.dest('public/assets/img/sprites'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('sprite', function () {
gulp.src('src/img/sprites/*.png')
.pipe(spritesmith({
imgName: 'sprite.png',
cssName: 'sprite.css'
}))
.pipe(gulp.dest('public/assets/img/sprites'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('sprite', function () {
gulp.src('src/img/sprites/*.png')
.pipe(spritesmith({
imgName: 'sprite.png',
cssName: 'sprite.css'
}))
.pipe(gulp.dest('public/assets/img/sprites'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('sprite', function () {
gulp.src('src/img/sprites/*.png')
.pipe(spritesmith({
imgName: 'sprite.png',
cssName: 'sprite.css'
}))
.pipe(gulp.dest('public/assets/img/sprites'));
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('sprite', function () {
gulp.src('src/img/sprites/*.png')
.pipe(spritesmith({
imgName: 'sprite.png',
cssName: 'sprite.css'
}))
.pipe(gulp.dest('public/assets/img/sprites'));
});
Synchronisation d’appareils + Live Reload
Cmd+S, Cmd+Tab, Cmd+R
npm install --save-dev browser-sync
Ligne de commande
OPEN SOURCE PROJECT OF THE YEAR | Nomination
gulpfile.js
var gulp = require('gulp'), …
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'))
});
gulpfile.js
var gulp = require('gulp'), …
gulp.task('sass', function () {
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('public/assets/css'))
.pipe(browserSync.stream());
});
gulpfile.js
gulp.task('sync', ['sass'], function() {
browserSync.init({
server: 'public'
});
gulp.watch('src/scss/*.scss', ['sass']);
});
gulpfile.js
gulp.task('sync', ['sass'], function() {
browserSync.init({
server: 'public'
});
gulp.watch('src/scss/*.scss', ['sass']);
});
gulpfile.js
gulp.task('sync', ['sass'], function() {
browserSync.init({
server: 'public'
});
gulp.watch('src/scss/*.scss', ['sass']);
});
gulpfile.js
gulp.task('sync', ['sass'], function() {
browserSync.init({
server: 'public'
});
gulp.watch('src/scss/*.scss', ['sass']);
});
Ligne de commande
> gulp sync
[08:02:01] Using gulpfile ~/…/gulpfile.js
[08:02:01] Starting 'sass'...
[08:02:01] Finished 'sass' after 5.51 ms
[08:02:01] Starting 'sync'...
[08:02:02] Finished 'sync' after 21 ms
[BS] Access URLs:
----------------------------------
Local: http://localhost:3000
External: http://10.0.1.8:3000
----------------------------------
UI: http://localhost:3001
UI External: http://10.0.1.8:3001
----------------------------------
[BS] Serving files from: public
Ligne de commande
> gulp sync
[08:02:01] Using gulpfile ~/…/gulpfile.js
[08:02:01] Starting 'sass'...
[08:02:01] Finished 'sass' after 5.51 ms
[08:02:01] Starting 'sync'...
[08:02:02] Finished 'sync' after 21 ms
[BS] Access URLs:
----------------------------------
Local: http://localhost:3000
External: http://10.0.1.8:3000
----------------------------------
UI: http://localhost:3001
UI External: http://10.0.1.8:3001
----------------------------------
[BS] Serving files from: public
Ligne de commande
> gulp sync
[08:02:01] Using gulpfile ~/…/gulpfile.js
[08:02:01] Starting 'sass'...
[08:02:01] Finished 'sass' after 5.51 ms
[08:02:01] Starting 'sync'...
[08:02:02] Finished 'sync' after 21 ms
[BS] Access URLs:
----------------------------------
Local: http://localhost:3000
External: http://10.0.1.8:3000
----------------------------------
UI: http://localhost:3001
UI External: http://10.0.1.8:3001
----------------------------------
[BS] Serving files from: public
Ligne de commande
> gulp sync
[08:02:01] Using gulpfile ~/…/gulpfile.js
[08:02:01] Starting 'sass'...
[08:02:01] Finished 'sass' after 5.51 ms
[08:02:01] Starting 'sync'...
[08:02:02] Finished 'sync' after 21 ms
[BS] Access URLs:
----------------------------------
Local: http://localhost:3000
External: http://10.0.1.8:3000
----------------------------------
UI: http://localhost:3001
UI External: http://10.0.1.8:3001
----------------------------------
[BS] Serving files from: public
Devenez le plus heureux des Front-end avec Gulp.js
- Adam Tomat
@adamtoma
« Starting the day testing; @BrowserSync
making life much easier  »
Devenez le plus heureux des Front-end avec Gulp.js
Photo: ©
« Extensions - C’est tout? »
Photo: ©
Extensions intéressantes
gulp-util
gulp-clean
gulp-cached
gulp-changed
gulp-remember
gulp-bower
gulp-notify
gulp-compass
gulp-inject
gulp-react
gulp-load-plugins
gulp-mocha
gulp-jasmine
gulp-template
Photo: ©
« Soyez productifs et efficaces - Automatisez »
Configurez-le à votre goût
Réutilisez vos recettes
Itérez et améliorez votre gabarit
Souriez et soyez heureux
Débutez avec un gabarit
Photo: ©
« Êtes-vous plus heureux ? »
Rémy Savard
Développeur web et formateur/conférencier
remysavard.com | @remysavard | /in/remysavard
MERCI
« Besoin d’un développeur Web
ou d’une formation »
remysavard.com
Sources
https://speakerdeck.com/jackfranklin/fowa-development-with-gulpjs
https://speakerdeck.com/addyosmani/automating-front-end-workflow
https://medium.com/@contrahacks/gulp-3828e8126466
http://www.smashingmagazine.com/2014/06/11/building-with-gulp/
http://markdalgleish.github.io/presentation-build-wars-gulp-vs-grunt/
http://markgoodyear.com/2014/01/getting-started-with-gulp/
http://www.smashingmagazine.com/2014/06/11/building-with-gulp/
https://scotch.io/tutorials/automate-your-tasks-easily-with-gulp-js
https://github.com/substack/stream-handbook
https://github.com/gulpjs/

More Related Content

PPTX
Introduction to Gulp
PPTX
Grunt - The JavaScript Task Runner
PDF
Frontend JS workflow - Gulp 4 and the like
PPTX
Grunt to automate JS build
PPTX
JavaScript code academy - introduction
ODP
GulpJs - An Introduction
PDF
GDG Kraków - Intro to front-end automation using bower.js & grunt.js
PDF
The Secrets of The FullStack Ninja - Part A - Session I
Introduction to Gulp
Grunt - The JavaScript Task Runner
Frontend JS workflow - Gulp 4 and the like
Grunt to automate JS build
JavaScript code academy - introduction
GulpJs - An Introduction
GDG Kraków - Intro to front-end automation using bower.js & grunt.js
The Secrets of The FullStack Ninja - Part A - Session I

What's hot (19)

PDF
Introduction to Express and Grunt
PDF
Production Ready Javascript With Grunt
PDF
Getting started with gulpjs
PPTX
Introduction to using Grunt & Bower with WordPress theme development
PDF
Grunt & Front-end Workflow
PDF
Modernizing Your WordPress Workflow with Grunt & Bower
PDF
Grunt All Day
PDF
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
PPTX
Gulp and bower Implementation
PPTX
Go to gRPC
PPTX
Plone deployment made easy
PDF
Bower & Grunt - A practical workflow
PDF
Npm scripts
PDF
TDC2016SP - Esqueça Grunt ou Gulp. Webpack and NPM rule them all!
PDF
Google App Engine: Basic
PDF
Screenshot as a service
PPTX
Grunt and Bower
PDF
JLPDevs - Optimization Tooling for Modern Web App Development
PDF
Web development tools { starter pack }
Introduction to Express and Grunt
Production Ready Javascript With Grunt
Getting started with gulpjs
Introduction to using Grunt & Bower with WordPress theme development
Grunt & Front-end Workflow
Modernizing Your WordPress Workflow with Grunt & Bower
Grunt All Day
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
Gulp and bower Implementation
Go to gRPC
Plone deployment made easy
Bower & Grunt - A practical workflow
Npm scripts
TDC2016SP - Esqueça Grunt ou Gulp. Webpack and NPM rule them all!
Google App Engine: Basic
Screenshot as a service
Grunt and Bower
JLPDevs - Optimization Tooling for Modern Web App Development
Web development tools { starter pack }
Ad

Viewers also liked (20)

PDF
Intro to Gulp
PDF
Résultats de recherche améliorés avec les microdonnées HTML5
KEY
HTML5 - Sémantique, structure et nouveaux éléments
KEY
CSS3 - nouveautes
PPTX
Gulp: Task Runner
PPTX
Bower introduction
PDF
Automating your workflow with Gulp.js
PPTX
40+ tips to use Postman more efficiently
PPSX
Páginas+w..
DOC
C:\Fakepath\CóDigo De éTica Ese Hfv
PPTX
Fatla
PPTX
Creando un blog
PPT
Tarjeta Madre
PPT
Presentación memoria
PDF
Festival de cinéma de douarnenez
PDF
Ne Ratez pas le Mariage du (21ème) siècle
PDF
JABES 2015 LEGANTo, une solution pour la gestion de listes de lecture / Maud ...
PPT
Web 2.0 para bibliotecas
PDF
Documentation Technique : CanSat Eole
PDF
Futurapolis 2013, le programme
Intro to Gulp
Résultats de recherche améliorés avec les microdonnées HTML5
HTML5 - Sémantique, structure et nouveaux éléments
CSS3 - nouveautes
Gulp: Task Runner
Bower introduction
Automating your workflow with Gulp.js
40+ tips to use Postman more efficiently
Páginas+w..
C:\Fakepath\CóDigo De éTica Ese Hfv
Fatla
Creando un blog
Tarjeta Madre
Presentación memoria
Festival de cinéma de douarnenez
Ne Ratez pas le Mariage du (21ème) siècle
JABES 2015 LEGANTo, une solution pour la gestion de listes de lecture / Maud ...
Web 2.0 para bibliotecas
Documentation Technique : CanSat Eole
Futurapolis 2013, le programme
Ad

Similar to Devenez le plus heureux des Front-end avec Gulp.js (20)

PDF
Quest for the Perfect Workflow for McrFRED
PDF
Modern Web Application Development Workflow - EclipseCon France 2014
PDF
Modern Web Application Development Workflow - EclipseCon Europe 2014
PDF
Get Grulping with JavaScript Task Runners (Matt Gifford)
PDF
Deploying Symfony | symfony.cat
PDF
May The Nodejs Be With You
PPTX
2015 - Basta! 2015, DE: JavaScript und build
PDF
DevOps For Small Teams
PPTX
Automated Development Workflow with Gulp
PDF
Forget Grunt and Gulp! Webpack and NPM rule them all!
KEY
Cooking with Chef
PDF
Hitchhiker's guide to the front end development
PDF
Gulp: Your Build Process Will Thank You
ODP
Capifony. Minsk PHP MeetUp #11
PDF
Madison PHP 2015 - DevOps For Small Teams
PDF
Workflow automation for Front-end web applications
PDF
Modern Web Application Development Workflow - web2day 2014
PDF
ZendCon 2015 - DevOps for Small Teams
PDF
WordCamp Atlanta - April 15 2018 - dev team workflow and processes with word...
PPT
CoffeeScript: A beginner's presentation for beginners copy
Quest for the Perfect Workflow for McrFRED
Modern Web Application Development Workflow - EclipseCon France 2014
Modern Web Application Development Workflow - EclipseCon Europe 2014
Get Grulping with JavaScript Task Runners (Matt Gifford)
Deploying Symfony | symfony.cat
May The Nodejs Be With You
2015 - Basta! 2015, DE: JavaScript und build
DevOps For Small Teams
Automated Development Workflow with Gulp
Forget Grunt and Gulp! Webpack and NPM rule them all!
Cooking with Chef
Hitchhiker's guide to the front end development
Gulp: Your Build Process Will Thank You
Capifony. Minsk PHP MeetUp #11
Madison PHP 2015 - DevOps For Small Teams
Workflow automation for Front-end web applications
Modern Web Application Development Workflow - web2day 2014
ZendCon 2015 - DevOps for Small Teams
WordCamp Atlanta - April 15 2018 - dev team workflow and processes with word...
CoffeeScript: A beginner's presentation for beginners copy

Recently uploaded (20)

PPTX
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
PPTX
Chapter 5: Probability Theory and Statistics
PDF
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
PDF
Getting Started with Data Integration: FME Form 101
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
A comparative study of natural language inference in Swahili using monolingua...
PPTX
Modernising the Digital Integration Hub
PDF
August Patch Tuesday
PPTX
1. Introduction to Computer Programming.pptx
PDF
WOOl fibre morphology and structure.pdf for textiles
PDF
project resource management chapter-09.pdf
PDF
Architecture types and enterprise applications.pdf
PPTX
Final SEM Unit 1 for mit wpu at pune .pptx
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Zenith AI: Advanced Artificial Intelligence
PDF
DP Operators-handbook-extract for the Mautical Institute
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PPTX
cloud_computing_Infrastucture_as_cloud_p
PPTX
The various Industrial Revolutions .pptx
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
Chapter 5: Probability Theory and Statistics
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
Getting Started with Data Integration: FME Form 101
gpt5_lecture_notes_comprehensive_20250812015547.pdf
A comparative study of natural language inference in Swahili using monolingua...
Modernising the Digital Integration Hub
August Patch Tuesday
1. Introduction to Computer Programming.pptx
WOOl fibre morphology and structure.pdf for textiles
project resource management chapter-09.pdf
Architecture types and enterprise applications.pdf
Final SEM Unit 1 for mit wpu at pune .pptx
Assigned Numbers - 2025 - Bluetooth® Document
Group 1 Presentation -Planning and Decision Making .pptx
Zenith AI: Advanced Artificial Intelligence
DP Operators-handbook-extract for the Mautical Institute
NewMind AI Weekly Chronicles - August'25-Week II
cloud_computing_Infrastucture_as_cloud_p
The various Industrial Revolutions .pptx

Devenez le plus heureux des Front-end avec Gulp.js

  • 1. Gulp Devenez le plus heureux des front-end Rémy Savard Développeur web et formateur/conférencier remysavard.com | @remysavard | /in/remysavard
  • 2. Pourquoi automatiser Gulp et Grunt Gulp - Installation et Code Gulp - Extensions
  • 5. Photo: © Syntaxe et balisage (Haml, Markdown) Templates (Underscore, Handlebars, Jade) Tests et erreurs (W3C, JSHint, Mocha, Karma) Préprocesseur CSS (Sass, Less, Stylus, Compass) Préprocesseur JavaScript (CoffeeScript, TypeScript) Minification de fichiers CSS et JS (Uglify, CodeKit) Concaténation de fichiers CSS et JS (CodeKit) Optimisation d’image (TinyPNG, CodeKit) Génération de sprites (SpriteCow) …
  • 6. Photo: © « L’écosystème des outils devient de plus en plus complexe, mais vous devez les connaître, les utiliser et les aimer »
  • 7. Photo: © « Soyez productifs et efficaces - Automatisez »
  • 8. Exécutez du JS sur le serveur Exécutez du JS en ligne de commande
  • 9. GRUNT JavaScript Task Runner 5 500+ extensions Passez du temps à configurer vos extensions Utilise des fichiers et répertoires temporaires Exécute l'une après l'autre les tâches OPEN SOURCE PROJECT OF THE YEAR | Winner
  • 10. GULP Streaming Build System 2 200+ extensions Passez du temps à coder au lieu de configurer Mise en mémoire des fichiers grâce aux Streams Exécute les tâches en concurrence maximum OPEN SOURCE PROJECT OF THE YEAR | Nomination
  • 11. Photo: © « Peu importe lequel vous choisissez, Aimez-le et utilisez-le »
  • 12. - Ashley Nolan @AshNolan_ « I asked 2028 front-end developers: 
 What task runner do you prefer using … »
  • 13. Gulp: 44% Grunt: 28% - Ashley Nolan @AshNolan_
  • 14. - Nick DeNardis @nickdenardis « After @gruntjs revolutionized my webdev workflow… »
  • 15. - Nick DeNardis @nickdenardis « …@gulpjs comes along and optimizes the shit out of it. #iaminlove »
  • 16. - Sindre Sorhus Yeoman team, NPM contributor - @sindresorhus « Getting started with @gulpjs […] Think @gruntjs, but faster and less config »
  • 17. - Wes Cruver @WesCruver « Woah, my @gruntjs watch task went from over 2s to 21ms after switching to @gulpjs […] »
  • 18. - MichaelSharer Developer for @NHL - @MichaelSharer « We at the @NHL use @gulpjs »
  • 20. GULP En quelques mots Extraction des fichiers du disque dur Transformations dans la mémoire Réécriture des fichiers sur le disque dur
  • 22. Installez Node - https://nodejs.org/
  • 23. GAME CHANGER OF THE YEAR | Nomination
  • 24. npm install --global gulp npm install --save-dev gulp Créez le fichier gulpfile.js npm init Ligne de commande
  • 25. npm install --global gulp npm install --save-dev gulp Créez le fichier gulpfile.js npm init Ligne de commande
  • 26. { "name": "gulp-confoo-2016", "description": "Gulp pour confoo 2016", "version": "1.0.0", "author": "remysavard.com", "copyright": "2016", "devDependencies": {}, "dependencies": {} } package.json
  • 27. npm install --global gulp npm install --save-dev gulp Créez le fichier gulpfile.js npm init Ligne de commande
  • 28. { "name": "gulp-confoo-2016", "description": "Gulp pour confoo 2016", "version": "1.0.0", "author": "remysavard.com", "copyright": "2016", "devDependencies": { "gulp": "^3.9.1" }, "dependencies": {} } package.json
  • 29. npm install --global gulp npm install --save-dev gulp Créez le fichier gulpfile.js npm init Ligne de commande
  • 30. gulpfile.js packages.json node_modules/ src/ | index.html | scss/ | | components/ | | | _alerts.scss | | | _buttons.scss | | style.scss | js/ | | jquery.validate.js | | fastclick.js | | script.js | img/ | | image-xl.png public/ | index.html | assets/ | | css/ | | | style.css | | | style.min.css | | js/ | | | script.js | | | script.min.js | | img/
  • 31. gulpfile.js packages.json node_modules/ src/ | index.html | scss/ | | components/ | | | _alerts.scss | | | _buttons.scss | | style.scss | js/ | | jquery.validate.js | | fastclick.js | | script.js | img/ | | image-xl.png public/ | index.html | assets/ | | css/ | | | style.css | | | style.min.css | | js/ | | | script.js | | | script.min.js | | img/
  • 32. gulpfile.js packages.json node_modules/ src/ | index.html | scss/ | | components/ | | | _alerts.scss | | | _buttons.scss | | style.scss | js/ | | jquery.validate.js | | fastclick.js | | script.js | img/ | | image-xl.png public/ | index.html | assets/ | | css/ | | | style.css | | | style.min.css | | js/ | | | script.js | | | script.min.js | | img/
  • 33. Photo: © « 4 fonctions à retenir »
  • 35. var gulp = require('gulp'); gulp.task('default', function() { console.log('Bonjour confoo 2016'); }); gulpfile.js
  • 36. var gulp = require('gulp'); gulp.task('default', function() { console.log('Bonjour confoo 2016'); }); gulpfile.js
  • 37. var gulp = require('gulp'); gulp.task('default', function() { console.log('Bonjour confoo 2016'); }); gulpfile.js
  • 38. var gulp = require('gulp'); gulp.task('default', function() { console.log('Bonjour confoo 2016'); }); gulpfile.js
  • 39. Ligne de commande > gulp [14:40:44] Using gulpfile ~/…/gulpfile.js [14:40:44] Starting 'default'... Bonjour confoo 2016 [14:40:44] Finished 'default' after 75 μs
  • 40. Ligne de commande > gulp [14:40:44] Using gulpfile ~/…/gulpfile.js [14:40:44] Starting 'default'... Bonjour confoo 2016 [14:40:44] Finished 'default' after 75 μs
  • 41. Ligne de commande > gulp [14:40:44] Using gulpfile ~/…/gulpfile.js [14:40:44] Starting 'default'... Bonjour confoo 2016 [14:40:44] Finished 'default' after 75 μs
  • 42. var gulp = require('gulp'); gulp.task('confoo', function() { console.log('Bonjour confoo 2016'); }); gulpfile.js
  • 43. Ligne de commande > gulp confoo [14:40:44] Using gulpfile ~/…/gulpfile.js [14:40:44] Starting 'confoo'... Bonjour confoo 2016 [14:40:44] Finished 'confoo' after 75 μs
  • 44. Ligne de commande > gulp confoo [14:40:44] Using gulpfile ~/…/gulpfile.js [14:40:44] Starting 'confoo'... Bonjour confoo 2016 [14:40:44] Finished 'confoo' after 75 μs
  • 46. Compilation de fichiers .scss en .css SASS
  • 47. npm install --save-dev gulp-sass Ligne de commande
  • 48. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulpfile.js
  • 49. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulpfile.js
  • 50. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulpfile.js
  • 56. // Variables var paths = { src: 'src/', scss: 'src/scss/**/*.scss', html: 'src/*.html', assets: 'assets/', images: 'assets/img/**/*', css: 'assets/css/**/*.css', scripts: 'assets/js/**/*.js' }; gulp.src(paths.scss) gulpfile.js
  • 57. // Variables var paths = { src: 'src/', scss: 'src/scss/**/*.scss', html: 'src/*.html', assets: 'assets/', images: 'assets/img/**/*', css: 'assets/css/**/*.css', scripts: 'assets/js/**/*.js' }; gulp.src(paths.scss) gulpfile.js
  • 58. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulpfile.js
  • 59. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulpfile.js
  • 61. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulpfile.js
  • 62. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulpfile.js
  • 64. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulp.task('watch', function () { gulp.watch('src/scss/*.scss', ['sass']); }); gulpfile.js
  • 65. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulp.task('watch', function () { gulp.watch('src/scss/*.scss', ['sass']); }); gulpfile.js
  • 66. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulp.task('watch', function () { gulp.watch('src/scss/*.scss', ['sass']); }); gulpfile.js
  • 67. var gulp = require('gulp'), sass = require('gulp-sass'); gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')); }); gulp.task('watch', function () { gulp.watch('src/scss/*.scss', ['sass']); }); gulpfile.js
  • 69. Compilation de fichiers .scss en .css Minification des fichiers CSS Renommer les fichiers avec l’extension .min.css CSS
  • 70. npm install --save-dev gulp-csso npm install --save-dev gulp-rename Ligne de commande
  • 71. npm install --save-dev gulp-csso npm install --save-dev gulp-rename Ligne de commande
  • 72. var gulp = require('gulp'), … gulp.task('minify-css', ['sass'], function() { gulp.src('public/assets/css/style.css') .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 73. var gulp = require('gulp'), … gulp.task('minify-css', ['sass'], function() { gulp.src('public/assets/css/style.css') .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 74. var gulp = require('gulp'), … gulp.task('minify-css', ['sass'], function() { gulp.src('public/assets/css/style.css') .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 75. var gulp = require('gulp'), … gulp.task('minify-css', ['sass'], function() { gulp.src('public/assets/css/style.css') .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 76. var gulp = require('gulp'), … gulp.task('minify-css', ['sass'], function() { gulp.src('public/assets/css/style.css') .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 77. var gulp = require('gulp'), … gulp.task('minify-css', ['sass'], function() { gulp.src('public/assets/css/style.css') .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 78. var gulp = require('gulp'), … gulp.task('minify-css', ['sass'], function() { gulp.src('public/assets/css/style.css') .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 80. Photo: © « Extensions - Point de départ »
  • 81. Réduire la quantité de Requêtes HTTP Réduire le poids des fichiers Performances Web
  • 82. Compilation de fichiers .scss en .css Ajout automatique de préfixes avec Can I Use Concaténation de fichiers CSS Suppression des CSS inutilisés Minification des fichiers CSS Renommer les fichiers avec l’extension .min.css CSS
  • 83. npm install --save-dev gulp-autoprefixer npm install --save-dev gulp-uncss npm install --save-dev gulp-concat Ligne de commande
  • 84. npm install --save-dev gulp-autoprefixer npm install --save-dev gulp-uncss npm install --save-dev gulp-concat Ligne de commande
  • 85. npm install --save-dev gulp-autoprefixer npm install --save-dev gulp-uncss npm install --save-dev gulp-concat Ligne de commande
  • 86. var gulp = require('gulp'), … gulp.task('styles', function() { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(autoprefixer('last 2 version')) .pipe(gulp.dest('public/assets/css')) .pipe(concat('all.css')) .pipe(gulp.dest('public/assets/css/')) .pipe(uncss({html: ['public/index.html']})) .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 87. var gulp = require('gulp'), … gulp.task('styles', function() { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(autoprefixer('last 2 version')) .pipe(gulp.dest('public/assets/css')) .pipe(concat('all.css')) .pipe(gulp.dest('public/assets/css/')) .pipe(uncss({html: ['public/index.html']})) .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 88. var gulp = require('gulp'), … gulp.task('styles', function() { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(autoprefixer('last 2 version')) .pipe(gulp.dest('public/assets/css')) .pipe(concat('all.css')) .pipe(gulp.dest('public/assets/css/')) .pipe(uncss({html: ['public/index.html']})) .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 89. var gulp = require('gulp'), … gulp.task('styles', function() { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(autoprefixer('last 2 version')) .pipe(gulp.dest('public/assets/css')) .pipe(concat('all.css')) .pipe(gulp.dest('public/assets/css/')) .pipe(uncss({html: ['public/index.html']})) .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 90. var gulp = require('gulp'), … gulp.task('styles', function() { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(autoprefixer('last 2 version')) .pipe(gulp.dest('public/assets/css')) .pipe(concat('all.css')) .pipe(gulp.dest('public/assets/css/')) .pipe(uncss({html: ['public/index.html']})) .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 91. var gulp = require('gulp'), … gulp.task('styles', function() { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(autoprefixer('last 2 version')) .pipe(gulp.dest('public/assets/css')) .pipe(concat('all.css')) .pipe(gulp.dest('public/assets/css/')) .pipe(uncss({html: ['public/index.html']})) .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 92. var gulp = require('gulp'), … gulp.task('styles', function() { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(autoprefixer('last 2 version')) .pipe(gulp.dest('public/assets/css')) .pipe(concat('all.css')) .pipe(gulp.dest('public/assets/css/')) .pipe(uncss({html: ['public/index.html']})) .pipe(csso()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/css/')); }); gulpfile.js
  • 93. Rapports d’erreurs avec JSHint Concaténation de fichiers JS Minification Uglify de fichiers JS JavaScript
  • 94. npm install --save-dev gulp-jshint npm install --save-dev gulp-uglify Ligne de commande
  • 95. npm install --save-dev gulp-jshint npm install --save-dev gulp-uglify Ligne de commande
  • 96. var gulp = require('gulp'), … gulp.task('scripts', function() { gulp.src('src/js/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')) .pipe(concat('script.js')) .pipe(gulp.dest('public/assets/js')) .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/js')); }); gulpfile.js
  • 97. var gulp = require('gulp'), … gulp.task('scripts', function() { gulp.src('src/js/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')) .pipe(concat('script.js')) .pipe(gulp.dest('public/assets/js')) .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/js')); }); gulpfile.js
  • 98. var gulp = require('gulp'), … gulp.task('scripts', function() { gulp.src('src/js/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')) .pipe(concat('script.js')) .pipe(gulp.dest('public/assets/js')) .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/js')); }); gulpfile.js
  • 99. var gulp = require('gulp'), … gulp.task('scripts', function() { gulp.src('src/js/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')) .pipe(concat('script.js')) .pipe(gulp.dest('public/assets/js')) .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/js')); }); gulpfile.js
  • 100. var gulp = require('gulp'), … gulp.task('scripts', function() { gulp.src('src/js/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')) .pipe(concat('script.js')) .pipe(gulp.dest('public/assets/js')) .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/js')); }); gulpfile.js
  • 101. var gulp = require('gulp'), … gulp.task('scripts', function() { gulp.src('src/js/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')) .pipe(concat('script.js')) .pipe(gulp.dest('public/assets/js')) .pipe(uglify()) .pipe(rename({suffix: '.min'})) .pipe(gulp.dest('public/assets/js')); }); gulpfile.js
  • 102. Optimisation d’images (PNG, JPEG, GIF, SVG) Génération de sprites Images
  • 103. npm install --save-dev gulp-imagemin npm install --save-dev gulp-spritesmith Ligne de commande
  • 104. npm install --save-dev gulp-imagemin npm install --save-dev gulp.spritesmith Ligne de commande
  • 105. gulpfile.js var gulp = require('gulp'), … gulp.task('images', function() { gulp.src('src/img/**/*') .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) .pipe(gulp.dest('public/assets/img')); });
  • 106. gulpfile.js var gulp = require('gulp'), … gulp.task('images', function() { gulp.src('src/img/**/*') .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) .pipe(gulp.dest('public/assets/img')); });
  • 107. gulpfile.js var gulp = require('gulp'), … gulp.task('images', function() { gulp.src('src/img/**/*') .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) .pipe(gulp.dest('public/assets/img')); });
  • 108. gulpfile.js var gulp = require('gulp'), … gulp.task('images', function() { gulp.src('src/img/**/*') .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) .pipe(gulp.dest('public/assets/img')); });
  • 109. gulpfile.js var gulp = require('gulp'), … gulp.task('images', function() { gulp.src('src/img/**/*') .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) .pipe(gulp.dest('public/assets/img')); });
  • 110. gulpfile.js var gulp = require('gulp'), … gulp.task('sprite', function () { gulp.src('src/img/sprites/*.png') .pipe(spritesmith({ imgName: 'sprite.png', cssName: 'sprite.css' })) .pipe(gulp.dest('public/assets/img/sprites')); });
  • 111. gulpfile.js var gulp = require('gulp'), … gulp.task('sprite', function () { gulp.src('src/img/sprites/*.png') .pipe(spritesmith({ imgName: 'sprite.png', cssName: 'sprite.css' })) .pipe(gulp.dest('public/assets/img/sprites')); });
  • 112. gulpfile.js var gulp = require('gulp'), … gulp.task('sprite', function () { gulp.src('src/img/sprites/*.png') .pipe(spritesmith({ imgName: 'sprite.png', cssName: 'sprite.css' })) .pipe(gulp.dest('public/assets/img/sprites')); });
  • 113. gulpfile.js var gulp = require('gulp'), … gulp.task('sprite', function () { gulp.src('src/img/sprites/*.png') .pipe(spritesmith({ imgName: 'sprite.png', cssName: 'sprite.css' })) .pipe(gulp.dest('public/assets/img/sprites')); });
  • 114. gulpfile.js var gulp = require('gulp'), … gulp.task('sprite', function () { gulp.src('src/img/sprites/*.png') .pipe(spritesmith({ imgName: 'sprite.png', cssName: 'sprite.css' })) .pipe(gulp.dest('public/assets/img/sprites')); });
  • 115. Synchronisation d’appareils + Live Reload Cmd+S, Cmd+Tab, Cmd+R
  • 116. npm install --save-dev browser-sync Ligne de commande OPEN SOURCE PROJECT OF THE YEAR | Nomination
  • 117. gulpfile.js var gulp = require('gulp'), … gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')) });
  • 118. gulpfile.js var gulp = require('gulp'), … gulp.task('sass', function () { gulp.src('src/scss/*.scss') .pipe(sass()) .pipe(gulp.dest('public/assets/css')) .pipe(browserSync.stream()); });
  • 119. gulpfile.js gulp.task('sync', ['sass'], function() { browserSync.init({ server: 'public' }); gulp.watch('src/scss/*.scss', ['sass']); });
  • 120. gulpfile.js gulp.task('sync', ['sass'], function() { browserSync.init({ server: 'public' }); gulp.watch('src/scss/*.scss', ['sass']); });
  • 121. gulpfile.js gulp.task('sync', ['sass'], function() { browserSync.init({ server: 'public' }); gulp.watch('src/scss/*.scss', ['sass']); });
  • 122. gulpfile.js gulp.task('sync', ['sass'], function() { browserSync.init({ server: 'public' }); gulp.watch('src/scss/*.scss', ['sass']); });
  • 123. Ligne de commande > gulp sync [08:02:01] Using gulpfile ~/…/gulpfile.js [08:02:01] Starting 'sass'... [08:02:01] Finished 'sass' after 5.51 ms [08:02:01] Starting 'sync'... [08:02:02] Finished 'sync' after 21 ms [BS] Access URLs: ---------------------------------- Local: http://localhost:3000 External: http://10.0.1.8:3000 ---------------------------------- UI: http://localhost:3001 UI External: http://10.0.1.8:3001 ---------------------------------- [BS] Serving files from: public
  • 124. Ligne de commande > gulp sync [08:02:01] Using gulpfile ~/…/gulpfile.js [08:02:01] Starting 'sass'... [08:02:01] Finished 'sass' after 5.51 ms [08:02:01] Starting 'sync'... [08:02:02] Finished 'sync' after 21 ms [BS] Access URLs: ---------------------------------- Local: http://localhost:3000 External: http://10.0.1.8:3000 ---------------------------------- UI: http://localhost:3001 UI External: http://10.0.1.8:3001 ---------------------------------- [BS] Serving files from: public
  • 125. Ligne de commande > gulp sync [08:02:01] Using gulpfile ~/…/gulpfile.js [08:02:01] Starting 'sass'... [08:02:01] Finished 'sass' after 5.51 ms [08:02:01] Starting 'sync'... [08:02:02] Finished 'sync' after 21 ms [BS] Access URLs: ---------------------------------- Local: http://localhost:3000 External: http://10.0.1.8:3000 ---------------------------------- UI: http://localhost:3001 UI External: http://10.0.1.8:3001 ---------------------------------- [BS] Serving files from: public
  • 126. Ligne de commande > gulp sync [08:02:01] Using gulpfile ~/…/gulpfile.js [08:02:01] Starting 'sass'... [08:02:01] Finished 'sass' after 5.51 ms [08:02:01] Starting 'sync'... [08:02:02] Finished 'sync' after 21 ms [BS] Access URLs: ---------------------------------- Local: http://localhost:3000 External: http://10.0.1.8:3000 ---------------------------------- UI: http://localhost:3001 UI External: http://10.0.1.8:3001 ---------------------------------- [BS] Serving files from: public
  • 128. - Adam Tomat @adamtoma « Starting the day testing; @BrowserSync making life much easier  »
  • 130. Photo: © « Extensions - C’est tout? »
  • 132. Photo: © « Soyez productifs et efficaces - Automatisez »
  • 133. Configurez-le à votre goût Réutilisez vos recettes Itérez et améliorez votre gabarit Souriez et soyez heureux Débutez avec un gabarit
  • 135. Rémy Savard Développeur web et formateur/conférencier remysavard.com | @remysavard | /in/remysavard MERCI « Besoin d’un développeur Web ou d’une formation » remysavard.com