Skip to content

Instantly share code, notes, and snippets.

@treykane
Last active December 20, 2018 19:10
Show Gist options
  • Save treykane/58d5b38a5cd94d2064ae to your computer and use it in GitHub Desktop.
Save treykane/58d5b38a5cd94d2064ae to your computer and use it in GitHub Desktop.
My basic gulp file
// npm install gulp
//---- TODO'S ----//
// TODO: smarter linting
// Include gulp
var gulp = require('gulp');
// Include Our Plugins
var jshint = require('gulp-jshint');
var sass = require('gulp-sass');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var minifyCss = require('gulp-minify-css');
var sourcemaps = require('gulp-sourcemaps');
var autoprefixer = require('gulp-autoprefixer');
var plumber = require('gulp-plumber');
var gutil = require('gulp-util');
var notify = require('gulp-notify');
var include = require('gulp-include');
var babel = require('gulp-babel');
var changed = require('gulp-changed');
var imagemin = require('gulp-imagemin');
var jpegOptim = require('imagemin-jpegoptim');
var pngQuant = require('imagemin-pngquant');
// File Path VARs
// These can be an array if you want to use multiple sources
var jsSrcDir = 'assets/src/js/' // source directory
var jsSrc = jsSrcDir + 'project.js' // source
var jsDestName = 'project.min.js' // destination file name
var jsDest = 'assets/dist/js/' // destination
var scssSrcDir = 'assets/src/scss/' // source directory
var scssSrc = scssSrcDir + 'project.scss' // source
var scssDestName = 'style.min.css' // destination file name
var scssDest = 'assets/dist/css/' // desitnation
var imageSrc = 'assets/src/images' // source
var imageDest = 'assets/dist/images' // desitnation
// Gulp-Notify Error Handler
var onError = function(err) {
notify.onError({
title: 'Gulp',
subtitle: 'Error:',
message: '<%= error.message %>',
sound: 'Sosumi',
})(err);
this.emit('end'); // Reset Gulp Watch
};
var compileSass = function() {
gulp
.src(scssSrc) // this all gets organized into this file
.pipe(plumber({ errorHandler: onError }))
.pipe(sourcemaps.init()) // start making src maps
.pipe(sass()) // compile scss
.pipe(
autoprefixer({
// autoprefixer
browsers: ['last 2 versions'],
cascade: false,
}),
)
.pipe(minifyCss()) // minify
.pipe(rename(scssDestName)) // create file
.pipe(notify('Compiled SCSS'))
.pipe(sourcemaps.write('.')) // finish src maps
.pipe(gulp.dest(scssDest));
};
var compileJs = function() {
gulp
.src(jsSrc) // get project.js
.pipe(plumber({ errorHandler: onError }))
.pipe(include({ hardFail: true })) // Hard fail on Errors please
.pipe(
babel({
compact: false,
presets: ['@babel/env'],
}),
)
.pipe(notify('Transpiled ES6'))
.pipe(sourcemaps.init()) // start src maps
.pipe(rename(jsDestName)) // minify the concat file
.pipe(uglify()) // minify
.on('error', function(err) {
gutil.log(gutil.colors.red('[Error]'), err.toString());
}) // Error reporting as needed
.pipe(notify('Compiled JS'))
.pipe(gulp.dest(jsDest))
.pipe(sourcemaps.write('.')) // finish src maps
.pipe(gulp.dest(jsDest));
};
/**
* Compress Images (jpeg, jpg, png, svg)
* @param {String} src - Source files
* @param {String} dist - Directory to output to
*/
var compressImages = function(src, dist) {
var extensions = 'png,jpg,jpeg,svg';
var imageQuality = 60;
src += '/**/*.{' + extensions + '}';
gulp
.src(src)
.pipe(changed(dist))
.pipe(
imagemin({
verbose: true,
svgoPlugins: [
{ cleanupIDs: false },
{ removeUselessDefs: false },
{ removeViewBox: true },
{ convertPathData: false },
{ margePaths: false },
{ removeXMLProcInst: false },
],
use: [pngQuant({ quality: imageQuality }), jpegOptim({ max: imageQuality })],
}),
)
.pipe(gulp.dest(dist));
};
// Lint Task
// note: really lame linting
gulp.task('lint', function() {
return gulp
.src(jsWatch)
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
// Concatenate Specified Scripts, Minify JS, Source Map JS
// Note: Sometimes the JS loading order matters, this is to keep control of that.
gulp.task('js', function() {
compileJs();
});
// Compile Sass, Generate Source Maps, Auto-Prefix, Minify CSS
gulp.task('scss', function() {
compileSass();
});
/**
* Task: smash
* @Desc: Compress Image Files (jpeg, jpg, png, svg)
*/
gulp.task('smash', function() {
compressImages(imageSrc, imageDest);
});
/**
* Task: Build
* @Desc: Compile JS/SCSS files
*/
gulp.task('build', function() {
// Compile Theme Js/Scss
compileSass();
compileJs();
compressImages();
});
// Watch Files For Changes
gulp.task('watch', function() {
//gulp.watch('assets/src/js/*.js', ['lint']);
gulp.watch(
[
jsSrcDir + '**/*.js', // Watch all the js files
jsSrc, // our main file
'!' + jsDest + '*.js', // DO NOT watch any minified files (this creates a loop)
jsSrcDir + 'tagular-events.js' // Additional
],
['js'],
);
gulp.watch(
[
scssSrcDir + '**/*.scss',
scssSrc
],
['scss']);
});
// Default Task
gulp.task('default', ['scss', 'js', 'watch']);
@treykane
Copy link
Author

Updated with a more modern workflow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment