【山竹记账前端-vue】6.Vite SVG Sprites
大纲链接 §
[toc]
0. 解决图标加载不流畅方案:自制 Vite SVG Sprites 插件 v.s. 社区插件 ⇧
解决图标加载不流畅
logo图标资源加载可能比较慢
- 在第一页时,就提前加载所有页面的图标资源,需要一劳永逸地解决
- 将所有分散的
SVG资源统一放入一个 大SVG,在 body 中预加载先,组件其他部分使用时就不需要再次加载 - 使用
SVG Sprites代替已经过时的png图片精灵图
1. 方案一:Vite SVG Sprites Plugin ⇧
安装与配置 ⇧
需要依赖两个基础的库
svgstore存放所有图标,用法svgo优化图标,优化用法 optimize
安装
pnpm add svgo@4.1.0 svgstore@3.0.1
实现插件
@/plugins/svgoStore.ts
|
|
- 声明插件
export const svgoStore = (options: SvgoStoreOptions = {}): Plugin => {}- 插件配置属性:
inputFolderSVG 图标源文件夹路径svgoConfigSVGO 优化配置,见 svgo 预设插件
- 忽略类型检查
// @ts-ignore svg_bundle.js统一存放的图标文件实际上在源代码中是不存在的,而所有图标文件放在@src/assets/icons目录下import '@svgoStore'解析 为import 'svg_bundle.js'绕过vscode报错
- 加载
svg_bundle.js逻辑- 使用第三方库
svgstore来配置获取图标,传入配置选项options for (const file of fs.readdirSync(iconsDir))遍历所有图标路径sprites.add(svgid, code)加入到大svg文件中- 优化
svg配置svgoConfig缩小svg体积 - 删除部分属性
cleanupAttrs、removeDoctype、removeComments、removeTitle、removeDesc、removeEmptyAttrs、 - 删除
ata-name属性
- 使用第三方库
- 把解构出的代码
const { data: code } = optimize(sprites.toString({ inline: options.inline }), svgoConfig)变成合法的svg_bundle.js文件- 使用
div将svg包裹,并将样式属性变为不可见,放到body
- 使用
在
vite.config.ts中引入配置
|
|
在
main.ts中引入
|
|
- 忽略类型检查
// @ts-ignore
安装配置完毕,重启
vite服务
使用 svg 代替 img ⇧
服务重启后,查看页面元素,
body中多出一个标签
- 统一放到一个
svg中,包含所有分散图标的symbol标签 - 宽高 0,不可见,预加载,只下载一个资源
svg_bundle.js
改写组件
<img />标签:<svg><use xlinkHref="#pig"></use></svg>
|
|
- 查看页面,修改部分
svg宽高样式即可
查看打包产物页面是否正常 ⇧
- 运行
pnpm build - 预览
pnpm preview - 访问
http://localhost:4173/
补充一点 ⇧
- 此插件是运行在
node上,需要补充ts配置 tsconfig.node.jsonTSConfig for modules that run in Node.js environment via either transpilation or type-stripping.Include Node.js types and avoid accidentally including other@types/*packages.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17{ "extends": "@tsconfig/node24/tsconfig.json", "include": [ "vite.config.*", "eslint.config.*", "src/plugins/**/*" ], "exclude": [], "compilerOptions": { "module": "preserve", "moduleResolution": "bundler", "allowImportingTsExtensions": true, "types": ["node"], "noEmit": true, "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo" } }
参考
2. 方案二:使用社区插件 vite-plugin-svg-icons-ng ⇧
注意次插件依赖版本需要
Vite >=5,Node.js 18 / 20 / 22+
安装与配置 ⇧
|
|
配置
@vite.config.ts
|
|
替换组件中
svg的xlinkHref
|
|
重启
vite服务查看编译结果
封装可复用组件 ⇧
@/components/icons/SvgIcon.tsx
|
|
替换使用封装图标组件
@/modules/welcome/Welcome1stPage.tsx
|
|
组件复用参考
配置 Typescript 支持 ⇧
tsconfig.app.json
|
|
Typescript 支持参考
配置 svgo 优化选项 ⇧
特点 ⇧
- 开始默认将 SVG Sprite 自动注入 index html,即使不导入虚拟模块也可以获得 SVG Sprite
其他方案参考
- 主推:
vite-plugin-svg-icons-ng vite-plugin-icons-spritesheet给React使用推荐vite-plugin-svgr给React使用推荐vite-plugin-svg-icons几乎停止维护
·未完待续·
参考文章
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名