const { readFileSync, existsSync } = require('fs'); const path = require('path'); const {generate} = require('./utils/generate') // 插件的名称 const pluginName = 'vite-plugin-limeIcon'; // 要监听的组件的名称 const targetComponent = 'l-icon'; function parseAttributes(attributesStr) { if (!attributesStr.includes("'")) { return [attributesStr] } const regex = /'([^']+)'/g; const matches = attributesStr.match(regex); if (matches) { const targetContent = matches.map(item => item.replace(/'/g, '')); return targetContent } else { return [attributesStr] } } function extractAttributes(content) { const regex = /]*(:?)name=["]([^"]+)["][^>]*>/g; // //g //]+)\s*\/?>/g; let attributes = []; const attributesSet = new Set(attributes); let match; while ((match = regex.exec(content)) !== null) { const attributesStr = match[2]; const attributesList = parseAttributes(attributesStr); for (const attribute of attributesList) { attributesSet.add(attribute); // 添加新属性到Set中 } } attributes = [...attributesSet]; return attributes; } // 遍历每个文件并检查是否使用了目标组件 let iconCollections = {} let files = {} let timer = null function processFile(file, options) { const filePath = path.resolve(file); const content = readFileSync(filePath, 'utf-8'); // 检查文件是否包含目标组件 if (content.includes(targetComponent) && (!file.includes('l-icon.vue') || !file.includes('l-icon.uvue')) && files[file] !== content) { const icons = extractAttributes(content) if(icons && icons.length) { files[file] = content iconCollections[file] = icons } Object.values(iconCollections).forEach(icons => { if(options.icons) { options.icons = options.icons.concat(icons); } else { options.icons = icons } }) clearTimeout(timer) timer = setTimeout(() => { options.icons = Array.from(new Set(options.icons)) generate(options) },500) } } // 插件的钩子函数 function vitePlugin(options = {}) { const {useInDevelopment = false} = options const isDev = process.env.NODE_ENV === 'development' return { name: pluginName, transform(code, id) { if (id.endsWith('.vue') && (useInDevelopment && isDev || !useInDevelopment && !isDev)) { // 处理Vue文件 processFile(id, options); } }, }; } module.exports = vitePlugin;