--- title: "Introduction to Gulp.js 12: Optimize CSS, JavaScript, Images and HTML" slug: gulp-tutorial-12-optimize-css-javascript-images-and-html author: Stefan Imhoff date: 2014-10-29 description: "The ultimate tutorial and guide for Gulp.js: How to optimize CSS, JavaScript, images, and HTML to speed up your website." cover: /assets/images/cover/gulp-12.webp tags: ["code"] series: gulp --- This is the 12th part of my series, _Introduction to Gulp.js_. Today I will write tasks to optimize the assets of my website: CSS, JavaScript, Images, and HTML. Every Kilobyte, which has to be loaded, will slow down the loading of my website. That’s why I will minimize all my CSS and JavaScript and run my images through an optimizer, to remove as many bytes as possible. I will also add a task for minimizing HTML, but I don’t use this task because the reduction is minimal. ## CSS First, I will write a task, which will optimize the CSS. Compass can minimize the CSS for production, but this Gulp.js task squeezed another 6 KB out of my files. I install the needed Gulp.js plugins: ```bash $ npm install --save-dev gulp-csso@2.0.0 gulp-size@2.0.0 ``` #### gulp/config.js ```javascript optimize: { css: { src: developmentAssets + '/css/*.css', dest: productionAssets + '/css/', options: {} } } ``` #### gulp/tasks/production/optimize-css.js ```javascript var gulp = require("gulp"); var csso = require("gulp-csso"); var size = require("gulp-size"); var config = require("../../config").optimize.css; /** * Copy and minimize CSS files */ gulp.task("optimize:css", function () { return gulp.src(config.src).pipe(csso(config.options)).pipe(gulp.dest(config.dest)).pipe(size()); }); ``` This task will copy the CSS files from the assets folder, minimize them, remove comments, output the size of the file, and copy them to the production assets folder. ## JavaScript Now the CSS is minimized, and the same has to be done to the JavaScript files. I use UglifyJS for this task. If you don’t like it, go ahead and use a Google Closure or YUI compressor Gulp.js task. ```bash $ npm install --save-dev gulp-uglify@1.0.1 ``` #### gulp/config.js ```javascript optimize: { css: { ... }, js: { src: developmentAssets + '/js/*.js', dest: productionAssets + '/js/', options: {} } } ``` #### gulp/tasks/production/optimize-js.js ```javascript var gulp = require("gulp"); var uglify = require("gulp-uglify"); var size = require("gulp-size"); var config = require("../../config").optimize.js; /** * Copy and minimize JS files */ gulp.task("optimize:js", function () { return gulp .src(config.src) .pipe(uglify(config.options)) .pipe(gulp.dest(config.dest)) .pipe(size()); }); ``` This task will take the JavaScript files, minimize and optimize them, put them in my production assets folder, and output the size. ## Images Next, I will work on the images. They need to be copied to the production assets folder and crunched (reduce the size). This may take a while, depending on the size and amount of your images, that’s why I optimize the images for production. To get a more detailed output in Gulp.js, you may add a flag to your command: `gulp publish --verbose`. It will list each individual image for the optimized task and how much it was compressed. I’ll need `gulp-imagemin` for my task, which can minify PNG, JPG, GIF, and SVG images: ```bash $ npm install --save-dev gulp-imagemin@2.3.0 ``` #### gulp/config.js ```javascript optimize: { css: { ... }, js: { ... }, images: { src: developmentAssets + '/images/**/*.{jpg,jpeg,png,gif}', dest: productionAssets + '/images/', options: { optimizationLevel: 3, progressive: true, interlaced: true } } } ``` #### gulp/tasks/production/optimize-images.js ```javascript var gulp = require("gulp"); var imagemin = require("gulp-imagemin"); var size = require("gulp-size"); var config = require("../../config").optimize.images; /** * Copy and minimize image files */ gulp.task("optimize:images", function () { return gulp .src(config.src) .pipe(imagemin(config.options)) .pipe(gulp.dest(config.dest)) .pipe(size()); }); ``` This task will take my images, optimize them, copy them to the assets folder, and output the size. ## HTML As said before, I wrote this task, and you can see how to do it, but I don’t use it because the reduction is minimal and not worth the messy markup. I like to keep it readable, so other people can learn from it. ```bash $ npm install --save-dev gulp-htmlmin@1.2.0 ``` #### gulp/config.js ```javascript optimize: { css: { ... }, js: { ... }, images: { ... }, html: { src: production + '/**/*.html', dest: production, options: { collapseWhitespace: true } } } ``` #### gulp/tasks/production/optimize-html.js ```javascript var gulp = require("gulp"); var htmlmin = require("gulp-htmlmin"); var config = require("../../config").optimize.html; /** * Minimize HTML */ gulp.task("optimize:html", function () { return gulp.src(config.src).pipe(htmlmin(config.options)).pipe(gulp.dest(config.dest)); }); ``` ## Conclusion This concludes the 12th part of my series _Introduction to Gulp.js_. Today we learned how to minimize CSS and JavaScript files and reduce the size of images.