内网环境: vue3中使用 iconify 的在线图标

为什么要使用在线图标?

减少项目本身的体积

如何找到你需要的图标

Iconify - home of open source icons

使用图标: material-symbols:10k

图标名格式: 图标集:图标名

html 复制代码
<iconify-icon icon="material-symbols:10k" style="font-size: 48px; color: red;"> </iconify-icon>

vue3 默认通过 iconify 官方api服务使用在线图标

sql 复制代码
pnpm add @iconify/vue
ts 复制代码
import { Icon } from '@iconify/vue';
import type { App } from 'vue';

export function setupIconify(app: App) {
  app.component('IconifyVue', Icon)
  app.component('iconify-vue', Icon)
}
html 复制代码
<div>
  <!-- 基础用法 -->
  <iconify-icon icon="mdi:home"></iconify-icon>

  <!-- 修改颜色和大小 (通过 CSS 样式) -->
  <iconify-icon icon="mdi:account-circle" style="font-size: 48px; color: red;"> </iconify-icon>

  <!-- 垂直对齐 (inline 模式) -->
  <p>这是文字 <iconify-icon icon="mdi:arrow-right" inline></iconify-icon> 更多文字</p>
</div>

内网通过docker搭建 iconify api 服务

docker-compose.yml

yaml 复制代码
networks:
  local-docker-network:
    external: true # 声明网络为外部已存在

services:
  server:
    image: iconify/api:latest
    container_name: iconify-api
    restart: always
    networks:
      - local-docker-network
    volumes:
      # 关键配置:将宿主机的 ./custom-icons 目录挂载到容器的 /data/iconify-api/icons 目录
      # :ro 表示只读,防止容器内误修改
      - ./custom-icons:/data/iconify-api/icons:ro
      - ./iconify-cache:/data/iconify-api/cache
    ports:
      # 将服务的3000端口, 映射到本地的4100端口, 外部通过 4100 端口访问这个docker服务
      - "4100:3000"
  • 以前台方式启动服务: docker compose up
  • 以后台方式启动服务: docker compose start

验证服务是否正常启动, 浏览器直接访问: http://localhost:4100/mdi.json?icons=home, 应该会返回类似下面的json内容

json 复制代码
{"prefix":"mdi","lastModified":1737398331,"aliases":{},"width":24,"height":24,"icons":{"home":{"body":"<path fill="currentColor" d="M10 20v-6h4v6h5v-8h3L12 3L2 12h3v8z"/>"}}}

通过@iconify/vue 的 addAPIProvider 配置私服 api 地址

ts 复制代码
import { Icon, addAPIProvider } from '@iconify/vue';
import type { App } from 'vue';

// 1. 设置自定义 API 地址 (指向你的内网 Docker 服务)
// 这里将默认的空前缀(所有图标集)指向你的内网 IP

const iconifyApiUrl = import.meta.env.VITE_ICONIFY_API_URL

// 使用 addAPIProvider 设置默认 provider
if (iconifyApiUrl) {
  // 这里 '' 表示访问任意 iconify 图标, 都走 http://10.175.136.71:4100 这个地址
  // 此时 <iconify-icon icon="mdi:home"></iconify-icon> 会去请求: http://10.175.136.71:4100/mdi.json?icons=account-circle%2Carrow-right%2Chome
  addAPIProvider('', {
    // 这里最后不要有 / 
    resources: ['http://10.175.136.71:4100']
  });
  console.log('[Iconify] Added API provider for default:', iconifyApiUrl);
  
  // 也可以配置为 'local'. 此时表示仅 @local:xxx 的图标,才走 http://10.175.136.71:4100 , 其他图标请求,依旧走官方api服务
  // 此时 <iconify-icon icon="@local:mdi:home"></iconify-icon> 才会去请求: http://10.175.136.71:4100/mdi.json?icons=account-circle%2Carrow-right%2Chome
  // addAPIProvider('local', {
  //   resources: ['http://10.175.136.71:4100']
  // });
}

export function setupIconify(app: App) {
  app.component('IconifyVue', Icon)
  app.component('iconify-vue', Icon)
}

通过 iconify api 服务加载自定义图标

创建 my-custom-icons.json 文件, 并放入custom-icons目录, 然后就能通过如下方式使用了

html 复制代码
<iconify-icon icon="my-custom:logo"></iconify-icon>
<iconify-icon icon="my-custom:user-settings"></iconify-icon>

my-custom-icons.json 文件内容

json 复制代码
{ 
    "prefix": "my-custom", 
    "icons": { 
        "logo": { 
            "body": "<path d='M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5' stroke='currentColor' stroke-width='2' fill='none'/>" 
         }, 
         "user-settings": { 
             "body": "<circle cx='12' cy='12' r='3'/><path d='M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 8.91 4 1.65 1.65 0 0 0 10.4 2h1.2c.7 0 1.36.42 1.59 1.09l.06.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82 1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z' fill='currentColor'/>" 
         } 
    }, 
    "width": 24, 
    "height": 24 
}

使用工具生成 my-custom-icons.json 文件

shell 复制代码
npx @iconify/tools convert ./path/to/your/svg-folder --output ./my-custom-icons.json
相关推荐
java1234_小锋2 小时前
【技术专题】HTML5 网页技术 - HTML5 Canvas 基础以及动画入门
前端·html·html5
知了学历孙老师5 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
ShineWinsu7 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说7 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
程序员老赵9 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot9 小时前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot9 小时前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI10 小时前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance10 小时前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写10 小时前
WebCodecs选编码器,探测之后还要验解码和播放
前端