vue3中如何实现图片的压缩

本文介绍了在Vue项目中进行图片压缩的原因,如加快加载速度、节省流量、降低服务器成本等,并展示了如何在Vite环境中安装并配置vite-plugin-image-optimizer进行自动压缩,以及自定义压缩参数。最终,通过对比压缩前后图片大小,强调了图片优化在产品项目中的重要性。

首先,为什么需要进行图片压缩:

  1. 减少页面加载时间:因为图片是页面中常见的资源之一,较大的图片会增加页面的加载时间,影响用户体验,压缩图片可以减小图片的文件大小,提升页面加载速度。
  2. 节省网络流量:在移动设备或移动网络下,加载大型图片可能会消耗大量的网络流量,导致用户的流量费用增加,压缩图片可以降低文件大小,节省用户的流量费用。
  3. 节约服务器带宽:压缩图片可以减少服务器带宽流量,当服务器响应客户端请求时,如果返回的是压缩过的图片,那么所需的传输时间和带宽流量,都会比原始图片少,这是因为压缩图片可以减小文件大小,来减少所需的传输时间和带宽流量,在一些大量传输图片的场景下,压缩图片可以减少服务器的带宽流量,从而减低服务器成本,并提升用户体验。
  4. 减少网络拥堵:在网络拥堵的情况下,下载大型图片可能会占用较多的带宽资源,从而导致其他用户的访问速度变慢,压缩图片可以减小图片的文件大小,减少网络拥堵的情况。
  5. 减少存储空间:对于需要大量存储图片的应用程序,如图片分享网站,在线相册等。压缩图片可以减少存储空间的占用,降低成本。
  6. 保护隐私信息:一些照片中可能包含了一些隐私信息,如地理位置,时间,人脸等。如果不进行压缩,这些信息可能会被黑客或者不法分子利用,压缩图片可以消除或者减少这些信息,保护隐私安全。
  7. 增加搜索引擎排名:搜索引擎越来越注重网站的速度和性能。压缩图片可以加快页面的加载速度,提高用户体验。从而增加搜索引擎的排名。

在理解了项目中为什么要使用图片压缩后,可以在vite环境中vue项目中,先进行不同类型图片的引入与使用操作。

第一步:在src的目录中assets文件夹下放置一些不同格式的图片(.jpg,.png,.webp,.svg)

这些文件有大有小,有的有86.9KB,有的有540KB

第二步:引入图片

<template>
    <img src="./assets/pig.webp" />
    <img src="./assets/cat.jpg" />
    <img src="./assets/cat.png" />
    <img src="./assets/dog.png" />
    <img src="./assets/vue.svg" />
</template>

运行

npm run dev

第三步:打开调试工具Network面板

勾选Disable cache选项进行无缓存的页面请求测试,以下则可以清楚的看到各个文件类型与尺寸的大小。

那么是否可以对assets中的图片资源进行自动的压缩处理呢???? 

第一步:在vue项目中安装以下插件

npm i vite-plugin-image-optimizer -D

第二步:在vite.config.ts中引入模块并配置插件使用

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { ViteImageOptimizer } from "vite-plugin-image-optimizer";

export default defineConfig({
    plugins:[
        vue(),
        ViteImageOptimizer()
    ],
});

vite-plugin-image-optimizer不支持开发环境图片压缩,需要利用npm run build进行生产环境项目打包。

运行完毕以后,在终端中会显示图片压缩的报表结果,清晰的可以查看到,如果原图可以进行压缩,包括压缩后的文件大小尺寸都有所显示。如果插件尝试对原图压缩,但压缩后的文件反而比原图大的话,那么将会采用skip的跳过机制,保留原图而不使用压缩操作。

如果觉得vite-plugin-image-optimizer默认配置不能够满足项目对图片优化的需求,则可以考虑进行自定义属性的设置。

比如:

对jpg进行压缩,画质保留至90%。对png进行压缩,画质保留至100%。

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { ViteImageOptimizer } from "vite-plugin-image-optimizer";

export default defineConfig({
    plugins:[
        vue(),
        ViteImageOptimizer({
            jpg:{
                quality:90,
            },
            png:{
                quality:100,
            }
        })
    ],
});

执行npm run build打包命令以后则会看到与之前默认配置不同的压缩结果。

项目在打包以后会产生dist目录,确保电脑环境中有类似serve这样的本地服务开启工具以后,可以尝试在项目根目录运行serve ./dist

如果没有serve则可以进行下载:

npm install serve -g  全局安装

那么以上则是压缩前和压缩后图片大小的对比,那么在产品项目中的图片已经变得精简太多。 

Vue 3 应用中实现图片压缩功能,可以通过多种方式来完成,包括使用自定义指令、集成第三方库或直接操作 Canvas API 来进行图像处理。以下是几种常见的实现方法: ### 使用自定义指令实现图片压缩 Vue 的自定义指令可以用于在图片上传前对其进行压缩。通过 `v-on:change` 监听文件输入的变化,并在回调函数中获取用户选择的图片文件。接着,可以利用 `FileReader` 将图片读取为 Data URL,并将其绘制到 `<canvas>` 元素上以调整大小并导出压缩后的图片数据。 ```javascript app.directive(&#39;compress-image&#39;, { mounted(el, binding) { el.addEventListener(&#39;change&#39;, async (event) => { const file = event.target.files[0]; if (!file || !file.type.startsWith(&#39;image/&#39;)) return; const reader = new FileReader(); reader.onload = async () => { const img = new Image(); img.onload = () => { const canvas = document.createElement(&#39;canvas&#39;); const ctx = canvas.getContext(&#39;2d&#39;); canvas.width = img.width * 0.5; // 调整尺寸为原始的一半 canvas.height = img.height * 0.5; ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 导出压缩后的图片 canvas.toBlob((blob) => { const compressedFile = new File([blob], file.name, { type: &#39;image/jpeg&#39;, lastModified: Date.now() }); binding.value(compressedFile); // 将压缩后的文件传递给绑定值 }, &#39;image/jpeg&#39;, 0.7); // 设置 JPEG 质量 }; img.src = reader.result; }; reader.readAsDataURL(file); }); } }); ``` ### 使用第三方库(如 `compressorjs`) 对于更复杂的压缩需求,推荐使用第三方库,例如 `compressorjs`,它提供了更丰富的配置选项,如质量控制、尺寸限制等,并且易于集成到 Vue 项目中。 安装 `compressorjs`: ```bash npm install compressorjs ``` 然后可以在组件中使用该库: ```vue <template> <input type="file" @change="handleImageUpload" /> </template> <script> import Compressor from &#39;compressorjs&#39;; export default { methods: { handleImageUpload(event) { const file = event.target.files[0]; if (!file) return; new Compressor(file, { quality: 0.6, // 设置压缩质量 success(result) { console.log(&#39;Compressed file:&#39;, result); // 在这里处理压缩后的文件 }, error(err) { console.error(&#39;Compression error:&#39;, err); } }); } } }; </script> ``` ### 结合服务端进行图片压缩 虽然客户端压缩能够减少上传流量和提升用户体验,但在某些情况下,为了保证最终图片的质量和一致性,仍需在服务端进行进一步的压缩处理。前端可以将原始图片上传至服务器,由后端使用专业的图像处理工具(如 ImageMagick 或 Sharp)进行高质量压缩后再返回给客户端。 综上所述,在 Vue 3实现图片压缩可以根据具体场景选择合适的方法,无论是采用自定义逻辑还是借助成熟库,都可以有效地优化图片资源[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值