百科问答小站 logo
百科问答小站 font logo



前端开发中,使用base64图片的弊端是什么? 第1页

  

user avatar   qinlili233 网友的相关建议: 
      

阻塞加载

在下面这样的html文件中

前面的
src="data:image/png;base64,xxx"
后面的

我们都知道,html是流式下载的,或者说浏览器加载所有文件其实都是从前往后单线程流式下载的

这种流式下载意味着前面的没加载完,我不可能先加载后面的

假设base64编码后的字符串长度为256kb,用户的网速为每个连接32kb/s,而除去这个字符串外html大小仅为32kb,其中图片前后各16kb

那么不考虑其他资源加载的情况下,用户会先在半秒后看到这个图片上面的内容,然后花费8秒加载图片,再在半秒后看到完整的网页

而如果使用外链图片,用户会在1秒后看到没有图片的网页,并且在第8.5秒时就看到了图片(而不是9秒,随着html边下载边解析,解析到图片就已经开始下载图片了)


这个简单的例子还看不出多大的差距

我们不妨再考虑的更极端一些

假设在图片之后,body结束之前,有一个256k的外部的界面相关js脚本

如果使用base64编码,那么直到9秒后,js脚本才开始加载,又过了8秒,js脚本加载完成了,用户才看到了完整的应有的界面

如果图片也使用外链,那么在一秒之内,图片和js都已经开始加载了,只需要再过8秒,也就是总计用时9秒,用户就看到了完整的网页


以及如果你正在使用全站CDN,比如cloudflare,默认对html是不缓存的,但却缓存图片。如果使用base64,会消耗更多的回源流量,并降低加载速度




那么有没有办法解决这个问题呢?其实是有的

我们可以把base64图片放在js里,使用异步加载js的办法尽可能减少首屏时间

同时因为js可以被CDN缓存,也不会增加回源流量

之所以使用base64,优势在于可以发起更少的http下载请求,在文件较小的情况下可以通过减少握手延迟而加快加载速度


这里给出了一个我全部使用base64加载按钮图标的案例

base64放在js里并完全异步加载,首屏只需要一个1.5k的html和一个1.6k的css,brotli压缩后首屏请求仅不到2k,尽可能最快速度渲染首屏,每次访问CDN仅回源1.5k(不过因为现在使用cloudflare pages托管,可以视为完全不回源)


user avatar   evanyou 网友的相关建议: 
      

我又要来安利 webpack 了:url-loader 可以自动根据文件大小决定要不要做成内联 base64

webpack/url-loader · GitHub



  

相关话题

  你们见过最搞笑的图片是什么? 
  以下 CSS 栅格布局除了用 table 以外,有什么其他的方法吗? 
  有哪些好用的图片查看器值得推荐 
  “云原生”(Cloud Native)和前端开发的技术结合点在哪里? 
  如何看待知乎前后端关注度差距悬殊的现象? 
  如何把多张图片合并成一个PDF? 
  网上都说操作真实 DOM 慢,但测试结果却比 React 更快,为什么? 
  客户端 POST 错误,服务端应该回 200 还是 400? 
  Web 前后端分离的意义大吗? 
  大神们都存着哪些图片以做回复之用? 

前一个讨论
最让你伤心的bug是什么?
下一个讨论
如何证明你不是你所讨厌的那种人?





© 2025-04-17 - tinynew.org. All Rights Reserved.
© 2025-04-17 - tinynew.org. 保留所有权利