Repository navigation
Expand file tree
/
Copy pathvite.config.ts
More file actions
191 lines (187 loc) · 6.44 KB
/
Copy pathvite.config.ts
File metadata and controls
191 lines (187 loc) · 6.44 KB
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
import { defineConfig, Plugin, PluginOption } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import DocServer from './src/platform/node/plugins/DocServer'
import DocBuildMove from './src/platform/node/plugins/DocBuildMove'
import StatisticInfoGenerator from './src/platform/node/plugins/StatisticInfoGenerator'
import CommitTotalTrendGenerator from './src/platform/node/plugins/CommitTotalTrendGenerator'
import BuildTimeGenerator from './src/platform/node/plugins/BuildTimeGenerator'
import AssetRecovery from './src/platform/node/plugins/AssetRecovery'
import VitePluginPrismjs from 'vite-plugin-prismjs'
import DataGenrator from './src/platform/node/plugins/DataGenerator'
import {visualizer} from "rollup-plugin-visualizer"
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { VitePWA } from 'vite-plugin-pwa'
// vite 8 的 runner 配置加载器会把装饰器转译引入的虚拟模块(\0 前缀路径)记入配置依赖,
// dev server 的文件监听对含空字节的路径执行 stat 会直接崩溃,这里将其从依赖列表剔除
const stripVirtualConfigDeps: Plugin = {
name: 'strip-virtual-config-deps',
configResolved(config) {
const deps = config.configFileDependencies as string[]
for (let i = deps.length - 1; i >= 0; i--) {
if (deps[i].includes('\0')) deps.splice(i, 1)
}
}
}
const plugins: Plugin[] = [];
// 打包生产环境才引入的插件
if (process.env.NODE_ENV === "production") {
// 打包依赖展示
// plugins.push(
// visualizer({
// open: true,
// gzipSize: true,
// brotliSize: true,
// filename: "dist/stats.html"
// }) as Plugin
// );
}
// https://vitejs.dev/config/
export default defineConfig({
resolve: {
alias: {
"@": path.resolve(import.meta.dirname, "src")
},
},
css: {
preprocessorOptions: {
less: {
// 让每个 .less / SFC <style lang="less"> 都能直接用 @bp-mobile/@bp-desktop
// 断点变量(与 src/const/breakpoints.ts 同源)而无需逐文件 @import。
// paths 让 @import "breakpoints.less" 从 src 解析; 跳过文件自身避免自导入。
paths: [path.resolve(import.meta.dirname, "src")],
additionalData: (source: string, filename: string) =>
filename.replace(/\\/g, "/").endsWith("src/breakpoints.less")
? source
: `@import "breakpoints.less";\n${source}`,
},
},
},
server: {
fs: {
strict: false
},
host: '0.0.0.0',
hmr: { clientPort: process.env.CODESPACES ? 443 : undefined }
},
// E2E(Playwright)与既有 HtmlEntryE2E 默认 baseUrl 都指向 4391
// vite preview 默认端口是 4173 这里显式对齐 strictPort 让端口被占用时直接报错而非静默改端口
preview: {
port: 4391,
strictPort: true,
host: '0.0.0.0'
},
plugins: [
stripVirtualConfigDeps,
...plugins,
VitePWA({
// prompt模式: 配合main.ts的onNeedRefresh提示用户刷新 避免静默接管导致页面无预警重载
registerType: 'prompt',
includeAssets: ['favicon.ico'],
workbox: {
// 只预缓存应用入口,避免首次访问就在后台下载全站约10MB资源
// (含mermaid/echarts/cytoscape等懒加载chunk和300+个文档JSON)
globPatterns: ['**/index.html'],
// .html是真实静态入口 导航不走app shell 保证直接访问/查看源码拿到带正文的静态文件
// 无扩展名路径(/ /cluster 及旧链接)仍由app shell接管
navigateFallbackDenylist: [/\.html(\?|$)/, /[?&]__asset_retry=/],
runtimeCaching: [
{
// 文档页导航网络优先 离线时回退到已访问过的缓存副本
urlPattern: /\.html(\?|$)/,
handler: 'NetworkFirst',
options: {
cacheName: 'doc-pages',
networkTimeoutSeconds: 3,
expiration: { maxEntries: 100 },
cacheableResponse: { statuses: [0, 200] },
},
},
{
// 带内容哈希的静态资源不会变更,缓存优先
urlPattern: /\/resource\/.*\.(?:js|css)$/,
handler: 'CacheFirst',
options: {
cacheName: 'hashed-assets',
expiration: { maxEntries: 300, maxAgeSeconds: 30 * 24 * 60 * 60 },
cacheableResponse: { statuses: [0, 200] },
},
},
{
// 文档与统计数据按需缓存,先返回缓存同时后台刷新
urlPattern: /\.json$/,
handler: 'StaleWhileRevalidate',
options: {
cacheName: 'doc-data',
expiration: { maxEntries: 500 },
cacheableResponse: { statuses: [0, 200] },
},
},
],
},
manifest: {
name: '知识体系',
short_name: 'PKS',
description: '知识体系',
display: 'standalone',
background_color: '#F1F5F9',
theme_color: '#ffffff',
icons: [
{
src: 'logo-192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: 'logo-512.png',
sizes: '512x512',
type: 'image/png'
}
]
}
}),
vue(),
AssetRecovery(),
DocServer(),
BuildTimeGenerator(),
{
...DocBuildMove(),
enforce: 'post',
apply: 'build'
},
{
...StatisticInfoGenerator(),
apply: 'build'
},
{
...CommitTotalTrendGenerator(),
apply: 'build'
},
{
...DataGenrator(),
apply: 'build'
},
{
...VitePluginPrismjs({
// 笔记高频语言补全: bash/yaml/docker/nginx/http/properties
// markup已含html/xml/svg; line-numbers插件只对highlightElement生效 运行时走字符串API 引入无效 故移除
"languages": ["javascript", "css", "markup", "java", "sql",
'c', 'go', 'python', 'ts', 'ruby', 'io', 'scala', 'groovy',
'kotlin', 'ini', 'json', 'graphql', 'haskell', 'clojure', 'rust',
'bash', 'yaml', 'docker', 'nginx', 'http', 'properties'],
}),
},
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
],
build: {
assetsDir: "resource",
emptyOutDir: false,
},
})