# 离线图标模式使用说明 ## 概述 本项目支持离线图标模式,图标数据可以本地缓存,减少对在线 API 的依赖。 ## 工作原理 1. **优先从本地加载**:客户端优先从 `/public/icons/` 目录加载图标数据 2. **在线回退**:如果本地没有缓存,自动从 Iconify API 获取 3. **服务端处理**:服务端始终使用在线 API(因为服务端无法访问 public 目录) ## 下载图标到本地 ### 快速开始 ```bash # 进入下载脚本目录 cd web/scripts/download-icons # 运行下载脚本(无需额外依赖) node download-icons.cjs ``` ### 下载结果 脚本会下载以下图标集到 `web/public/icons/` 目录: - `ant-design.json` - 830 个 Ant Design 图标 - `simple-icons.json` - 3393 个品牌图标 - `mdi.json` - 9032 个 Material Design Icons - `material-symbols.json` - 15161 个 Material Symbols - `tabler.json` - 5986 个 Tabler Icons - `ph.json` - 9072 个 Phosphor Icons - `lucide.json` - 1669 个 Lucide Icons **总计:45,143 个图标** ## 目录结构 ``` web/ ├── public/ │ └── icons/ │ ├── index.json # 图标索引文件 │ ├── ant-design.json # Ant Design 图标集 │ ├── simple-icons.json # Simple Icons 图标集 │ ├── mdi.json # MDI 图标集 │ ├── material-symbols.json # Material Symbols 图标集 │ ├── tabler.json # Tabler Icons 图标集 │ ├── ph.json # Phosphor Icons 图标集 │ └── lucide.json # Lucide Icons 图标集 └── scripts/ └── download-icons/ ├── download-icons.cjs # 下载脚本 └── README.md ``` ## 使用示例 ```vue ``` ## 支持的图标集 | 图标集 | 数量 | 说明 | |--------|------|------| | ant-design | 830 | Ant Design 官方图标 | | simple-icons | 3393 | 品牌图标(GitHub、Gitee 等) | | mdi | 9032 | Material Design Icons | | material-symbols | 15161 | Google Material Symbols | | tabler | 5986 | Tabler Icons | | ph | 9072 | Phosphor Icons | | lucide | 1669 | Lucide Icons | ## 注意事项 1. **首次加载**:首次使用时需要下载图标数据到本地 2. **网络要求**:如果本地没有缓存,需要网络连接才能获取图标 3. **更新图标**:如需更新图标集,重新运行下载脚本即可 4. **文件大小**:完整的图标集较大,但已优化为 JSON 格式,加载速度快 ## 故障排除 ### 图标不显示 1. 检查浏览器控制台是否有错误信息 2. 确认 `/public/icons/` 目录下有对应的 JSON 文件 3. 检查网络连接(如果本地没有缓存) ### 下载失败 1. 检查网络连接 2. 确认 Node.js 版本 >= 14 3. 尝试手动下载图标数据 ## 性能优化 - 图标数据会在内存中缓存,避免重复加载 - 使用 CDN 加速图标 SVG 的加载 - 已下载 45,143 个图标,覆盖大部分常用场景 ## 技术细节 ### 加载策略 ```typescript // 客户端优先从本地加载 if (process.client) { try { // 1. 尝试从本地加载 icons = await fetch(`/icons/${prefix}.json`) } catch (localError) { // 2. 本地加载失败,回退到在线 API icons = await fetch(`https://api.iconify.design/collection?prefix=${prefix}`) } } else { // 3. 服务端始终使用在线 API icons = await fetch(`https://api.iconify.design/collection?prefix=${prefix}`) } ``` ### 缓存机制 - 内存缓存:避免重复请求 - 本地文件:持久化存储 - 在线回退:确保可用性