Skip to content

Base64 图片导致页面卡顿解决方案

问题描述

开发中有些场景会用遇到 base64 格式图片插入 DOM 中的需求,但是当如果当图片很大的时,会使得图片的 base64 编码字符串很长,这样在插入到 DOM 后很大概率上会导致 UI 线程卡顿,从而影响用户体验,特别是在手机上时非常影响手机的性能。

解决方案

我们可以将 base64 格式的图片转换成 blob 对象,然后再转换成 URL 对象,这样就可以解决上面的问题。

这里能用到的 API 有两个:

  • fetch:fetch 函数返回一个 Promise 对象,使得异步操作更加直观和易于处理。
  • URL.createObjectURL:用于创建一个包含指定数据的唯一 URL,通常这个方法用于将一些特殊类型的数据,比如 Blob 或 File 对象,转换为可用于访问的 URL。该方法返回的 URL 是一个类似于 blob: 或 file: 开头的字符串,可以用于在浏览器中创建临时的 URL 地址,使得浏览器可以直接访问内存中的数据,而无需通过服务器。

下面就可以用上面的两个 API 来实现上面的需求了:

js
function base64ToImageUrl(b64str) {
  return new Promise((resolve, reject) => {
    fetch(b64str)
      .then(data => data.blob())
      .then((b) => {
        const url = URL.createObjectURL(b)
        resolve(url)
      })
      .catch(error => {
        reject(error)
      })
  })
}