说明

玩转 webpack 学习笔记

支持的语法

对样式里面图片引用后面加 __sprite 进行图片合并

如何将两张图片合成一张图片?

使用 spritesmith

https://github.com/twolfson/spritesmith

spritesmith 使用示例

const sprites = ['./images/1.jpg', './images/2.jpg'];
Spritesmith.run({ src: sprites }, function handleResult(err, result) {result.image;result.coordinates;result.properties;
});

实战开发

1、新建初始化项目

新建文件夹 sprite-loader,然后执行下面命令初始化项目

npm init -y

2、添加图片资源

我们在 src 的 img 文件夹里添加 3 张图片

3、安装依赖

npm i spritesmith

4、测试合成雪碧图的代码

新建 test.js 文件

const Spritesmith = require('spritesmith');const sprites = ['./src/img/kaimo-001.png','./src/img/kaimo-002.jpg','./src/img/kaimo-003.png'
];// 生成精灵表
Spritesmith.run({src: sprites
}, function handleResult(err, result) {// 如果有错误,抛出它if (err) {throw err;}console.log("result---->", result)
});

我们执行 node test.js

如果你报 Invalid file signature 错,可以参考我这篇文章:使用 spritesmith 报错 Error: Invalid file signature

然后我们输出到磁盘

const Spritesmith = require('spritesmith');
const fs = require('fs');
const path = require('path');const sprites = ['./src/img/kaimo-001.png','./src/img/kaimo-002.jpg','./src/img/kaimo-003.png'
];// 生成精灵表
Spritesmith.run({src: sprites
}, function handleResult(err, result) {// 如果有错误,抛出它if (err) {throw err;}console.log("result---->", result)// 输出图片fs.mkdir('./dist', { recursive: true }, function(err) {if (err) throw err;console.log("目录创建成功");// 使用 fs.writeFileSync 将数据同步写入文件fs.writeFileSync(path.join(__dirname + '/dist/sprite.png'), result.image);console.log("输出图片完毕");});
});

然后执行 node test.js


然后可以看到 dist 目录生成了一个 sprite.png 图片

5、编写 sprite-loader

实现需要安装 loader-runner

npm i loader-runner

安装好之后添加 run-loader.js 文件

const fs = require("fs");
const path = require("path");
const { runLoaders } = require("loader-runner");runLoaders({resource: "./loaders/index.css",loaders: [path.resolve(__dirname, "./loaders/sprite-loader.js")],context: {minimize: true},readResource: fs.readFile.bind(fs),},(err, result) => {err ? console.error(err) : console.log(result)}
);

然后在 loaders 文件夹添加图片跟 css 文件

.kaimo-bg-1 {background: url(./img/kaimo-001.png?__sprite);
}
.kaimo-bg-2 {background: url(./img/kaimo-002.jpg?__sprite);
}
.kaimo-bg-3 {background: url(./img/kaimo-003.png);
}

最后在 loaders 文件里添加 sprite-loader.js 文件

const Spritesmith = require('spritesmith');
const fs = require('fs');
const path = require('path');module.exports = function(source) {const callback = this.async();console.log("source---->", source)// 配置所有需要合图的const imgs = source.match(/url\((\S*)\?__sprite/g);console.log("imgs-->", imgs)const sprites = [];// 遍历生成需要合图的图片路径for(let i = 0; i < imgs.length; i++) {const img = imgs[i].match(/url\((\S*)\?__sprite/)[1];console.log('img---->', img)sprites.push(path.join(__dirname, img));}console.log("sprites---->", sprites)// 生成精灵表Spritesmith.run({src: sprites}, function handleResult(err, result) {// 如果有错误,抛出它if (err) {throw err;}console.log("result---->", result)// 输出图片到 dist 文件夹fs.mkdir(path.join(process.cwd() + '/dist'), { recursive: true }, function(err) {if (err) throw err;console.log("目录创建成功");// 使用 fs.writeFileSync 将数据同步写入文件fs.writeFileSync(path.join(process.cwd(), 'dist/sprite.jpg'), result.image);console.log("图片输出完毕");// 然后替换 css 里的图片路径为雪碧图的路径source = source.replace(/url\((\S*)\?__sprite/g, (match) => {return `url("dist/sprite.jpg"`;})callback(null, source);fs.writeFileSync(path.join(process.cwd(), 'dist/index.css'), source);console.log("样式替换完毕");});});
}

6、测试 sprite-loader.js 效果

运行命令 node run-loader.js,输出如下



然后我们查看一下 dist 目录,我们发现加了 __sprite 的样式被替换了


并且输出的 sprite.jpg 图片也是,只合成了加了的

webpack原理篇(六十二):实战开发一个自动合成雪碧图的loader相关推荐

  1. 前端开发工具介绍----合成雪碧图工具(css sprite)

    合成雪碧图Sprite工具 1.国外的在线合成工具:http://csssprites.com/ 选择需要合并的文件----设置option选项(包括:元素的间距,排列方式,背景颜色,边框)----- ...

  2. webpack雪碧图生成

    原文链接:http://dopro.io/webpack-sprites.html 前言 在HTTP/2.0还没有普及的现在,css sprite(雪碧图)仍是前端工程化中必备的一环,而随着webpa ...

  3. html雪碧图怎么设置,HTML 5开发的在线雪碧图片合成工具

    Css Sprite,有时也称为雪碧图.精灵图,是每一个前端开都会遇到的问题,也是常见的小图片加载优化手段.相信各位同学都清楚其原理,具体就不赘述了. 之前一直有动机利用html5实现一个合成雪碧图的 ...

  4. 【正点原子Linux连载】第六十二章 Linux SPI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  5. 【正点原子STM32连载】 第六十二章 UCOSII实验2-信号量和邮箱 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  6. SAP UI5 应用开发教程之三十二 - 如何创建一个自定义 SAP UI5 控件试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  7. linux i2c adapter 增加设备_「正点原子Linux连载」第六十二章Linux SPI驱动实验(一)...

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南>关注官方微信号公众号,获取更多资料:正点原子 第六十二章Linux SPI驱动实验 上一 ...

  8. 面渣逆袭:三万字,七十图,详解计算机网络六十二问(收藏版)

    大家好,我是老三,开工大吉,虎年第一篇,面渣逆袭系列继续! 这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 建议大家收藏了慢慢看,新的一年一定能够跳槽加薪,虎年& ...

  9. 面渣逆袭:计算机网络六十二问,三万字图文详解!速收藏!

    这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 基础 1.说下计算机网络体系结构 计算机网络体系结构,一般有三种:OSI 七层模型.TCP/IP 四层模型.五层结 ...

最新文章

  1. php 导航高亮,zblogphp导航高亮代码分享教程
  2. [VC++入门]指针一
  3. 《需求工程——软件建模与分析》读后感之三
  4. asp.net 发送邮件
  5. java 匿名类 实现接口_细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】...
  6. x11转发:通过ssh远程使用GUI程序
  7. python大作业数独_python做一个数独小游戏
  8. 协助你写 Python,只是 AI 取代程序员的第一步
  9. 我第一次面试自动化测试就被diss了,人生惨遭滑铁卢…
  10. VGG-16网络结构
  11. pkusc2016滚粗记
  12. 转置卷积详解(原理+实验)
  13. python爬虫-20行代码爬取王者荣耀所有英雄图片,小白也轻轻松松
  14. SQL Server数据库-存储过程(第一讲)
  15. 正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板
  16. 王兴是怎么看待共享单车这块业务的
  17. 中国天气雷达行业市场供需与战略研究报告
  18. 博士申请 | 香港大学倪卓娴教授招收物联网与机器学习方向全奖博士生
  19. Mysql systemctl start mysqld报错的问题解决
  20. 线上直播丨植物收样手册免费送?速来直播间!

热门文章

  1. sqoop从orc文件到oracle,Sqoop import as OrC file
  2. 云服务器Ecs镜像迁移到新服务器
  3. 跨时钟域同步1---亚稳态的产生和解决方案
  4. Linux内核基础篇——常用调试技巧汇总
  5. Excel中如何获取汉字拼音首字母
  6. 输入三个数a、b、c分别作为三边的边长构成三角形。通过程序判定所构成的三角形是一般三角形、等腰三角形还是等边三角形。
  7. SH103A型全自动微量水分测定仪
  8. 计算机视觉技术的基础知识,计算机视觉及导航技术基础.pdf
  9. ife2015spring-task0001笔记总结
  10. Rewired.GG进行欧洲迄今规模最大的电竞团队投资