Показать сообщение отдельно
  #2096 (permalink)  
Старый 06.04.2017, 11:38
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Всем привет!

1) Кто что использует на сайте для картинок < 10 kb. Таких картинок, скажем, 40 штук. Спрайт или base64 ?

2) Кто как ресолвит пути к картинкам в gulp(<4) для sass файлов? Понятно, что можно делать и вебпаком, но интересует именно такая ситуация. Пример, структура папок
Код:
/frontend
    /scss
        /header
            header.scss
            loader.gif
header.scss
.header {
    width: 300px;
    height: 300px;
    border: 1px solid red;
    margin: 0 auto;
    background: url('loader.gif') left center no-repeat;
}

Если использовать типа такого
return combiner(
        gulp.src('frontend/scss/**/*.scss', {base: 'frontend/scss'}),
        $.sass({
            outputStyle: !isDevelopment ? 'compressed' : 'nested'
        }),
        $.concat('main.css'),
        gulp.dest('public')
    )

то в public будет такая картина
Код:
/public
    /header
        loader.gif
    main.css
И путь до картинки в main.css не изменится на header/loader.gif.

Написал небольшое решение. Оно работает. Но может как-то проще можно?

const through2 = require('through2').obj;
const rework = require('rework');
const reworkUrl = require('rework-plugin-url');

function prependUrls(css, prepend) {
    return rework(css)
        .use(reworkUrl(function(url) {
            if (url.indexOf('data:') === 0) {
                return url;
            } else {
                const newUrl = prepend + url;
                return newUrl.replace('//', '/');
            }
        }))
        .toString();
}

gulp.task('...', function(){
    return combiner(
        gulp.src('frontend/scss/**/*.scss', {base: 'frontend/scss'}),
        $.sass({
            outputStyle: !isDevelopment ? 'compressed' : 'nested'
        }),
        through2(
            function (file, enc, cb) {
                const prepend = path.dirname(file.relative) + '/';
                const css = prependUrls(file.contents.toString(), prepend);
                file.contents = Buffer.from(css);
                cb(null, file);
            }
        ),
        $.concat('main.css'),
        gulp.dest('public')
    )
})
Ответить с цитированием