import { readdirSync, readFileSync } from 'node:fs' import { resolve } from 'node:path' const VIRTUAL_ID = 'virtual:tongji-endless-food-images' const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_ID}` /** * 将游戏食物图内联到 tongji 分包代码。 * 微信代码质量会累计整个代码包内的图片/音频体积;源 JPG 继续保留,便于后续增补和迁移。 */ export function endlessGameFoodInlinePlugin() { return { name: 'tongji-endless-game-food-inline', enforce: 'pre', resolveId(id) { return id === VIRTUAL_ID ? RESOLVED_VIRTUAL_ID : null }, load(id) { if (id !== RESOLVED_VIRTUAL_ID) return null const foodDir = resolve(process.cwd(), 'tongji/endless-game/assets/food') const images = Object.fromEntries( readdirSync(foodDir) .filter((fileName) => fileName.toLowerCase().endsWith('.jpg')) .sort() .map((fileName) => { const filePath = resolve(foodDir, fileName) this.addWatchFile(filePath) const key = fileName.replace(/\.jpg$/i, '') const dataUrl = `data:image/jpeg;base64,${readFileSync(filePath).toString('base64')}` return [key, dataUrl] }) ) return `export default ${JSON.stringify(images)}` }, } }