-
-
Save jeromecoupe/0b807b0c1050647eb340360902c3203a to your computer and use it in GitHub Desktop.
"use strict"; | |
// Load plugins | |
const autoprefixer = require("autoprefixer"); | |
const browsersync = require("browser-sync").create(); | |
const cp = require("child_process"); | |
const cssnano = require("cssnano"); | |
const del = require("del"); | |
const eslint = require("gulp-eslint"); | |
const gulp = require("gulp"); | |
const imagemin = require("gulp-imagemin"); | |
const newer = require("gulp-newer"); | |
const plumber = require("gulp-plumber"); | |
const postcss = require("gulp-postcss"); | |
const rename = require("gulp-rename"); | |
const sass = require("gulp-sass"); | |
const webpack = require("webpack"); | |
const webpackconfig = require("./webpack.config.js"); | |
const webpackstream = require("webpack-stream"); | |
// BrowserSync | |
function browserSync(done) { | |
browsersync.init({ | |
server: { | |
baseDir: "./_site/" | |
}, | |
port: 3000 | |
}); | |
done(); | |
} | |
// BrowserSync Reload | |
function browserSyncReload(done) { | |
browsersync.reload(); | |
done(); | |
} | |
// Clean assets | |
function clean() { | |
return del(["./_site/assets/"]); | |
} | |
// Optimize Images | |
function images() { | |
return gulp | |
.src("./assets/img/**/*") | |
.pipe(newer("./_site/assets/img")) | |
.pipe( | |
imagemin([ | |
imagemin.gifsicle({ interlaced: true }), | |
imagemin.jpegtran({ progressive: true }), | |
imagemin.optipng({ optimizationLevel: 5 }), | |
imagemin.svgo({ | |
plugins: [ | |
{ | |
removeViewBox: false, | |
collapseGroups: true | |
} | |
] | |
}) | |
]) | |
) | |
.pipe(gulp.dest("./_site/assets/img")); | |
} | |
// CSS task | |
function css() { | |
return gulp | |
.src("./assets/scss/**/*.scss") | |
.pipe(plumber()) | |
.pipe(sass({ outputStyle: "expanded" })) | |
.pipe(gulp.dest("./_site/assets/css/")) | |
.pipe(rename({ suffix: ".min" })) | |
.pipe(postcss([autoprefixer(), cssnano()])) | |
.pipe(gulp.dest("./_site/assets/css/")) | |
.pipe(browsersync.stream()); | |
} | |
// Lint scripts | |
function scriptsLint() { | |
return gulp | |
.src(["./assets/js/**/*", "./gulpfile.js"]) | |
.pipe(plumber()) | |
.pipe(eslint()) | |
.pipe(eslint.format()) | |
.pipe(eslint.failAfterError()); | |
} | |
// Transpile, concatenate and minify scripts | |
function scripts() { | |
return ( | |
gulp | |
.src(["./assets/js/**/*"]) | |
.pipe(plumber()) | |
.pipe(webpackstream(webpackconfig, webpack)) | |
// folder only, filename is specified in webpack config | |
.pipe(gulp.dest("./_site/assets/js/")) | |
.pipe(browsersync.stream()) | |
); | |
} | |
// Jekyll | |
function jekyll() { | |
return cp.spawn("bundle", ["exec", "jekyll", "build"], { stdio: "inherit" }); | |
} | |
// Watch files | |
function watchFiles() { | |
gulp.watch("./assets/scss/**/*", css); | |
gulp.watch("./assets/js/**/*", gulp.series(scriptsLint, scripts)); | |
gulp.watch( | |
[ | |
"./_includes/**/*", | |
"./_layouts/**/*", | |
"./_pages/**/*", | |
"./_posts/**/*", | |
"./_projects/**/*" | |
], | |
gulp.series(jekyll, browserSyncReload) | |
); | |
gulp.watch("./assets/img/**/*", images); | |
} | |
// define complex tasks | |
const js = gulp.series(scriptsLint, scripts); | |
const build = gulp.series(clean, gulp.parallel(css, images, jekyll, js)); | |
const watch = gulp.parallel(watchFiles, browserSync); | |
// export tasks | |
exports.images = images; | |
exports.css = css; | |
exports.js = js; | |
exports.jekyll = jekyll; | |
exports.clean = clean; | |
exports.build = build; | |
exports.watch = watch; | |
exports.default = build; |
Thank you so much for this! I spent so long trying to figure out Gulp 4 after Gulp 3.9 but this made it so much clearer.
Am new to gulp, but am just curious, where do you import or use the exported functions. Thanks for sharing
@myquery The short answer is that you don't import when using a singe file. CommonJS exports are just Gulp4's way to expose tasks to the CLI to make them public. Non exported tasks are considered private (used only as subtasks) https://gulpjs.com/docs/en/getting-started/creating-tasks#exporting
That being said, you can require / alias them in your main file if your main file is becoming too big / complex. You can have a look at the code of my own site for an example https://github.com/jeromecoupe/webstoemp/blob/master/gulpfile.js
Thank you, this is a perfect reference point.
Thanks, but I have a suggestion that it would really help if you can add sample folder structure and text file with commands so it can we started by anyone.
Thanks a lot for this, tremendous help when going from v.3.9.1 to v4.x of gulp!
It finally worked, thanks a lot!
Thanks a lot. Helped me to upgrade to v4 of gulp
Thank you a lot for sharing! This helped me so much.
I'm getting the error:
imagemin.jpegtran is not a function
Any idea?
@evasoek yes. imagemin stopped using jpegtran a while ago in favour of mozjpeg.
This is an old Gist and you might want to look at the doc of the various plugins used.
// Optimize Images
function images() {
return gulp
.src("./assets/img/**/*")
.pipe(newer("./_site/assets/img"))
.pipe(
imagemin([
imagemin.gifsicle({ interlaced: true }),
// the line below is the one that you likely have to change
imagemin.mozjpeg({ quality: 75, progressive: true }),
imagemin.optipng({ optimizationLevel: 5 }),
imagemin.svgo({
plugins: [
{
removeViewBox: false,
collapseGroups: true
}
]
})
])
)
.pipe(gulp.dest("./_site/assets/img"));
}
Despite that, basic principles for Gulp 4 have stayed the same so this is still quite relevant. I ams till using Gulp (in combination with Webpack fr JS) on my personal site, which is available on Github if you are interested.
@evasoek yes. imagemin stopped using jpegtran a while ago in favour of mozjpeg.
This is an old Gist and you might want to look at the doc of the various plugins used.
// Optimize Images function images() { return gulp .src("./assets/img/**/*") .pipe(newer("./_site/assets/img")) .pipe( imagemin([ imagemin.gifsicle({ interlaced: true }), // the line below is the one that you likely have to change imagemin.mozjpeg({ quality: 75, progressive: true }), imagemin.optipng({ optimizationLevel: 5 }), imagemin.svgo({ plugins: [ { removeViewBox: false, collapseGroups: true } ] }) ]) ) .pipe(gulp.dest("./_site/assets/img")); }Despite that, basic principles for Gulp 4 have stayed the same so this is still quite relevant. I ams till using Gulp (in combination with Webpack fr JS) on my personal site, which is available on Github if you are interested.
Yes I figured, thanks! I got it to work eventually, so it's fine. 😊
thanks.
thank you so mush!
It's help a lot!