20260806224941

This commit is contained in:
oneao committed 2026-08-06 22:49:41 +08:00
1 parent 6baa339efa
commit 6938deef39
12 files changed
+367 -300

No files matched your search

+50
View File
@@ -0,0 +1,50 @@
/**
* Lucide 图标注册表 — 懒加载所有图标并按名称查找。
* 首次使用时动态 import('@lucide/vue'),之后缓存复用。
* iconMap 为响应式 ref,加载完成后自动触发依赖它的 computed 重算。
*/
import { ref } from "vue";
const iconMap = ref(null);
let loadingPromise = null;
const KNOWN_NON_ICONS = new Set(["createLucideIcon"]);
async function ensureLoaded() {
if (iconMap.value) return iconMap.value;
if (!loadingPromise) {
loadingPromise = import("@lucide/vue").then((mod) => {
const map = {};
for (const [key, component] of Object.entries(mod)) {
if (!KNOWN_NON_ICONS.has(key) && key[0] === key[0].toUpperCase()) {
map[key] = component;
}
}
iconMap.value = map;
return map;
});
}
return loadingPromise;
}
/** 获取所有图标名称(按字母排序),需要 await */
export async function getIconNames() {
const map = await ensureLoaded();
return Object.keys(map).sort();
}
/** 同步获取图标组件;响应式,加载完成后自动重算依赖的 computed */
export function getIcon(name) {
if (!iconMap.value || !name) return null;
return iconMap.value[name] || null;
}
/** 异步获取图标组件 */
export async function getIconAsync(name) {
const map = await ensureLoaded();
return map[name] || null;
}
/** 图标是否已加载完成 */
export function isLoaded() {
return iconMap.value !== null;
}