gulpfile.js
const { src, dest, task, watch, series, parallel } = require('gulp');
const del = require('del'); //For Cleaning build/dist for fresh export
const options = require("./config"); //paths and other options from config.js
const browserSync = require('browser-sync').create();
const sass = require('gulp-sass'); //For Compiling SASS files
const postcss = require('gulp-postcss'); //For Compiling tailwind utilities with tailwind config
const concat = require('gulp-concat'); //For Concatinating js,css files
const uglify = require('gulp-terser');//To Minify JS files
const imagemin = require('gulp-imagemin'); //To Optimize Images
const cleanCSS = require('gulp-clean-css');//To Minify CSS files
const purgecss = require('gulp-purgecss');// Remove Unused CSS from Styles
//Note : Webp still not supported in major browsers including forefox
//const webp = require('gulp-webp'); //For converting images to WebP format
//const replace = require('gulp-replace'); //For Replacing img formats to webp in html
const logSymbols = require('log-symbols'); //For Symbolic Console logs :) :P
//Load Previews on Browser on dev
function livePreview(done){
browserSync.init({
server: {
baseDir: options.paths.dist.base
},
port: options.config.port || 5000
});
done();
}
// Triggers Browser reload
function previewReload(done){
console.log("\n\t" + logSymbols.info,"Reloading Browser Preview.\n");
browserSync.reload();
done();
}
//Development Tasks
function devHTML(){
return src(`${options.paths.src.base}/**/*.html`).pipe(dest(options.paths.dist.base));
}
function devStyles(){
const tailwindcss = require('tailwindcss');
return src(`${options.paths.src.css}/**/*.scss`).pipe(sass().on('error', sass.logError))
.pipe(dest(options.paths.src.css))
.pipe(postcss([
tailwindcss(options.config.tailwindjs),
require('autoprefixer'),
]))
.pipe(concat({ path: 'style.css'}))
.pipe(dest(options.paths.dist.css));
}
function devScripts(){
return src([
`${options.paths.src.js}/libs/**/*.js`,
`${options.paths.src.js}/**/*.js`,
`!${options.paths.src.js}/**/external/*`
]).pipe(concat({ path: 'scripts.js'})).pipe(dest(options.paths.dist.js));
}
function devImages(){
return src(`${options.paths.src.img}/**/*`).pipe(dest(options.paths.dist.img));
}
function watchFiles(){
watch(`${options.paths.src.base}/**/*.html`,series(devHTML, devStyles, previewReload));
watch([options.config.tailwindjs, `${options.paths.src.css}/**/*.scss`],series(devStyles, previewReload));
watch(`${options.paths.src.js}/**/*.js`,series(devScripts, previewReload));
watch(`${options.paths.src.img}/**/*`,series(devImages, previewReload));
console.log("\n\t" + logSymbols.info,"Watching for Changes..\n");
}
function devClean(){
console.log("\n\t" + logSymbols.info,"Cleaning dist folder for fresh start.\n");
return del([options.paths.dist.base]);
}
//Production Tasks (Optimized Build for Live/Production Sites)
function prodHTML(){
return src(`${options.paths.src.base}/**/*.html`).pipe(dest(options.paths.build.base));
}
function prodStyles(){
return src(`${options.paths.dist.css}/**/*`)
.pipe(purgecss({
content: ['src/**/*.{html,js}'],
defaultExtractor: content => {
const broadMatches = content.match(/[^<>"'`\s]*[^<>"'`\s:]/g) || []
const innerMatches = content.match(/[^<>"'`\s.()]*[^<>"'`\s.():]/g) || []
return broadMatches.concat(innerMatches)
}
}))
.pipe(cleanCSS({compatibility: 'ie8'}))
.pipe(dest(options.paths.build.css));
}
function prodScripts(){
return src([
`${options.paths.src.js}/libs/**/*.js`,
`${options.paths.src.js}/**/*.js`
])
.pipe(concat({ path: 'scripts.js'}))
.pipe(uglify())
.pipe(dest(options.paths.build.js));
}
function prodImages(){
return src(options.paths.src.img + '/**/*').pipe(imagemin()).pipe(dest(options.paths.build.img));
}
function prodClean(){
console.log("\n\t" + logSymbols.info,"Cleaning build folder for fresh start.\n");
return del([options.paths.build.base]);
}
function buildFinish(done){
console.log("\n\t" + logSymbols.info,`Production build is complete. Files are located at ${options.paths.build.base}\n`);
done();
}
exports.default = series(
devClean, // Clean Dist Folder
parallel(devStyles, devScripts, devImages, devHTML), //Run All tasks in parallel
livePreview, // Live Preview Build
watchFiles // Watch for Live Changes
);
exports.prod = series(
prodClean, // Clean Build Folder
parallel(prodStyles, prodScripts, prodImages, prodHTML), //Run All tasks in parallel
buildFinish
);
package.json
{
"name": "gulp-with-tailwindcss",
"version": "1.2.0",
"description": "TailwindCSS StarterKit with Gulp 4",
"main": "gulpfile.js",
"dependencies": {
"node-sass": "^5.0.0",
"postcss": "^8.2.9",
"tailwindcss": "^2.1.1"
},
"devDependencies": {
"autoprefixer": "^10.2.5",
"browser-sync": "^2.26.14",
"del": "^6.0.0",
"gulp": "^4.0.2",
"gulp-clean-css": "^4.3.0",
"gulp-concat": "^2.6.1",
"gulp-imagemin": "^7.1.0",
"gulp-postcss": "^9.0.0",
"gulp-purgecss": "^3.1.3",
"gulp-replace": "^1.0.0",
"gulp-sass": "^4.1.0",
"gulp-terser": "^2.0.1",
"log-symbols": "^4.1.0"
},
"scripts": {
"dev": "gulp",
"build": "gulp prod",
"prod": "gulp prod"
}
}

Comments | NOTHING