图标源
要显示图标,Iconify 图标组件必须具有该图标的数据。
有多种方法可以为图标提供数据,每种方法都有其优点和缺点。
在线图标 API
也就是完整版 API,需要依赖网络,这也是 Iconify 最常用、最基本的用法。
优点如下
- 多:Iconify 公共 API 提供了 100 多个图标集,其中包括超过 10 万个图标。
- 快:为缩短加载时间,API 托管在世界不同地区的多台服务器上,实现毫秒内加载。另外Iconify 图标组件还支持浏览器缓存,因此图标数据只需要加载一次。
- 爽:API 是开源的,这意味着您可以在服务器上托管自己的 API 图标集。
原理如下
step1:使用 Iconify 图片组件
<span data-icon="mdi:alert" class="iconify" />
<!-- 或者 -->
<Icon icon="mdi:home" />
step2:从 Iconify API 请求图标数据,并接收响应

step3:处理占位符,替换为 SVG 图标
<svg width="1em" height="1em" viewBox="0 0 24 24" ...>...</svg>
生成离线 icon 数据包
在没有互联网访问的情况下工作的最简单方法。
您可以通过加载图标包来提供图标,而不是从 Iconify API 加载图标数据。
Iconify 提供了以下方案:使用 Iconify API 生成、使用 Iconify JSON 工具。
拿 Iconify API 生成器在线版来演示,输入地址回车,即可得到生成好的离线 icon 数据包:
https://api.iconify.design/mdi.json?icons=account,home&pretty=1
{
"prefix": "mdi",
"icons": {
"account": {
"body": "<path d=\"M12 4a4 4 0 0 1 4 4a4 4 0 0 1-4 4a4 4 0 0 1-4-4a4 4 0 0 1 4-4m0 10c4.42 0 8 1.79 8 4v2H4v-2c0-2.21 3.58-4 8-4z\" fill=\"currentColor\"/>"
},
"home": {
"body": "<path d=\"M10 20v-6h4v6h5v-8h3L12 3L2 12h3v8h5z\" fill=\"currentColor\"/>"
}
},
"width": 24,
"height": 24
}
使用
<span class="iconify" data-icon="mdi:account"></span>
<span class="iconify" data-icon="mdi:home"></span>
<script src="./lib/iconify.js"></script>
<script>
Iconify.addCollection({
"prefix": "mdi",
"icons": {
"account": {
"body": "<path d=\"M12 4a4 4 0 0 1 4 4a4 4 0 0 1-4 4a4 4 0 0 1-4-4a4 4 0 0 1 4-4m0 10c4.42 0 8 1.79 8 4v2H4v-2c0-2.21 3.58-4 8-4z\" fill=\"currentColor\"/>"
},
"home": {
"body": "<path d=\"M10 20v-6h4v6h5v-8h3L12 3L2 12h3v8h5z\" fill=\"currentColor\"/>"
}
},
"width": 24,
"height": 24
});
</script>
React、Vue、Vite 等所有框架都可按照这种方式使用。
下边再介绍几种离线的用法
三方 icon 数据包
简称图标包,本质是一个 NPM 包,包含来自一组图标的图标数据(IconifyIcon 对象),每个文件一个图标。
使用起来较为方便,想用哪些图标,直接yarn add 图标即可。
yarn add --dev @iconify-icons/mdi-light
React 使用
import { Icon } from '@iconify/react'; // 引入icon组件
import homeIcon from '@iconify-icons/mdi-light/home'; // 引入三方icon data包
function App() {
return (
<div className="App">
<Icon icon={homeIcon} /> {/* 使用 */}
</div>
);
}
export default App;
当然,你也可以配合 addIcon 的方式使用,效果一样:
import { Icon, addIcon } from '@iconify/react'; // 引入icon组件
import homeIcon from '@iconify-icons/mdi-light/home'; // 引入三方icon data包
// 单个添加
addIcon('@dshvv:demo:myhome', homeIcon);
function App() {
return (
<div className="App">
<Icon icon="@dshvv:demo:myhome" /> {/* 使用 */}
</div>
);
}
export default App;
Vue 使用
<template>
<div id="app">
<Icon :icon="homeIcon" />
</div>
</template>
<script>
import { Icon } from '@iconify/vue2'; // vue3请引用 @iconify/vue
import homeIcon from '@iconify-icons/mdi-light/home';
export default {
name: 'App',
components: { Icon },
data(){return{homeIcon}}
}
</script>
当然也能配合 addIcon 的方式使用,参考 React 用法。
Vite 用法
<script setup>
import { Icon, addIcon } from '@iconify/vue';
import homeIcon from '@iconify-icons/mdi-light/home';
</script>
<template>
<Icon :icon="homeIcon" />
</template>
注意,这里将不能再用 addIcon,用了也还是会发网络图片请求。
Iconify icon数据集
Iconify 为了让事情变得更容易,提供了最流行的图标集合作为一个包。
有来自 100 多个图标集的超过 10w 个图标,在@iconify/json包中。
Vite 用法
主要利用 @iconify/iconify、Rollup(Vite 的编译器)和 @iconify/json 图标集来配合实现。
yarn add @iconify/iconify
yarn add --dev vite-plugin-purge-icons @iconify/json
// vite.config.js
import PurgeIcons from 'vite-plugin-purge-icons';
export default {
plugins: [
PurgeIcons({
/* PurgeIcons Options */
})
]
}
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import '@purge-icons/generated';
createApp(App).mount('#app');
<script setup>
// 啥也不用写
// Iconify这个已经被挂载到了window上
</script>
<template>
<span class="iconify" data-icon="mdi-light:home"></span>
</template>