优化批量生成二维码并打包下载性能的核心策略是摒弃耗时的HTML2Canvas渲染,直接获取二维码图像数据,同时优化压缩环节。 以下是具体优化方案:
一、摒弃HTML2Canvas,直接获取二维码图像数据HTML2Canvas的CSS解析和渲染过程会显著拖慢性能,尤其在批量处理时。优化方案如下:
二、优化数据收集与存储- 批量收集数据URL:遍历所有二维码元素,将获取的URL或数据URL存入数组,避免频繁的DOM操作。例如:const qrElements = document.querySelectorAll('.qr-code'); // 假设二维码元素有类名'qr-code'const imageUrls = [];qrElements.forEach(element => { if (element.tagName === 'IMG' || element.style.backgroundImage) { const url = element.src || element.style.backgroundImage.match(/url("(.*)")/)[1]; imageUrls.push(url); } else if (element.tagName === 'CANVAS') { const dataUrl = element.toDataURL('image/png'); imageUrls.push(dataUrl); }});
- 减少内存占用:若二维码数量极大(如上万),可分批处理数据,避免一次性存储过多URL导致内存溢出。
三、优化压缩与打包环节- 选择高效压缩工具:JSZip虽常用,但压缩大量图像时可能成为瓶颈。可尝试以下替代方案:
分片压缩:将二维码图像按批次压缩,减少单次操作的数据量。
调整压缩参数:
使用JSZip.generateAsync({ type: 'blob', compression: 'DEFLATE', compressionOptions: { level: 6 } }),通过调整压缩级别(1-9)平衡速度与体积。
若对文件体积不敏感,可关闭压缩(compression: 'STORE')以提升速度。
使用Web Worker:将压缩任务移至Web Worker线程,避免阻塞主线程渲染或用户交互。
- 直接打包数据URL(无压缩场景):若二维码图像已足够小(如低分辨率),可跳过压缩步骤,直接将数据URL存入JSZip或生成单个文本文件(如CSV),进一步减少处理时间。
四、优化下载流程- 使用流式下载:避免将所有数据先存入内存再下载。例如,使用FileSaver.js的saveAs方法时,可结合Blob和URL.createObjectURL实现流式下载:const blob = new Blob([jszip.generate({ type: 'blob' })], { type: 'application/zip' });const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'qrcodes.zip';a.click();URL.revokeObjectURL(url); // 释放内存
- 分批下载:若单次下载数据量过大(如超过100MB),可按批次生成多个ZIP文件,或提供用户选择下载范围的功能。
五、其他性能优化技巧- 降低二维码分辨率:在QRCode.js生成时,通过correctLevel和size参数控制二维码复杂度和尺寸。较低分辨率(如100x100像素)可显著减少数据量。
- 缓存重复二维码:若批量生成中存在相同内容的二维码,可缓存已生成的图像数据,避免重复计算。
- 使用更快的二维码库:QRCode.js虽易用,但性能可能不如纯Canvas实现的库(如qrcode-generator)。可评估替换库的可行性。
总结优化后的流程为:定位二维码元素 → 直接获取图像数据 → 批量存储数据URL → 分片/并行压缩 → 流式下载。通过消除HTML2Canvas的渲染瓶颈、优化数据收集与压缩策略,可显著提升批量生成与下载性能,尤其适用于大规模二维码场景(如上千个)。