Grunt + Jekyll + LESS
Revamped my website with a new design, integrating LESS with Jekyll via Grunt for a more efficient and automated workflow.
As you may have noticed, the website looks different to how it was previously. I decided it was time for a refresh and I wanted to make the design a little more interesting.
While Jekyll & Github pages use SASS the Bootstrap theme I settled for uses LESS. This meant that I needed to compile all of my CSS outside of Jekyll. Most of the articles I found say use either Gulp or Grunt, looking at the syntax of the two I preferred Grunt as it didn’t look like code.
Installation was straight forward enough;
brew install nodenpm install -g grunt-cliSo now what? I needed something which would do the following …
- Compile the LESS files
- Combine all of the CSS files into one
- Minify the resulting CSS files
- Run Jekyll to build the files
After a lot of trial and error I managed to get all of the above plus the ability to have the browser automatically refresh when I change a file, which was nice :smile:
You can see what happens when I run grunt server or grunt css in the following asciicast ….
My configuration currently looks like ….
packages.json
{ “name”: “mediaglasses”, “version”: “0.0.1”, “description”: “The Media Glasses Jekyll site”, “author”: “Russ McKendrick <russ@mckendrick.io>”, “homepage”: “http://media-glass.es/", “license”: “”, “devDependencies”: { “grunt”: “~0.4.5”, “grunt-contrib-concat”: “*”, “grunt-contrib-cssmin” : “*”, “grunt-contrib-watch” : “*”, “grunt-contrib-less”: “*”, “grunt-jekyll”: “*”, “grunt-contrib-connect”: “*”, “load-grunt-tasks”: “*” }}Gruntfile.js
module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON(‘package.json’),
less: { development: { options: { compress: true, yuicompress: true, optimization: 2 }, files: { “_css/main.css”: “_less/main.less” } } }, concat: { css: { src: [ ‘_css/*’ ], dest: ‘css/main.css’ } }, cssmin: { css: { src: ‘css/main.css’, dest: ‘css/main.min.css’ } }, jekyll: { options: { src: ‘.’ }, dist: { options: { dest: ‘./_site’, config: ‘_config-dev.yml’ } } }, watch: { options: { livereload: true, }, css: { files: [‘_css/*’, ‘_less/*’], tasks: [‘less’, ‘concat:css’, ‘cssmin:css’] }, html: { files: [‘*.html’, ‘_includes/*.html’, ‘_layouts/*.html’, ‘_posts/*’], tasks: [‘jekyll’], options: { spawn: false, } } }, connect: { server: { options: { port: 8000, base: ‘./_site’ } } },
});require(‘load-grunt-tasks’)(grunt);grunt.registerTask(‘default’, [‘less’, ‘concat:css’, ‘cssmin:css’, ‘jekyll’]);grunt.registerTask(‘css’, [‘less’, ‘concat:css’, ‘cssmin:css’]);grunt.registerTask(‘server’, [‘connect’, ‘watch’]);};The following posts helped me get to where I am at the moment;
- Jekyll & Grunt setup
- Using Jekyll with Grunt.js (and much more)
- grunt-contrib-watch with LiveReload not working
I plan on adding a few more options to optimise the images and also compile the Javascript into something a little more discrete, eventually you can read it here.
Related terms: AgentAgent SkillsAI Coding AssistantApplication Programming InterfaceClaude CodeCodex
Keep reading
Comments


