基于nodejs的雪碧图制作工具的示例代码


Posted in NodeJs onNovember 05, 2018

前颜(yan)

雪碧图(CSS sprite ),就是把很多小图标合并为一张图片。

在Web开发中,使用雪碧图是优化Web性能的一种方法。

比如你可能遇到过这样的一种场景:在你的页面中,使用到了很多的小图标,然后你的每个小图标都是通过 <img src='logo.png'>来引用的。

通过这种方式虽然比较方便,但是存在的一个缺点就是性能问题,即浏览器在解析每个小图标时,都要发起一次http或(https)请求,而这个小图标本身却很小,可能只有十几k甚至几k,那么为每个小图标单独发起http请求,其实有点资源浪费。

为什么会资源浪费呢?

浏览器在与服务器进行http请求的过程中,需要有一个类似握手通信的过程,然后才是真正的获取数据。

举个例子,在这里我把浏览器发起的http图片请求简单分为两个过程,分别为:

1、浏览器与服务器的通信握手过程,假设耗时X ms(毫秒)

2、真正的数据获取过程,假设耗时 Y ms(毫秒)

那么浏览器发起一次http请求的总耗时为:sum(1)=X+Y ms,由于小图标数据很小,可能只有几k,因此通信过程的耗时X是大于Y的。

而当你在网页中引用了很多小图标时,假设有n个小图标,此时总耗时为sum(n)=nX+nY ms,通过对比sum(1)和sum(n),你就会发现,上面所说的资源浪费主要是在于通信握手的时间Y。此时,我就会想,如果我一次性取得所有的小图标,那么总耗时就变成了sum(n)=nX+Y ms,这样就能节省(n-1)Y的http握手通信的时间开销,从而优化了web的响应性能。

一、雪碧图抠图(background-position)

通过前面的介绍,我们知道,雪碧图的原理就是将页面中使用到的小图标合成为一张总图。这样的话当我们想要使用雪碧图中的某一个小图标,应该通过如何实现呢?

答案是通过css的background-position,background-position的默认坐标是(0,0),关于background-position的详细使用,大家可以网上搜索一下,资料很多。(这次主要讲雪碧图制作工具)

二、雪碧图制作工具 simple-sprite

那么如何合成雪碧图呢?怎样才能更方便的合成雪碧图呢?

因为懒,我的想法是,每次当我需要合成雪碧图时,我只要经过以下尽量简单的步骤就可以快速合成,并且可以导出各个小图标在雪碧图中的background-position css样式。为此,我用nodejs写了一个雪碧图制作工具:simple-sprite,并打包生成npm包发布至npm官网。

雪碧图制作步骤如下:

1 创建雪碧图生成工程

mkdir sprite-generator
cd sprite-generator

2 初始化工程

npm init

3 把所有小图标放到imgs中

mkdir imgs && 把所有的小图标放到imgs中

4 下载simple-sprite npm包

npm install --save simple-sprite

5 运行生成雪碧图

let sprite = require('simple-sprite');

sprite.generateSprite('./imgs');

simple-sprite:https://www.npmjs.com/package/simple-sprite

三、github源码

构建工具:rollup

github源码:https://github.com/SimpleCodeCX/simple-sprite#readme

(如果你点开了我的github源码连接,顺便也帮我点个star哦!哈哈)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
浅谈NodeJS中require路径问题
May 07 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
nodeJs内存泄漏问题详解
Sep 05 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 NodeJs
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
Nov 01 #NodeJs
nodejs中函数的调用实例详解
Oct 31 #NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 #NodeJs
Nodejs实现多文件夹文件同步
Oct 17 #NodeJs
深入理解NodeJS 多进程和集群
Oct 17 #NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 #NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 #NodeJs
You might like
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
js数组去重的常用方法总结
2014/01/24 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
简单的python后台管理程序
2017/04/13 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Django配置文件代码说明
2019/12/04 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
python 装饰器的使用示例
2020/10/10 Python
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
三项教育活动实施方案
2014/03/30 职场文书
组织鉴定材料
2014/06/02 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
java中如何截取字符串最后一位
2022/07/07 Java/Android