A bússola que uso para projetos baseados em SCSS fornece contagem de funções úteis como inline-image
. Descobri que esses estão realmente faltando quando alternado para gulp-sass
(usando internamente node-sass
) para folhas de estilo de pré-processamento.
Felizmente, existe uma maneira de escrever funções personalizadas para adicionar funcionalidades ausentes.
O exemplo a seguir ilustra a ideia
Fonte SCSS:
.my-class {
background: #{inline-image('src/images/transparent.png')};
}
Que seria compilado em:
.my-class {
background: url(data:image/png;base64,iVBORw0KG...);
}
E aqui está a magia do Gulp
/* ----- 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/'));
});