SlideShare uma empresa Scribd logo
1 de 136
Baixar para ler offline
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 »
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
- Adam Tomat
@adamtoma
« Starting the day testing; @BrowserSync
making life much easier  »
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/

Mais conteúdo relacionado

Mais procurados

Mais procurados (19)

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

Destaque

Creando un blog
Creando un blogCreando un blog
Creando un blog
pedroxido
 
Presentación memoria
Presentación memoriaPresentación memoria
Presentación memoria
memoriamemory
 
Festival de cinéma de douarnenez
Festival de cinéma de douarnenezFestival de cinéma de douarnenez
Festival de cinéma de douarnenez
cain33
 
Documentation Technique : CanSat Eole
Documentation Technique : CanSat EoleDocumentation Technique : CanSat Eole
Documentation Technique : CanSat Eole
CLES-FACIL
 
Futurapolis 2013, le programme
Futurapolis 2013, le programmeFuturapolis 2013, le programme
Futurapolis 2013, le programme
Le Point
 

Destaque (20)

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

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

Quest for the Perfect Workflow for McrFRED
Quest for the Perfect Workflow for McrFREDQuest for the Perfect Workflow for McrFRED
Quest for the Perfect Workflow for McrFRED
Andi Smith
 

Semelhante a Devenez le plus heureux des Front-end avec Gulp.js (20)

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

Último

Último (20)

Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 

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 »
  • 19.
  • 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
  • 127.
  • 128. - Adam Tomat @adamtoma « Starting the day testing; @BrowserSync making life much easier  »
  • 129.
  • 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