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

【Vite】如何阻止Vite对较小图片的默认处理

前言

项目中使用一大一小两张图片

在这里插入图片描述
在这里插入图片描述

但是打包结果中并未发现小图

在这里插入图片描述

这是由于 Vite 默认的优化手段,当图片小于 4KB 时,会处理为 base64,在打包后的 JS 中可以查看

在这里插入图片描述

执行 npm run preview 查看线上环境发现,打印的图片路径也为base64,大部分情况下,这种差异不会有影响,但如果强制要求图片必须完全一致,就需要阻止 Vite 这个默认优化手段。

在这里插入图片描述

方法一:取消默认优化

通过 assetsInlineLimit 将默认的 4096 变为 0,这个选项只会影响生产环境

export default defineConfig({plugins: [react()],build: {assetsInlineLimit: 0,},
})

分别执行 npm run buildnpm run preview,可以发现小图也正常处理了

在这里插入图片描述

在这里插入图片描述

但是丢失了 Vite 本身的优化行为,所以并不推荐这种方法。

方法二:自己写一个Vite插件(推荐)

为了确保图片在开发和生产环境下的完全一致,但又要保证 Vite 默认优化行为,只能修改开发环境,保证与开发环境下的优化机制一致。

Vite 配置选项里并没有针对开发环境的配置,需要自己写一个

const myPlugin = (limit = 4096) => {return {name: "my-plugin",transform(code, id) {console.log(id)if (process.env.NODE_ENV !== "development") {return}},}
}export default defineConfig({plugins: [react(), myPlugin()],
})

Vite 基于 Rollup 的插件系统,transform 是 rollup 钩子,用于在代码模块被加载和打包之前,对模块内容进行修改或转换。code 是模块的内容,id 是模块的路径。

在这里插入图片描述

使用 node 环境下的 fs 读取文件状态并查看

import fs from "node:fs"const myPlugin = (limit = 4096) => {return {name: "my-plugin",async transform(code, id) {if (process.env.NODE_ENV !== "development") {return}// 根据需求筛选要处理的文件if (!id.endsWith(".png") || !id.endsWith(".jpg")) {return}const stat = await fs.promises.stat(id)console.log(stat)},}
}

在这里插入图片描述

只需要对 size 进行判断,并在恰当时机(小于4kb)转为 base64 即可

import fs from "node:fs"const myPlugin = (limit = 4096) => {return {name: "my-plugin",async transform(code, id) {if (process.env.NODE_ENV !== "development") {return}if (!id.endsWith(".png") && !id.endsWith(".jpg")) {return}const stat = await fs.promises.stat(id)if (stat.size > limit) {return}const buffer = await fs.promises.readFile(id)const base64 = buffer.toString("base64")const dataurl = `data:image/png;base64,${base64}`console.log(dataurl)},}
}

在这里插入图片描述

最后将处理好的 base64 返回即可

const myPlugin = (limit = 4096) => {return {name: "my-plugin",async transform(code, id) {if (process.env.NODE_ENV !== "development") {return}if (!id.endsWith(".png") && !id.endsWith(".jpg")) {return}const stat = await fs.promises.stat(id)if (stat.size > limit) {return}const buffer = await fs.promises.readFile(id)const base64 = buffer.toString("base64")const dataurl = `data:image/png;base64,${base64}`return {code: `export default ${JSON.stringify(dataurl)}`,}},}
}

查看开发环境

在这里插入图片描述

如果想要将插件发布到npm,请看本人另一篇文章:如何将开发的vite插件发布到npm

相关文章:

  • k8s pv(PersistentVolume) 状态含义
  • 连锁收银系统的五大功能 选择开源收银系统三要素
  • 【机器学习(十二)】机器学习回归案例之二手汽车价格预测—XGBoost回归算法—Sentosa_DSML社区版
  • 生成式人工智能在软件开发中的角色
  • SpringBoot开发——使用Hutool工具包处理日期时间详解
  • Cocos Creator 剪裁精灵图片方法记录(7)
  • C++20 std::format
  • Unity中Mesh使用MeshTopology.Lines模式绘制线条及MeshTopology.Quads模式绘制网格参考
  • C++学习笔记----8、掌握类与对象(一)---- 对象中的动态内存分配(5)
  • 1panel申请https/ssl证书自动续期
  • Kafka系列之:安装部署CMAK,CMAK管理大型Kafka集群参数调优
  • 微软Win11 22H2/23H2 九月可选更新KB5043145发布!
  • Mitsuba 渲染基础
  • 如何使用C语言接入Doris数据库
  • 【Linux服务器】git和github交互使用
  • 2017 前端面试准备 - 收藏集 - 掘金
  • android 一些 utils
  • dva中组件的懒加载
  • export和import的用法总结
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • TCP拥塞控制
  • 从0实现一个tiny react(三)生命周期
  • 给Prometheus造假数据的方法
  • 那些被忽略的 JavaScript 数组方法细节
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 我的zsh配置, 2019最新方案
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Semaphore
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #14vue3生成表单并跳转到外部地址的方式
  • (C++17) std算法之执行策略 execution
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (四)opengl函数加载和错误处理
  • (一)认识微服务
  • *** 2003
  • .axf 转化 .bin文件 的方法
  • .gitignore文件---让git自动忽略指定文件
  • .NET 服务 ServiceController
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net6Api后台+uniapp导出Excel
  • /*在DataTable中更新、删除数据*/
  • @SpringBootConfiguration重复加载报错
  • [20171101]rman to destination.txt
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [Android Studio] 开发Java 程序
  • [Android学习笔记]ScrollView的使用
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++提高编程](三):STL初识
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [ffmpeg] packet
  • [GN] Vue3快速上手1