Base64是什么?前端用Base64加载图片到底好不好?
wptr33 2025-01-07 16:16 39 浏览
相信无论是前端还是后端开发工程师,对于Base64都不会感到陌生,在开发中我们经常会将一些小图片以Base64的形式存储和加载。然而知其然也要知其所以然,Base64究竟是什么,我们为什么要使用Base64,以及Base64的优缺点又是什么呢?今天我们就来聊一聊。
什么是Base64
首先Base64是一种编码格式,普遍应用于需要在网络中存储和传输的二进制数据。为什么叫Base64呢,主要是因为这种编码格式每个字节的前两位只能是0,剩下只有6位可以表示,所以对于Base64来说,一个字节只能表示64种情况。Base64的名字由此而来。
为什么要存在Base64
但我们不难发现,这样的话这种编码格式并不能充分利用存储资源,是比较低效的,那为什么还要用Base64这种编码呢?为什么不直接传输二进制而要转成Base64格式再去传输呢?
原因是因为base64最早是用在邮件传输协议中的,当时邮件传输协议只支持ascii字符传递,ascii码可以用来表示所有的英文字符和数字还有一些符号,但其中还存在很多不可见字符或者叫控制字符,不可见字符在传输过程中可能会产生一些错误,如果邮件中只传输英文数字等,那么ascii是可以直接支持不会有问题,但是如果你要在文件中传输一些二进制文件,图片,视频等资源的时候,不可避免的转成ascii的时候会出现非英文数字的情况,也就是上面所说的不可见字符,这时就有可能会导致传输过程中出现问题。
Base64就是用来解决这个问题的,人们想到把二进制划分为多个3个字节的块,把每3个字节(24位)转换成4个6位,每个六位根据查表对应一个ASCII符号。如下图所示:
上图是Base64的编码字典
如上图所示,比如我们有一个3个字节的数据,转成ascii码以后就是第一行所示,但我们查询ascii码会发现第三个字节是个不可见字符,所以如果在曾经的邮件传输协议中这么传输可能会在过程中产生一些错误,于是我们需要转成base64再去传输,根据Base64的转化规则曾经的三个字节就变成了4组6位的值,然后我们需要在每一组前面补充两个0补齐字节长度。于是根据Base64编码之后我们打印出的结果就是S3qb这个字符串。
另外这个例子比较特殊,我们正好是个3字节数据,如果1个字节或者2个字节时,我们就会发现位数不能正好被6整除,不能整除就会是下面这个示例展示的样子
如何编码和解码Base64
在 JavaScript 中,有两个函数被分别用来处理解码和编码 base64 字符串。
- btoa() — 字符串转 Base64编码
- atob() — 通过Base64规则解码成ascii字符串
使用Base64存储和加载图片好不好?
相信大家对于Base64的编解码和原理已经有了深入了解,最后我们简单聊聊在前端页面中使用Base64加载图片到底好不好。所有事情都有两面性,没有绝对的好不好,只有在某些特定场景下合不合适。我们来看看Base64加载图片的优劣点:
资源大小:根据我们上面提到的原理,我们很容易发现Base64会比正常资源要大三分之一,Gzip压缩之后差距会缩小。
缓存方式:图片资源很好缓存,但如果是base64的话,如果是在cssjs中引入可以跟文件一起进行缓存,如果在html中直接引用则必须缓存html文件,所以缓存方便程度上肯定是图片资源文件更方便缓存。
加载方式:html/css中引入base64会导致文件体积变大,从而导致首屏展示的比较慢,而用过图片资源方式异步引入会首屏会展示的比较快。但对于需要加载很多图片的情况下,尤其是脚在很多小图片小icon的情况下,如果不使用雪碧图的方式就会造成请求量很大,在http1.1/1.0协议下,在不开启keep-alive的情况下,会导致效率低下重复创建销毁连接通道,并且浏览器存在请求线程限制,并且存在网络io延迟,这种情况下base64效率更高,但如果你的应用使用http2/3的协议,base64的优势就不大了。
结语
所以综合来看Base64加载图片的方式多数情况下并不是最优选择,只有在图片比较小,比较独立并不适合做成雪碧图的情况下再去使用比较好。
好了,我是全栈工程师鸡腿,一个战斗在互联网一线的全栈工程师,如果文章对你有所帮助,希望你可以点赞、转发、关注一下,如果你还想了解到哪些其他知识点,欢迎下方留言给我哈。另外我们还有一个技术交流群,加入方式在我的首页置顶的微头条动态里有,欢迎大家加入。我们下次见~ 88~
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
