前端加载一张100M的大图如何做到秒开?

903 阅读2分钟

前端加载超大图片时,一般可以采取以下措施实现加速:

  1. 压缩图片:使用专业的图片处理工具,对图片进行压缩。可以使用无损压缩算法,如PNG格式,来减小文件大小,同时保持图片质量。
  2. 图片格式优化:选择合适的图片格式,如JPEG、PNG、WebP等,根据图片的特点和应用场景选择最优的图片格式。
  3. 图片懒加载:将页面中的图片分为几个区域,只加载当前区域内的图片,而不是一次性加载所有图片。这样可以减少页面加载时间,提高用户体验。
  4. CDN加速:使用CDN加速服务,将图片存储在CDN节点上,使用户从离自己最近的节点获取图片,减少网络传输时间。
  5. 使用缓存:对于静态图片,可以使用浏览器缓存或者服务器缓存,减少重复请求,提高页面加载速度。
  6. 资源预加载:在页面加载时,提前加载图片资源,通过预加载可以提高图片加载速度,减少页面加载时间。
  7. 图片分片加载:将大图分成多个小块,分别加载,最后通过拼接组合成完整的大图。这样可以分散网络传输,提高图片加载速度。

而对于几百M或上G的大图而言,不管对图片进行怎么优化或加速处理,要实现秒开也是不太可能的事情。而上面介绍的第7条“图片分片加载”是最佳解决方案。下面介绍下如何对大图进行分割,在前端进行拼接实现秒开。

以下是基于JavaScript的图片分片加载的实现代码:

// 定义图片分片的大小
const CHUNK_SIZE = 1024 * 1024; // 每片1M

// 定义图片分片的数量
let chunkCount = 0;

// 定义图片分片的数组
let chunks = [];

// 定义图片加载完成的数量
let loadedCount = 0;

// 加载图片
function loadImage(url) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.responseType = 'blob';
  xhr.onload = () => {
    if (xhr.status === 200) {
      // 计算图片分片数量
      const blob = xhr.response;
      const fileSize = blob.size;
      chunkCount = Math.ceil(fileSize / CHUNK_SIZE);

      // 分片加载图片
      let start = 0;
      let end = 0;
      for (let i = 0; i < chunkCount; i++) {
        start = i * CHUNK_SIZE;
        end = Math.min(fileSize, start + CHUNK_SIZE);
        chunks[i] = blob.slice(start, end);
      }

      // 依次加载图片分片
      loadChunks(0);
    }
  };
  xhr.send();
}

// 加载图片分片
function loadChunks(index) {
  if (index >= chunkCount) {
    // 所有图片分片加载完成
    const blob = new Blob(chunks);
    const url = URL.createObjectURL(blob);
    const img = new Image();
    img.onload = () => {
      // 图片加载完成
      console.log('图片加载完成');
    };
    img.src = url;
    return;
  }

  // 加载当前分片
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.responseType = 'blob';
  xhr.onload = () => {
    if (xhr.status === 200) {
      // 加载完成后,将分片存入数组
      chunks[index] = xhr.response;
      loadedCount++;

      // 加载下一块
      loadChunks(index + 1);
    }
  };
  xhr.send();
}

// 调用加载图片函数
loadImage('http://example.com/large-image.jpg');

以上是一个基于XMLHttpRequest的图片分片加载的实现代码,通过将大图分成多个小块,分别加载,最后通过拼接组合成完整的大图,可以提高图片加载速度。