问题1:是否加前缀mdi,有什么区别?
bash
<zero-icon name="magnify-plus-outline" :iconSet="mdiIcons" size="72rpx" color="#666666>
<zero-icon name="mdi:magnify-plus-outline" size="72rpx" color="#666666" />
两种加载方式有什么区别?
这两种写法的主要区别在于图标的资源来源 和解析方式不同:
🔍 核心区别对比
| 对比维度 | 第一种写法 | 第二种写法 |
|---|---|---|
| 📦 引用方式 | 使用 Vue/React 的组件 prop 传递 | 直接在属性中字符串声明图标名 |
| 🎯 图标集指定 | 通过单独的 :iconSet="mdiIcons" prop 传入图标集对象 |
使用带前缀的字符串 "mdi:magnify-plus-outline" |
| ⚙️ 技术原理 | 需要在组件中预先导入并绑定 mdiIcons 对象 |
组件内部自动解析前缀,无需额外导入 |
| 📝 代码复杂度 | 较高(需要 import + data/computed 绑定) | 较低(直接写字符串即可) |
| 🔄 灵活性 | 适合动态切换图标集(如 mdi ↔ fa ↔ ion) | 适合固定使用某个图标集的图标 |
💻 具体代码示例说明
第一种写法(需要预先绑定图标集)
vue
<template>
<!-- 使用 prop 传入图标集对象 -->
<zero-icon
name="magnify-plus-outline"
:iconSet="mdiIcons" <!-- 需要传入对象 -->
size="72rpx"
color="#666666"
/>
</template>
<script>
import { mdiIcons } from 'some-icon-library' // 需要导入
export default {
data() {
return {
mdiIcons // 绑定到模板
}
}
}
</script>
第二种写法(自带前缀,自动解析)
vue
<template>
<!-- 直接在前缀中指定图标集 -->
<zero-icon
name="mdi:magnify-plus-outline" <!-- 自带 mdi: 前缀 -->
size="72rpx"
color="#666666"
/>
</template>
<script>
// 无需任何导入,组件内部自动处理
export default {
// 干干净净
}
</script>
🎯 使用建议
-
推荐使用第二种(带前缀写法),除非你有特殊需求:
- ✅ 代码更简洁
- ✅ 减少导入依赖
- ✅ 避免 data 绑定开销
- ✅ 可读性更强(一眼看出是什么图标集)
-
第一种写法的适用场景:
- 需要动态切换图标集(如主题切换 mdi ↔ fa)
- 图标集对象需要响应式更新
- 组件设计要求分离图标名和图标集
⚠️ 潜在问题
如果第一种写法报错或图标不显示,检查:
- 是否正确导入并绑定了
mdiIcons对象 - 对象中是否包含
"magnify-plus-outline"这个图标 - 组件库版本是否支持这种分离写法
如果你用的是 @vueform/icon 或 unplugin-icons 这类库,通常第二种写法是官方推荐的标准用法。
问题2:那种 pages包 size小?
从包体积大小的角度来看,按需请求(第二种写法)的体积会更小,尤其是在小程序这种对主包大小有严格限制的环境下。
主要区别在于图标资源的加载方式,这直接决定了小程序最终的打包体积:
| 对比维度 | 第一种写法(本地图标集) | 第二种写法(按需/API请求) |
|---|---|---|
| 📦 体积影响 | 增大主包体积 | 不增加主包体积 |
| ⚙️ 工作原理 | 需提前安装 @iconify-json/mdi 等依赖,将整套图标库的 JSON 数据打包进项目代码。 |
组件在需要时,会向 Iconify 官方 CDN 或指定的 API 请求单个 SVG 文件,无需在本地存储数据。 |
| 🌐 运行方式 | 离线可用,不依赖网络。 | 依赖网络,首次加载特定图标时需从云端获取。 |
| 🔄 更新方式 | 需要重新打包发布小程序。 | 图标库在线更新,无需改动代码。 |
📝 两种方式的具体分析
-
第一种(:iconSet 传对象)是"本地大包"模式
- 当你通过
:iconSet="mdiIcons"这种方式传入图标集对象时,通常意味着你需要先npm install一个包含mdi图标的本地包(如@iconify-json/mdi)。 - 体积代价 :这个包里包含了
mdi全套图标的数据(可能有上万甚至几十万个图标的数据),即便你只使用其中一个放大镜图标,整套数据也会被你的小程序打包工具分析并打包进去。 - 结果:这会直接导致你微信小程序的主包体积增大,很容易触及 2MB 的限制。
- 当你通过
-
第二种(name="mdi:xxx")是"按需请求"模式
- 这是
zero-icon这类组件推荐的用法。 - 体积优势 :当你使用
name="mdi:magnify-plus-outline"时,组件内部不会去读取任何本地的图标数据。在构建打包时,这段代码仅会被识别为一个字符串属性,不会引起任何额外的图标数据被打包进产物。 - 结果:对你的主包体积没有负面影响。图标资源被放到了"云端",实现了代码与资源的分离。
- 这是
💡 选型建议
- 追求极致包体积(推荐) :对于微信小程序开发,控制包体积是首要任务。强烈建议使用第二种写法 (即
name="mdi:magnify-plus-outline")。唯一需要注意的是,你需要将 Iconify 的官方 API 域名(https://api.iconify.design)配置到微信小程序的后台请求域名白名单中。 - 离线使用特殊场景:如果你的小程序需要运行在完全内网、无互联网连接的环境中,并且包体积比较宽裕,再考虑第一种本地图标集的方式。否则,出于性能和包大小的考虑,在线请求是更优解。
问题3:组件在需要时,会向 Iconify 官方 CDN 或指定的 API 请求单个 SVG 文件, Iconify 官方 CDN 若停止维护了,怎么办?
如果担心 Iconify 官方 CDN 停止维护,解决方案也很直接:把控制权拿回自己手里 。zero-icon 组件本身就支持切换数据源,主要有下面两种替代方案:
担心官方CDN停止维护
选择替代方案
自建API服务
(推荐,兼顾灵活性与包体积)
切换本地图标集
(完全离线,但增大小程序包体积)
部署私有 Iconify API
apiUrl指向自建地址
安装图标集依赖
通过iconSet prop传入
组件使用方式不变
依赖自建服务,包体积小
完全离线可用
不依赖任何外部服务
方案一:自建 Iconify API 服务(推荐)
这是官方文档推荐的方案,适合对稳定性要求较高的生产环境。
做法很简单:
- 部署一个自己的 Iconify API 服务(官方有开源方案,可私有化部署)
- 在
zero-icon组件中通过apiUrl属性指向你的自建地址:
vue
<zero-icon
name="mdi:magnify-plus-outline"
apiUrl="https://your-icon-api.yourcompany.com"
size="72rpx"
color="#666666"
/>
也可以全局配置,避免每个组件都要写:
js
// 在 main.js 或 app.vue 中全局设置
import { setIconApiUrl } from '@/uni_modules/zero-icon'
setIconApiUrl('https://your-icon-api.yourcompany.com')
这个方案的优势:
- ✅ 组件使用方式完全不变,还是
name="mdi:xxx"这种简洁写法 - ✅ 依然保持按需请求,不增大主包体积
- ✅ 图标数据由你自己控制,不依赖第三方服务
- ✅ 可以走内网,速度更快更稳定
方案二:切换为本地图标集(完全离线)
如果项目要运行在完全内网、无互联网连接的环境中,或者你不想维护任何后端服务,可以改用本地图标集模式。
做法:
-
安装需要的图标集依赖:
bashnpm install @iconify-json/mdi -
在组件中引入并使用
iconSetprop:
vue
<script setup>
// 导入 mdi 整套图标集的数据
import mdiIcons from "@iconify-json/mdi/icons.json";
</script>
<template>
<zero-icon
name="magnify-plus-outline" <!-- 注意:不需要 mdi: 前缀了 -->
:iconSet="mdiIcons"
size="72rpx"
color="#666666"
/>
</template>
这个方案的代价:
- ⚠️ 会显著增大主包体积------因为你把整套图标集(可能包含上万个图标的数据)都打包进了项目
- 建议使用 iconify-json 按需裁剪工具 精简到只保留你实际用到的图标
- 适合小规模、图标数量有限的项目
💡 我的建议
| 场景 | 推荐方案 |
|---|---|
| 公司内部系统、商业项目 | 自建 API------一劳永逸,不依赖外部 |
| 个人项目、Demo | 先用官方 CDN,真的停了再切也不迟 |
| 纯内网环境、离线应用 | 本地图标集 + 按需裁剪 |
另外,官方 CDN 作为一个被大量项目依赖的基础设施,突然停服的概率其实很低。很多大厂的图标方案也是基于 Iconify 生态的。如果你只是个人项目,不需要过度担心;如果是公司商业项目,花半天时间搭个私有 API 服务会更稳妥。
你想进一步了解自建 Iconify API 的具体部署步骤吗?我可以帮你整理一份操作指南。