⚡️⚡️⚡️ 开源了!原来 Vite 加载图片还可以这样啊!🚀🚀🚀

前言

已经两天没发文章了,最近忙着写了一个插件,用来优化网站加载速度,今天分享给大家,希望可以帮助到更多的小伙伴!

往期精彩推荐

正文

前两天我们说到了,Vite 有两个很大的缺陷,一方面是 开发环境 和 生产环境 不一致,另一方面是打包之后小文件太多,导致浏览器的发送请求过多而处于排队或者加载时间过长!

虽然 js 文件可以借助插件,让多个小文件合并在一个 bundler 中,但是像我们的商城网站,全是小图片,而每个小小的图片就要单独发送一个网络请求!

要解决的问题

例如某商城列表页面,87 个请求中,63 个为图片相关的请求!

而且当 连接池已满的情况下,DNS 查找、初始连接、SSL 还会消耗额外的时间!

那么有什么办法可以让多张小图片合并成一张大点的图片吗?

我打开了万能的 github 检索了半天,发现只有针对 svg 文件的合并!

所以我这两天的时间,主要用来开发一个 vite 插件,将多张图片合并为一张大图片!

这样的好处是多张图片只需要一资源调度时间和等待服务器响应的时间!

怎么使用插件?下面是插件的使用方法!

安装

bash 复制代码
pnpm add -D vite-plugin-merge-images
# 或者
npm install -D vite-plugin-merge-images

使用方式

1. 配置插件

vite.config.ts 中引入并使用插件:

ts 复制代码
import { defineConfig } from "vite";
import vitePluginSpritesmith from "vite-plugin-merge-images";

export default defineConfig({
  plugins: [
    vitePluginSpritesmith({
      src: "./src/assets", // 图片来源目录
      output: "./dist/sprites", // 精灵图和坐标输出路径
      spriteName: "sprite.png", // 精灵图文件名
      coordsName: "sprite.json", // 坐标 JSON 文件名
      glob: "**/*.png", // 匹配图片的 glob 模式
    }),
  ],
});
2. 在项目中引入精灵图资源

为了方便引用文件,内置了虚拟模块,方便在任何地方直接引入生成的资源:

ts 复制代码
import {
  sprite,
  coords,
  getImageStyle,
} from "virtual:merge-images-runtime";

export function Icon({ name }: { name: string }) {
  const style = getImageStyle(coords, name, 1); // 或传 scale 缩放比例
  return <img src={sprite} style={style} alt={name} />;
}

这个插件还会继续完善,如果有好的想法可以告诉我,帮助我完善它!

原理

怎么做到的了?其实是接住了 spritesmith 工具,它的主要作用是将多个小图片合并成一张大图,并生成相应的 CSSJSON 数据,用于在网页或应用中定位和显示这些小图片!

spritesmith 仓库在这里:github.com/twolfson/sp...

我的插件库地址:github.com/mmdctjj/mer...

项目使用 monorepo 架构组织,核心包主要是功能实现,准备实现 vitewebpack 插件版本,

但是 webpack 插件版本在那时放弃了因为有现成的库:

github.com/mixtur/webp...

最后

亲眼看到自己天马行空的想法变成现实,真的是件开心的事情!

如果觉得还不错可以给我个 star ,欢迎交流和互动~

我的插件库地址:github.com/mmdctjj/mer...

文章中有错误的地方,也欢迎指正,十分感谢!

往期精彩推荐

相关推荐
AAA阿giao几秒前
从“操纵绳子“到“指挥木偶“:Vue3 Composition API 如何彻底改变前端开发范式
开发语言·前端·javascript·vue.js·前端框架·vue3·compositionapi
专注前端30年9 分钟前
在日常开发项目中Vue与React应该如何选择?
前端·vue.js·react.js
进击的野人30 分钟前
Vue 组件与原型链:VueComponent 与 Vue 的关系解析
前端·vue.js·面试
馬致远38 分钟前
Vue todoList案例 优化之本地存储
前端·javascript·vue.js
请叫我聪明鸭38 分钟前
CSS实现单行、多行文本超长显示 / 不超长隐藏、悬浮窗超长展示/不超长隐藏、悬浮窗手动控制样式
前端·javascript·css
风无雨42 分钟前
在 React 中实现数学公式显示:使用 KaTeX 和 react-katex
前端·react.js·前端框架
zfj3211 小时前
vscode是js开发的,为什么能支持golang java等各种语言开发
javascript·vscode·golang
GDAL1 小时前
Mapbox GL JS 核心表达式:`==` 相等判断完全教程
javascript·mapbox
炸土豆1 小时前
防抖节流里的this传递
前端·javascript
林希_Rachel_傻希希1 小时前
手写Promise--教学版本
前端·javascript·面试