Last active
February 24, 2017 17:15
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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