Files
tauri-meeting/vite/svgIconPathOption.ts
O昵称重要吗O 78af453fe1 chore: 初始化项目基础结构和资源文件
- 添加项目图标文件(app-icon.png、各平台图标)
- 配置开发环境文件(.env、.nvmrc、.npmrc)
- 添加静态资源文件(背景图片、字体、音频)
- 初始化Tauri后端结构(build.rs、main.rs、模块文件)
- 配置前端项目结构(TypeScript、Vue组件、样式)
- 添加Node.js API服务基础结构
- 配置构建和开发工具(vite、prettier、gitignore)
2026-03-13 10:03:05 +08:00

71 lines
2.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// vite/vite-plugin-icon-dts.ts
import fs from 'fs-extra';
import glob from 'fast-glob';
import path from 'path';
import { useThrottleFn } from '@vueuse/core';
import type { PluginOption } from 'vite';
// glob 默认只支持 / 作为路径分隔符windows 下会出现问题
const normalizePath = (_path: string) => _path.replace(/\\/g, '/');
interface IconDtsOptions {
/** svg 图标文件的路径 */
iconDirs: string;
/** 输出的dts文件的路径 */
dts: string;
/** 监听变化的延迟时间 */
delay: number;
/** 接口名称 */
interfaceName: string;
}
const defualtOptions: IconDtsOptions = {
iconDirs: 'src/icons/',
dts: 'svg-icons.d.ts',
delay: 200,
interfaceName: 'BaseSvgIconPath',
};
/**
* svg 图标路径生成dts文件
*/
export function svgIconPathOption(options: Partial<IconDtsOptions> = {}): PluginOption {
const finalOptions: IconDtsOptions = { ...defualtOptions, ...options };
const { delay, interfaceName } = finalOptions;
let { iconDirs, dts } = finalOptions;
iconDirs = normalizePath(iconDirs);
dts = normalizePath(dts);
let watcher: fs.FSWatcher | undefined = undefined;
return {
name: 'svg-icons-dts',
buildStart: () => {
if (!fs.existsSync(iconDirs)) {
console.error(`${iconDirs}不存在,请检查`);
return;
}
const update = () => {
let assets: string[] = glob.sync(`${iconDirs}/**/*.svg`, {});
assets = assets.map((i: string) => i.replace(iconDirs, '').replace('.svg', '').replace(/\//g, '-').replace(/^-+/, ''));
let output = `interface ${interfaceName} {\n`;
assets.forEach((_item) => {
output += ` '${_item}': string;\n`;
});
output += `}\n`;
const base = path.dirname(dts);
fs.ensureDirSync(base);
fs.writeFileSync(dts, output);
};
const debounceLogic = useThrottleFn(update, delay);
// 监听到文件变化,就重新写一遍
watcher = fs.watch(iconDirs, { recursive: true }, () => {
debounceLogic();
});
update();
},
buildEnd: () => {
watcher?.close();
},
};
}