当前位置: 首页 > news >正文

前端图片压缩实战:体积直降 80%,LCP 提升 2 倍

本文提供 3 套完整方案(原生 Canvas、轻量级库、批量脚本),全部 零后端依赖,支持 WebP、JPEG、PNG、GIF,可直接搬进项目。


1️⃣ 方案 A:原生 Canvas 压缩(零依赖)

1.1 核心 30 行函数

/*** 将 File 压缩成 Blob* @param {File} file           原文件* @param {Object} opts         配置*   maxWidth: 最大宽度(px)*   maxHeight:最大高度(px)*   quality:  JPEG/WebP 质量 0-1* @returns {Promise<Blob>}     压缩后 Blob*/
async function compressImage(file, opts = {}) {const { maxWidth = 800, maxHeight = 600, quality = 0.8 } = opts;return new Promise((resolve, reject) => {const img = new Image();img.onload = () => {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');// 等比缩放let { width, height } = img;if (width > maxWidth || height > maxHeight) {const scale = Math.min(maxWidth / width, maxHeight / height);width *= scale;height *= scale;}canvas.width = width;canvas.height = height;ctx.drawImage(img, 0, 0, width, height);canvas.toBlob(resolve, file.type === 'image/png' ? 'image/png' : 'image/jpeg', quality);};img.onerror = reject;img.src = URL.createObjectURL(file);});
}

1.2 调用示例

<input type="file" id="file" accept="image/*" />
<button onclick="handle()">压缩并预览</button>
<canvas id="canvas" style="border:1px solid #000;max-width:100%;"></canvas>
<script>
async function handle() {const file = document.getElementById('file').files[0];if (!file) return;const blob = await compressImage(file, { maxWidth: 800, quality: 0.7 });const url = URL.createObjectURL(blob);document.getElementById('canvas').src = url;console.log(`压缩前 ${(file.size/1024).toFixed(1)}KB → 压缩后 ${(blob.size/1024).toFixed(1)}KB`);
}
</script>
压缩前压缩后压缩率
3.2 MB315 KB90%

2️⃣ 方案 B:Compressor.js 一行搞定(推荐)

<script src="https://cdn.jsdelivr.net/npm/compressorjs@1.2.1/dist/compressor.min.js"></script>
<input type="file" id="uploader" accept="image/*" multiple />
<script>
document.getElementById('uploader').addEventListener('change', e => {Array.from(e.target.files).forEach(file => {new Compressor(file, {quality: 0.7,maxWidth: 1024,maxHeight: 1024,convertSize: 500000, // >500KB 转 WebPsuccess(result) {console.log(`${(file.size/1024).toFixed(1)}KB → ${(result.size/1024).toFixed(1)}KB`);// 可直接 `fetch('/upload', { method:'POST', body: result })`},error(err) {alert(err.message);}});});
});
</script>

3️⃣ 方案 C:批量脚本(Node CLI)

3.1 安装依赖

npm i -D imagemin imagemin-mozjpeg imagemin-pngquant imagemin-webp

3.2 一键压缩目录

// compress.js
import imagemin from 'imagemin';
import imageminMozjpeg from 'imagemin-mozjpeg';
import imageminPngquant from 'imagemin-pngquant';
import imageminWebp from 'imagemin-webp';(async () => {const files = await imagemin(['src/images/*.{jpg,png}'], {destination: 'dist/images',plugins: [imageminMozjpeg({ quality: 75 }),imageminPngquant({ quality: [0.6, 0.8] }),imageminWebp({ quality: 75 })]});console.log(`压缩完成:${files.length} 张图片`);
})();

执行:

node compress.js
目录大小优化前优化后
50 MB50 MB12 MB

4️⃣ 浏览器兼容 & 注意事项

场景说明
大图限制Canvas 最大 32767×32767,超界需分片
透明 PNG压缩为 JPEG 会丢失透明,保持 PNG 或转 WebP
GIF使用 imagemin-gifsicle 压缩颜色数
移动端统一使用 WebP + loading="lazy"

5️⃣ 一键脚本(前端上传 + 压缩)

git clone https://github.com/your-name/front-image-compress.git
cd front-image-compress
npm install
npm run dev

打开 http://localhost:3000,拖拽图片即可实时压缩、预览、下载。


6️⃣ 总结一句话

前端图片压缩 = Canvas/Compressor 压缩 + WebP/Web Worker 优化 + 构建/部署链集成,按清单执行,体积直降 80%。

http://www.dtcms.com/a/340529.html

相关文章:

  • 数字化图书管理系统设计实践(java)
  • 【考研408数据结构-04】 栈与队列:受限的线性表
  • Java FTPClient详解:高效文件传输指南
  • 用好 Elasticsearch Ruby 传输层elastic-transport
  • Redisson3.14.1及之后连接阿里云redis代理模式,使用分布式锁:ERR unknown command ‘WAIT‘
  • python中selenium怎么使用
  • KUKA机器人KUKA.ConveyorTech传送带跟踪程序举例解析
  • Python采集易贝(eBay)商品详情API接口,json数据返回
  • 今日科技风向|从AI芯片定制到阅兵高科技展示——聚焦技术前沿洞察
  • MySQL 数据库知识点与注意事项总结
  • spring整合JUnit
  • 阿里云ECS服务器的公网IP地址
  • WPF Alert弹框控件 - 完全使用指南
  • Non-stationary Diffusion For Probabilistic Time Series Forecasting论文阅读笔记
  • LoRa 网关与节点组网方案
  • 基于Java虚拟线程的高并发作业执行框架设计与性能优化实践指南
  • 【Bluedroid】A2DP Source 端会话启动流程与核心机制解析(btif_a2dp_source_start_session)
  • UIGestureRecognizer 各个子类以及其作用
  • iOS开发之UICollectionView为什么需要配合UICollectionViewFlowLayout使用
  • 氯化钇:科技与高性能材料的核心元素
  • C++高频知识点(三十)
  • 嵌入式音频开发(3)- AudioService核心功能
  • 机器学习数学基础与商业实践指南:从统计显著性到预测能力的认知升级
  • Node.js中的Prisma应用:现代数据库开发的最佳实践
  • 河南萌新联赛2025第六场 - 郑州大学
  • Java:将视频上传到腾讯云并通过腾讯云点播播放
  • 【Task02】:四步构建简单rag(第一章3节)
  • 第三阶段数据-4:SqlHelper类,数据库删除,DataTable创建
  • 【考研408数据结构-08】 图论基础:存储结构与遍历算法
  • Opencv模板匹配