Skip to content

Instantly share code, notes, and snippets.

@danemacaulay
Last active February 24, 2017 17:15
Show Gist options
  • Save danemacaulay/2e57647685c5ed2d8906f18e729709b2 to your computer and use it in GitHub Desktop.
Save danemacaulay/2e57647685c5ed2d8906f18e729709b2 to your computer and use it in GitHub Desktop.
custom less plugin. instead of compiling each less file and concatenating, first concatenate and then compile. much faster.
'use stric';
var fs = require('fs');
var less = require('less');
var path = require('path');
var async = require('async');
var _ = require('lodash');
function readLessFilesIntoString(lessFiles, callback) {
var initialText = '';
async.reduce(lessFiles, initialText, function(memo, item, cb){
fs.readFile(item, 'utf8', function (error, data) {
if (error) throw error;
cb(null, memo + data);
});
}, function(err, lessFilesContents){
callback(null, lessFilesContents);
});
}
function runLess(lessInput, options, callback) {
less.render(lessInput, options).then(function (output) {
callback(null, output.css);
}).catch(function (error) {
console.log(error);
});
}
function addToAssets(compilation, css, outputFile, callback) {
compilation.assets[outputFile] = {
source: function() {
return css;
},
size: function() {
return css.length;
}
};
callback();
}
function LessPlugin(lessOptions, outputFile) {
this.lessOptions = lessOptions;
this.outputFile = outputFile;
}
LessPlugin.prototype.apply = function(compiler) {
var lessOptions = this.lessOptions;
var outputFile = this.outputFile;
compiler.plugin('emit', function(compilation, callback) {
var lessFiles = [];
var appChunk = compilation.chunks.filter(function (chunk) {
return chunk.name === 'app';
}).pop();
appChunk.modules.forEach(function(module) {
module.fileDependencies = module.fileDependencies || [];
module.fileDependencies.forEach(function(filepath) {
if (/\.less$/.test(filepath)) {
lessFiles.push(filepath);
}
});
});
async.waterfall([
function (cb) {
readLessFilesIntoString(lessFiles, cb);
},
function (lessContent, cb) {
runLess(lessContent, lessOptions, cb);
},
function (cssContent, cb) {
addToAssets(compilation, cssContent, outputFile, cb);
}
], function () {
callback();
});
});
};
module.exports = LessPlugin;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment