Оригинальная статья 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 производство-что/есть…