Fix PWA shortcut icon on Windows
Allow unauthenticated access to favicon and manifest, generate favicon.ico, and add multi-size manifest icons. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import sharp from 'sharp'
|
||||
import toIco from 'to-ico'
|
||||
|
||||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
|
||||
const siteDir = path.join(root, 'assets', 'site')
|
||||
const sourcePng = path.join(siteDir, 'apple-touch-icon.png')
|
||||
|
||||
if (!fs.existsSync(sourcePng)) {
|
||||
console.warn('[generate-icons] 跳过:未找到 apple-touch-icon.png')
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
async function resizePng(size) {
|
||||
return sharp(sourcePng).resize(size, size).png().toBuffer()
|
||||
}
|
||||
|
||||
const icoSizes = [16, 32, 48, 64, 128, 256]
|
||||
const icoBuffers = await Promise.all(icoSizes.map((size) => resizePng(size)))
|
||||
const icoBuffer = await toIco(icoBuffers)
|
||||
|
||||
fs.writeFileSync(path.join(siteDir, 'favicon.ico'), icoBuffer)
|
||||
fs.writeFileSync(path.join(siteDir, 'icon-192.png'), await resizePng(192))
|
||||
fs.writeFileSync(path.join(siteDir, 'icon-512.png'), await resizePng(512))
|
||||
fs.writeFileSync(path.join(siteDir, 'favicon.png'), await resizePng(512))
|
||||
|
||||
console.log('[generate-icons] 已生成 favicon.ico、icon-192.png、icon-512.png')
|
||||
@@ -28,14 +28,21 @@ function resetPublicDir() {
|
||||
}
|
||||
|
||||
resetPublicDir()
|
||||
await import('./generate-icons.mjs')
|
||||
copyDir(path.join(root, 'assets'), path.join(publicDir, 'assets'))
|
||||
copyDir(path.join(root, 'images'), path.join(publicDir, 'images'))
|
||||
|
||||
const siteDir = path.join(root, 'assets', 'site')
|
||||
if (fs.existsSync(siteDir)) {
|
||||
const skipInPublicRoot = new Set(['apple-touch-icon.png'])
|
||||
for (const file of fs.readdirSync(siteDir)) {
|
||||
if (skipInPublicRoot.has(file)) continue
|
||||
fs.copyFileSync(path.join(siteDir, file), path.join(publicDir, file))
|
||||
}
|
||||
fs.copyFileSync(
|
||||
path.join(siteDir, 'icon-512.png'),
|
||||
path.join(publicDir, 'apple-touch-icon.png'),
|
||||
)
|
||||
}
|
||||
|
||||
console.log('[prepare-public] assets、images 与站点图标已同步到 .vitepress/public')
|
||||
|
||||
Reference in New Issue
Block a user