feat: compress dist to gz

This commit is contained in:
engigu
2026-03-11 16:14:05 +08:00
parent d26053a892
commit 388d53058b
2 changed files with 151 additions and 42 deletions
+43 -1
View File
@@ -3,6 +3,45 @@ import vue from '@vitejs/plugin-vue'
import tailwindcss from '@tailwindcss/vite'
import { viteStaticCopy } from 'vite-plugin-static-copy'
import { fileURLToPath, URL } from 'node:url'
import { writeFileSync, readFileSync, readdirSync, statSync, existsSync, unlinkSync } from 'node:fs'
import { join, resolve } from 'node:path'
import { gzipSync } from 'node:zlib'
// Simple inline compression plugin to avoid extra dependencies
const compressionPlugin = () => ({
name: 'compression-plugin',
apply: 'build',
closeBundle: {
order: 'post',
handler: async () => {
const distDir = resolve(process.cwd(), 'dist')
if (!existsSync(distDir)) return
const compressDir = (dir: string) => {
const files = readdirSync(dir)
for (const file of files) {
const filePath = join(dir, file)
const stat = statSync(filePath)
if (stat.isDirectory()) {
compressDir(filePath)
} else if (file.match(/\.(js|css|html|svg|json|vs)$/) && !file.endsWith('.gz')) {
try {
const content = readFileSync(filePath)
if (content.length < 1024) continue // Don't compress very small files
const gzipped = gzipSync(content, { level: 9 })
writeFileSync(`${filePath}.gz`, gzipped)
// Remove original file after successful compression to save space in binary
unlinkSync(filePath)
} catch (e) {
console.error(`Compression failed for ${file}:`, e)
}
}
}
}
compressDir(distDir)
}
}
} as const)
export default defineConfig({
plugins: [
@@ -15,7 +54,8 @@ export default defineConfig({
dest: 'assets'
}
]
})
}),
compressionPlugin()
],
resolve: {
alias: {
@@ -39,6 +79,8 @@ export default defineConfig({
// 浏览器会根据当前页面 URL 解析相对路径
base: './',
build: {
reportCompressedSize: true,
sourcemap: false,
rollupOptions: {
output: {
// 防止生成以 _ 开头的文件,导致被 Cloudflare Pages 或 Github Pages 等静态托管平台拦截并降级返回 HTML