Base64编码

什么是Base64编码

我们所看到的网页上的每一个图片,都是需要消耗一个 http 请求下载而来的,不管如何,图片的下载始终都要向服务器发出请求,要是图片的下载不用向服务器发出请求,而可以随着 HTML 的下载同时下载到本地那就太好了,而 base64 正好能解决这个问题。 图片的 base64 编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址。

如图所示:google搜索框右侧的搜索小图标使用的就是base64编码


在css里的写法:

#fkbx-spch, #fkbx-hspch {background: url(data:image/gif;base64,R0lGODlhHAAmAKIHAKqqqsvLy0hISObm5vf394uLiwAAAP///yH5B…EoqQqJKAIBaQOVKHAXr3t7txgBjboSvB8EpLoFZywOAo3LFE5lYs/QW9LT1TRk1V7S2xYJADs=) no-repeat center;
}

在html代码img标签里的写法:

<img src="data:image/gif;base64,R0lGODlhHAAmAKIHAKqqqsvLy0hISObm5vf394uLiwAAAP///yH5B…EoqQqJKAIBaQOVKHAXr3t7txgBjboSvB8EpLoFZywOAo3LFE5lYs/QW9LT1TRk1V7S2xYJADs=">

为什么要是用Base64编码?

图片的 base64 编码可以算是前端优化的一环。效益虽小,但却缺能积少成多。

说到这里,不得不提的是 CssSprites 技术,后者也是为了减少 http 请求,而将页面中许多细小的图片合并为一张大图。那么图片的 base64 编码和 CssSprites 有什么异同,又该如何取舍呢?

所以,在这里要明确使用 base64 的一个前提,那就是被 base64 编码的图片足够尺寸小。以CSDN的 logo 为例:


如图所示,CSDN的 Logo 只有 3.27KB,已经很小了,但是如果将其制作转化成 base64 编码,生成的 base64 字符串编码足足有 4406 个,也就是说,图片被编码之后,生成的字符串编码大小一般而言都会比原文件稍大一些。即便 base64 编码能够被 gzip 压缩,压缩率能达到 50% 以上,想象一下,一个元素的 css 样式编写居然超过了 2000个 字符,那对 css 整体的可读性将会造成十分大的影响,代码的冗余使得在此使用 base64 编码将得不偿失。
如果图片足够小且因为用处的特殊性无法被制作成雪碧图(CssSprites),在整个网站的复用性很高且基本不会被更新。

那么此时使用 base64 编码传输图片就可谓好钢用在刀刃上,思前想后,符合这个规则的,有一个是我们经常会遇到的,就是页面的背景图 background-image 。在很多地方,我们会制作一个很小的图片大概是几px * 几px,然后平铺它页面当背景图。因为是背景图的缘故,所以无法将它放入雪碧图,而它却存在网站的很多页面,这种图片往往只有几十字节,却需要一个 http 请求,十分不值得。那么此时将它转化为 base64 编码,恰到好处。
只有 50 字节的2*2的的背景图。将其转化成 base64 编码,只有 100 多个字符,相比一个 http 请求,这种转换无疑更值得推崇。

CssSprites与Base64编码

使用CssSprites合并为一张大图:

  • 页面具有多种风格,需要换肤功能,可使用CssSprites
  • 网站已经趋于完美,不会再三天两头的改动(例如button大小、颜色等)
  • 使用时无需重复图形内容
  • 没有 Base64 编码成本,降低图片更新的维护难度。(但注意 Sprites 同时修改 css 和图片某些时候可能造成负担)
  • 不会增加 CSS 文件体积

使用base64直接把图片编码成字符串写入CSS文件:

  • 无额外请求
  • 对于极小或者极简单图片
  • 可像单独图片一样使用,比如背景图片重复使用等
  • 没有跨域问题,无需考虑缓存、文件头或者cookies问题

更便捷的将图片转化为Base64编码

利用 Chrome 浏览器。在 chrome 下新建一个窗口,然后把要转化的图片直接拖入浏览器,打开控制台,点 Source,如下图所示,点击图片,右侧就会显示该图片的 base64 编码,是不是很方便。

一些误区

1. 使用 Base64 不代表性能优化

使用 Base64 的好处是能够减少一个图片的 HTTP 请求,然而,与之同时付出的代价则是 CSS 文件体积的增大。

而 CSS 文件体积的增大意味着什么呢?意味着 CRP 的阻塞。

CRP(Critical Rendering Path,关键渲染路径):当浏览器从服务器接收到一个HTML页面的请求时,到屏幕上渲染出来要经过很多个步骤。浏览器完成这一系列的运行,或者说渲染出来我们常常称之为“关键渲染路径”。

通俗而言,就是图片不会导致关键渲染路径的阻塞,而转化为 Base64 的图片大大增加了 CSS 文件的体积,CSS 文件的体积直接影响渲染,导致用户会长时间注视空白屏幕。HTML 和 CSS 会阻塞渲染,而图片不会。

2. 页面解析 CSS 生成的 CSSOM 时间增加

Base64 跟 CSS 混在一起,大大增加了浏览器需要解析CSS树的耗时。
CSSOM 生成过程大致是,解析 HTML ,在文档的 head 部分遇到了一个 link 标记,该标记引用一个外部 CSS 样式表,下载该样式表后根据上述过程生成 CSSOM 树。
CSSOM 阻止任何东西渲染,(意味着在CSS没处理好之前所有东西都不会展示),而如果CSS文件中混入了Base64,那么(因为文件体积的大幅增长)解析时间会增长到十倍以上。

前端Base64编码相关推荐

  1. 前端Base64编码知识,一文打尽

    原文: https://juejin.cn/post/6989391487200919566 作者: 云的世界 掘金专栏: 前端基础进阶 健康满分 关注并将「趣谈前端」设为星标 每天定时分享技术干货/ ...

  2. python兼容js base64_前端base64编码的坑

    故事背景: 前后端每次通讯的时候,需要验证sign,这个sign经过了b64_md5两步骤操作. 在python端,生成sign的代码如下: import md5 import base64 m = ...

  3. 一文打尽前端 Base64 编码知识

    关注公众号 前端开发博客,回复"加群" 加入我们一起学习,天天进步 前言 本文收录在 前端基础进阶[1] 专栏,欢迎关注和收藏, 往期经典: [干货]私藏的这些高级工具函数,你拥有 ...

  4. 前端Base64编码(兼容IE8)

    前端Base64编码数据(加密和解密) 谷歌:base64.js /** base64.js** Licensed under the BSD 3-Clause License.* http://op ...

  5. 前端DES加密、base64编码,后端DES解密、base64解码

    项目场景: 在系统开发的过程中有的时候,我们为了数据的安全性会把前端的数据进行加密,然后再在后端程序中对加密数据进行解密或解密,今天我们就在这里说2种简单的方法(DES加密.base64编码) 具体实 ...

  6. Java中使用Base64进行编码解码的工具类-将验证码图片使用Base64编码并返回给前端

    场景 前端使用Vue,验证码图片的src属性来自于后台SpringBoot接口. 后台验证码接口生成验证码图片并将其使用Base64进行编码. 前端就可以直接使用 data:image/png;bas ...

  7. 【前端】【labelme】labelme 保存 imageData 的 base64编码机制 —— python 源码探究与 js 实现

    labelme 保存 imageData 机制探究 python调试 js实现 python调试 import json import numpy as npfrom cv2 import cv2im ...

  8. 前端上传图片回显并用base64编码,后端做解码储存,存储图片路径在.properties文件中配置(以上传身份证照片为例)

    前端页面: <form id="kycForm" enctype="multipart/form-data"> <input type=&qu ...

  9. python验证码,python将PIL生成的图片进行base64编码并返回给前端浏览器

    我用python的PIL生成了验证码图片,需要将图片返回给前端浏览器,有两种返回方式.一种是返回response,另一种是将图片进行base64编码后返回. 注意:PIL生成验证码图片时,需要传入fo ...

最新文章

  1. 【干货】移动互联网时代的零售店面转型之道
  2. 学习dos批处理,再也不怕老板安排一些重复性高的工作了,几行代码就搞定!
  3. Android逆向基础----Android Dalvik虚拟机
  4. ASP.NET Core 基于角色的 JWT 令牌
  5. 基于FPGA的前向纠错算法
  6. cpp [Error] reference to ‘count‘ is ambiguous(全局变量的使用模糊不清)
  7. 微型计算机方面的论文,微型计算机论文.doc
  8. phpcms首页:调用全站所有tags关键字 - tags总结篇
  9. 联合国儿童基金会投资六家区块链初创企业,目标是解决“全球性挑战”
  10. win11更新黑屏无法进入系统怎么办 windows11黑屏更新无法进入系统的解决方法
  11. 回顾 | Apache Flink x TiDB Meetup · 北京站(附 PPT 下载)
  12. 浏览器访问局域网共享文件服务器,局域网文件共享:Filezilla-IE 轻松解决(图)...
  13. wiley期刊AMA-lato,latex字体安装问题
  14. SECS/GEM协议开发应用
  15. 【项目管理】投资回报率 ROI(Return on Investment)
  16. android assets 编译,使用Android Studio编译assets文件未打包进apk
  17. uoj132/BZOJ4200/洛谷P2304 [Noi2015]小园丁与老司机 【dp + 带上下界网络流】
  18. removeClass()
  19. 视频存储空间计算公式
  20. BAPI货物移动时报错

热门文章

  1. 有关软件测试的精品课程网站
  2. JAVA实现微信公众号扫一扫
  3. Wireshark TS | 快速重传和乱序之混淆
  4. 联想V4400A重装系统详细教程
  5. Go Hack 17:Killy 日记
  6. 计算机操作系统第五版-第三章课后习题
  7. 动态心电图监测系统市场现状及未来发展趋势
  8. Udesk微前端之路
  9. 人大金仓数据库-kingbaseES
  10. IE浏览器a标签无法下载问题解决(IE浏览器a标签download属性不兼容问题解决)