Оригинальная статья Tencent DeepOcean:сделать pro.IO/Webpack-SPR…
предисловие
Сейчас, когда HTTP/2.0 не популярен, css-спрайт (карта спрайтов) по-прежнему является важной частью интерфейсной разработки С учетом популярности веб-приложений, что делать со спрайт-изображениями после переключения инструмента построения на веб-пакет?Цель
Давайте поговорим о том, чего мы хотим достичь в первую очередь.1. Иконки спрайтов, которые нужно синтезировать, единообразно помещаются в папку src/assets/sprite
2. В src/img будет сгенерировано изображение спрайта, названное именем каталога верхнего уровня, например, значки, используемые в папке значков, объединены в icon.png
3. Изображения спрайтов расположены сверху вниз, а каждый значок расположен на расстоянии 20 пикселей друг от друга, как показано на рисунке.
4. Пишите в sass и сливайте по мере необходимости.
5. Стиль, полученный после компиляции, выглядит следующим образом, в том числе ширина и высота также выводятся вместе
Общие решения
На данный момент есть два основных решенияОдин из них представляет собой плагин, представленный webpack-spritesmith и postcss-sprites.Основной режим работы webpack-spritesmith заключается в предварительной сборке иконок в каталоге спрайтов, а страница в основном зависит от сгенерированного изображения Sprite. Postcss-sprites анализирует сгенерированный файл CSS, собирает фон или фоновое изображение в качестве зависимости, объединяет его в изображение спрайта, а затем заменяет соответствующие параметры.
Второй - метод обработки загрузчиком, но хорошего решения в интернете в принципе нет, например вот этого
Этот способ идентификации по аннотации не очень хорош.
В настоящее время ни одно из представленных на рынке решений не может удовлетворить наши индивидуальные требования.По сравнению с методом обработки определенной папки/файла мы предпочитаем использовать для этого метод обработки цепочки загрузчика.
решение
Если используется загрузчик, его можно только проинформировать о том, что его необходимо синтезировать, добавив отметку, например, добавив «?_sprite» к фоновому URL-адресу, а затем используя обычный метод для получения пути изображения и предоставления его соответствующему библиотека для синтеза.Для разработки здесь в основном используется проект с открытым исходным кодом spritesmith.Spritesmith очень мощный.Он может гибко синтезировать изображения спрайтов и получать актуальную информацию об иконке через соответствующий API.
Где sprites — это путь к изображению, которое необходимо синтезировать, который содержит абсолютный путь к значку.
Spritesmith.run({src: sprites,algorithm:'top-down',padding: 20}, function handleResult (err, result) {
if(err) {
throw err;
}
});
Spritesmith.run({src: sprites,algorithm:'top-down',padding: 20}, function handleResult (err, result) {
if(err) {
throw err;
}
});
Используя эту информацию, мы можем повторно обработать возвращенный стиль, чтобы он соответствовал требованиям к стилю, указанным в пункте 5 выше.
let imageW = image.width;
let imageH = image.height;
if(mobile){
imageW = imageW/2;
imageH = imageH/2;
}
let imgWidth = 'width:' + imageW + 'px;';
let imgHeight = 'height:' + imageH + 'px;';
if(i < afterContent.length) {
if(afterContent[i] == ';') {
end = i + 1;
afterContent = afterContent.substring(0, end) + backgroundSize+ imgWidth+ '\n' + imgHeight + afterContent.substring(end);
} else {
end = i;
afterContent = afterContent.substring(0, end) + ';\n' + backgroundSize +imgWidth+ '\n' + imgHeight+ afterContent.substring(end);
}
}
let imagePosX = image.x;
let imagePosY = image.y;
if(mobile){
imagePosX = imagePosX/2;
imagePosY = imagePosY/2;
}
let imageX = image.x == 0 ? ' 0' : ' -' + imagePosX + 'px';
let imageY = image.y == 0 ? ' 0' : ' -' + imagePosY + 'px';
let imagePosition = '';
if(image.x || image.y){
imagePosition = imageX + imageY;
}
let cssVal = 'url("' + spriteRelativePath + '")' + imagePosition;
module:{
rules:[
{
test:/\.(scss|css)$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
publicPath: '../../',
use: [{
loader:'css-loader'
},{
loader:'isprite-loader',
options:{
outputPath:'./src/assets/img/',
mobile:true
}
},{
loader:'sass-loader'
}],
})
},
]
}
наконец
Ожидаемый эффект здесь в основном достигнут, но есть еще некоторые проблемы, которые не были решены, например, изображение Sprite будет генерироваться каждый раз, что будет иметь определенное влияние на скорость компиляции. можно использовать хэш-значение для сравнения.Если в файле нет изменений, он не будет обработан.У каждого бизнеса разные сценарии спроса, этот метод не обязательно применим к другим проектам, надеюсь, он будет полезен всем.
Прикрепить демо
GitHub.com/KL производство-что/есть…