39 lines
1.4 KiB
JavaScript
39 lines
1.4 KiB
JavaScript
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)}`
|
|
},
|
|
}
|
|
}
|