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

【Vue开发】在Vite+Vue3项目中实现离线Iconify图标方案

在Vite+Vue3项目中实现离线Iconify图标方案

项目背景

当前项目需要部署到无网络连接的离线环境,因此需要将Iconify图标集打包到项目构建结果中,实现完全离线使用。

技术环境

  • 框架: Vue 3
  • 构建工具: Vite
  • 核心依赖:
    "@iconify/json": "^2.2.228",    // 提供完整的图标集合
    "@iconify/vue": "^4.1.1",       // Vue图标组件
    "@tomjs/vite-plugin-iconify": "^1.2.1"  // Vite插件,用于打包图标
    

实现步骤

1. Vite配置

vite.config.ts中进行配置,将图标集打包到最终产物中:

import { defineConfig } from 'vite'
import iconify from '@tomjs/vite-plugin-iconify'export default defineConfig({plugins: [iconify({ local: true // 将所有图标集打包进dist目录// local: ['ep'] // 可选:只打包指定图标集(如element-plus)}) ]
})

图标集选择说明:所有可用图标集可在node_modules/@iconify/json/collections.json中查看。在线预览图标可访问icones.js.org。

2. 封装图标组件

创建TheIcon.vue组件作为统一的图标渲染入口:

<script setup>
import { renderIcon } from '@/utils'defineProps({icon: {type: String,required: true,},size: {type: Number,default: 14,},color: {type: String,default: undefined,},
})
</script><template><component :is="renderIcon(icon, { size, color })" />
</template>

3. 实现渲染工具函数

在工具函数文件中添加图标渲染逻辑:

import { h } from 'vue'
import { Icon } from '@iconify/vue'
import { NIcon } from 'naive-ui'export function renderIcon(icon, props = { size: 12 }) {return () => h(NIcon, props, { default: () => h(Icon, { icon }) })
}

4. 在项目中使用

在任意Vue组件中引入并使用:

<template><TheIcon icon="material-symbols:add" :size="18" class="mr-5" />
</template><script setup>
import TheIcon from '@/components/icon/TheIcon.vue'
</script>

方案优势

  1. 完全离线支持:所有图标资源打包到构建结果中,不依赖网络请求
  2. 灵活选择:可按需打包全部或部分图标集,控制构建体积
  3. 统一接口:通过封装组件提供一致的调用方式
  4. 类型安全:通过Props定义确保使用规范

注意事项

  1. 打包全部图标集会显著增加构建体积,建议根据实际需求选择必要图标集
  2. 图标命名格式为集合名:图标名,可在icones.js.org查找可用图标
  3. 此方案也可用于有网络环境,作为性能优化手段减少外部请求
http://www.dtcms.com/a/339072.html

相关文章:

  • 【什么是非晶合金?非晶电机有什么优点?】
  • Redis面试题及详细答案100道(71-85) --- 综合篇
  • Vim笔记:缩进
  • KMM跨平台叛逃实录:SwiftUI与Compose Multiplatform共享ViewModel的混合开发框架(代码复用率85%)
  • Qt5 GUI 编程详解
  • 【AI大模型的发展历史】从Transformer到2025年的多模态、推理与开源革命
  • mlir 类型
  • docker 数据卷、自定义镜像操作演示分享(第二期)
  • 【数据结构】堆和二叉树详解(下)
  • SpringAI——向量存储(vector store)
  • SpringClound——网关、服务保护和分布式事务
  • Redis-缓存-击穿-分布式锁
  • 使用ros2跑mid360的fastlio2算法详细教程
  • 【数据结构】用堆解决TOPK问题
  • 算法训练营day56 图论⑥ 108. 109.冗余连接系列
  • C++---为什么迭代器常用auto类型?
  • 强、软、弱、虚引用
  • 在 Qt C++ 中利用 OpenCV 实现视频处理技术详解
  • 尝试Claude Code的安装
  • 学习笔记分享——基于STM32的平衡车项目
  • Mac调试ios的safari浏览器打开的页面
  • 电子电气架构 --- 软件项目成本估算
  • 技术攻坚全链铸盾 锁定12月济南第26届食品农产品安全高峰论坛
  • 任务十二 我的页面及添加歌曲功能开发
  • Typescript入门-对象讲解
  • Python量化交易:结合爬虫与TA-Lib技术指标分析
  • Matplotlib数据可视化实战:Matplotlib子图布局与管理入门
  • Ansible 角色管理指南
  • Pandas数据处理与分析实战:Pandas数据处理与Matplotlib可视化入门
  • 0819 使用IP多路复用实现TCP并发服务器