-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvite.config.js
160 lines (145 loc) · 5.32 KB
/
vite.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import { copyFileSync, mkdirSync, renameSync, rmdirSync, readdirSync } from 'fs'
import { fileURLToPath } from 'url'
import { dirname } from 'path'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
// 复制文件的辅助函数
function copyFiles(src, dest) {
try {
copyFileSync(src, dest)
} catch (err) {
console.error(`Error copying ${src} to ${dest}:`, err)
}
}
// 移动文件的辅助函数
function moveFile(src, dest) {
try {
renameSync(src, dest)
} catch (err) {
console.error(`Error moving ${src} to ${dest}:`, err)
}
}
// 删除空目录的辅助函数
function removeEmptyDirectories(directory) {
try {
const files = readdirSync(directory)
for (const file of files) {
const fullPath = resolve(directory, file)
if (readdirSync(fullPath).length === 0) {
rmdirSync(fullPath)
}
}
if (readdirSync(directory).length === 0) {
rmdirSync(directory)
}
} catch (err) {
console.error(`Error removing empty directories in ${directory}:`, err)
}
}
export default defineConfig({
plugins: [
vue(),
{
name: 'post-build',
closeBundle() {
// 确保目标目录存在
const dirs = ['dist/icons', 'dist/popup', 'dist/content']
dirs.forEach(dir => {
try {
mkdirSync(dir, { recursive: true })
} catch (err) {
console.error(`Error creating directory ${dir}:`, err)
}
})
// 复制静态文件
copyFiles(
resolve(__dirname, 'src/manifest.json'),
resolve(__dirname, 'dist/manifest.json')
)
// 复制图标
const icons = ['16', '19','32','38','48', '128']
icons.forEach(size => {
copyFiles(
resolve(__dirname, `public/icons/icon${size}.png`),
resolve(__dirname, `dist/icons/icon${size}.png`)
)
})
// 移动 HTML 文件到正确位置
moveFile(
resolve(__dirname, 'dist/src/popup/index.html'),
resolve(__dirname, 'dist/popup/index.html')
)
copyFiles(
resolve(__dirname, 'src/background.js'),
resolve(__dirname, 'dist/background.js')
)
// 清理空目录
try {
// 移除 dist/src/popup
const popupDir = resolve(__dirname, 'dist/src/popup')
if (readdirSync(popupDir).length === 0) {
rmdirSync(popupDir)
}
// 移除 dist/src
const srcDir = resolve(__dirname, 'dist/src')
if (readdirSync(srcDir).length === 0) {
rmdirSync(srcDir)
}
} catch (err) {
console.error('Error cleaning empty directories:', err)
}
console.log('Post-build file operations completed')
}
}
],
build: {
outDir: 'dist',
emptyOutDir: true,
cssCodeSplit: false,
rollupOptions: {
input: {
popup: resolve(__dirname, 'src/popup/index.html'),
content: resolve(__dirname, 'src/content/content.js')
},
output: {
// JS 文件输出配置
entryFileNames: (chunkInfo) => {
if (chunkInfo.name === 'content') {
return 'content/[name].js'
}
return 'popup/[name].js'
},
// 代码分割后的 chunk 输出配置
chunkFileNames: (chunkInfo) => {
if (chunkInfo.name.includes('content')) {
return 'content/chunks/[name].[hash].js'
}
return 'popup/chunks/[name].[hash].js'
},
// 资源文件输出配置
assetFileNames: (assetInfo) => {
const info = assetInfo.name.split('.')
const ext = info[info.length - 1]
// content 相关资源
if (assetInfo.name.includes('content')) {
return `content/[name][extname]`
}
// popup 相关资源
if (ext === 'css') {
return `popup/styles/[name][extname]`
}
if (['png', 'jpg', 'jpeg', 'gif', 'svg'].includes(ext)) {
return `popup/images/[name][extname]`
}
if (['woff', 'woff2', 'ttf', 'eot'].includes(ext)) {
return `popup/fonts/[name][extname]`
}
return `popup/assets/[name].[hash][extname]`
}
}
}
}
})