Inlining images with gulp-sass
Compass witch I use to use for SCSS-based project provides count of useful functions like inline-image
. I found those are really missing when switched to gulp-sass
(internally using node-sass
) for pre-processing stylesheets.
Luckily there is the way to write custom functions to add missing functionality.
Following example illustrates the idea
SCSS source:
.my-class {
background: #{inline-image('src/images/transparent.png')};
}
Which would be compiled into:
.my-class {
background: url(data:image/png;base64,iVBORw0KG...);
}
And here is the Gulp magic
/* ----- inline-image(pathToFile) ----- */
function sassFunctions(options) {
options = options || {};
options.base = options.base || process.cwd();
var fs = require('fs');
var path = require('path');
var types = require('node-sass').types;
var funcs = {};
funcs['inline-image($file)'] = function(file, done) {
var file = path.resolve(options.base, file.getValue());
var ext = file.split('.').pop();
fs.readFile(file, function(err, data) {
if (err) return done(err);
data = new Buffer(data);
data = data.toString('base64');
data = 'url(data:image/' + ext + ';base64,' + data +')';
data = types.String(data);
done(data);
});
};
return funcs;
}
/* ----- Gulp task ----- */
return gulp.src([
'stylesheets/**/*.scss',
'!src/styles/**/_*.scss'
])
.pipe(sass({
outputStyle: argv.optimize ? 'compressed' : 'nested',
functions: sassFunctions()
}))
.pipe(gulp.dest('css/'));
});
Written by Sergii Iavorskyi
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Sass
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#