如何在 Vue 项目中自动将图片转为 WebP 并优雅降级?
我最近在做性能优化,想把项目里的 JPG/PNG 自动转成 WebP,但又怕老浏览器不支持。试了下用 webpack 插件生成 WebP,但不知道怎么在 Vue 模板里自动切换格式,现在只能手动写两套?
比如我现在这样写,明显不够自动化,每次换图都得改两处:
<picture>
<source srcset="@/assets/images/banner.webp" type="image/webp" />
<img src="@/assets/images/banner.jpg" alt="banner" />
</picture>
有没有办法在构建时自动生成 WebP,并在运行时自动选择最优格式?
步骤一:安装依赖
首先需要安装图片处理插件,在项目根目录执行:
步骤二:配置 webpack 自动生成 WebP
在 vue.config.js 中添加配置:
这样配置后,每次构建会自动在输出目录生成对应的 .webp 文件。比如 src/assets/images/banner.jpg 会变成 dist/img/banner.webp。
步骤三:创建智能图片组件
创建一个 WebpImage.vue 组件,运行时自动检测浏览器支持情况:
步骤四:在页面中使用
现在就可以很简洁地使用了:
原理说明
1. 构建时:webpack 插件会扫描所有 jpg/png 图片,用 imagemin 库压缩并转换为 WebP 格式输出到 dist 目录。文件名自动加 .webp 后缀。
2. 运行时:组件在 created 阶段通过加载一个 1x1 的 base64 WebP 图片来检测浏览器支持情况。如果加载成功(width=1, height=1),说明支持 WebP,就渲染
标签;否则直接用原图。3. 降级逻辑:浏览器会自动选择第一个支持的 source。如果支持 WebP 就用 webp 图片,不支持就跳过 source 直接用 img 标签的原图。
进阶优化
如果你的图片很多,构建速度会变慢。可以考虑只在生产环境生成 WebP,或者用 CDN 的图片处理服务(上传时自动转)。另外注意 webpack5 的 asset module 机制和 vue-cli 的图片处理有些差异,如果遇到问题可以检查 file-loader 或 url-loader 的配置是否冲突。
这样一套下来,你只需要写一次图片路径,组件会自动处理格式切换的事情。