158 lines
4.5 KiB
TypeScript
158 lines
4.5 KiB
TypeScript
import { defineConfig, loadEnv } from "@rsbuild/core"
|
|
import { pluginVue } from "@rsbuild/plugin-vue"
|
|
import AutoImport from "unplugin-auto-import/rspack"
|
|
import Components from "unplugin-vue-components/rspack"
|
|
import { NaiveUiResolver } from "unplugin-vue-components/resolvers"
|
|
|
|
export default defineConfig(({ envMode }) => {
|
|
const { publicVars, rawPublicVars } = loadEnv({
|
|
cwd: process.cwd(),
|
|
mode: envMode,
|
|
})
|
|
|
|
const proxyConfig = {
|
|
target: rawPublicVars["PUBLIC_OJ_URL"],
|
|
changeOrigin: true,
|
|
}
|
|
|
|
const wsProxyConfig = {
|
|
target: rawPublicVars["PUBLIC_WS_URL"],
|
|
ws: true,
|
|
changeOrigin: true,
|
|
}
|
|
return {
|
|
plugins: [pluginVue()],
|
|
tools: {
|
|
rspack: {
|
|
plugins: [
|
|
AutoImport({
|
|
imports: [
|
|
"vue",
|
|
"vue-router",
|
|
"@vueuse/core",
|
|
"pinia",
|
|
{
|
|
"naive-ui": [
|
|
"useDialog",
|
|
"useMessage",
|
|
"useNotification",
|
|
"useLoadingBar",
|
|
],
|
|
},
|
|
{
|
|
from: "naive-ui",
|
|
imports: [
|
|
"DataTableColumn",
|
|
"FormRules",
|
|
"FormItemRule",
|
|
"SelectOption",
|
|
"UploadCustomRequestOptions",
|
|
"UploadFileInfo",
|
|
"MenuOption",
|
|
"DropdownDividerOption",
|
|
"DropdownOption",
|
|
],
|
|
type: true,
|
|
},
|
|
],
|
|
dts: "./src/auto-imports.d.ts",
|
|
}),
|
|
Components({
|
|
resolvers: [NaiveUiResolver()],
|
|
dts: "./src/components.d.ts",
|
|
}),
|
|
],
|
|
},
|
|
},
|
|
html: {
|
|
template: "./index.html",
|
|
},
|
|
source: {
|
|
entry: {
|
|
index: "./src/main.ts",
|
|
},
|
|
define: publicVars,
|
|
},
|
|
performance: {
|
|
chunkSplit: {
|
|
strategy: "split-by-module",
|
|
override: {
|
|
cacheGroups: {
|
|
// ===== 核心框架层 (100+) =====
|
|
// Vue 生态 - 框架基础,最高优先级
|
|
vue: {
|
|
test: /[\\/]node_modules[\\/](vue|vue-router|pinia|@vue|@vueuse)[\\/]/,
|
|
name: "vendor-vue",
|
|
priority: 100,
|
|
},
|
|
// ===== UI 层 (90+) =====
|
|
// Naive UI 及其依赖 - 核心 UI 框架
|
|
ui: {
|
|
test: /[\\/]node_modules[\\/](naive-ui|@css-render|css-render|seemly|vooks|vueuc|treemate|vdirs|evtd)[\\/]/,
|
|
name: "vendor-ui",
|
|
priority: 90,
|
|
},
|
|
// ===== 编辑器层 (70-80) =====
|
|
// CodeMirror - 代码编辑器(使用最频繁)
|
|
editor: {
|
|
test: /[\\/]node_modules[\\/](codemirror|@codemirror|vue-codemirror|y-codemirror\.next)[\\/]/,
|
|
name: "vendor-editor",
|
|
priority: 80,
|
|
},
|
|
// Markdown 编辑器
|
|
mdeditor: {
|
|
test: /[\\/]node_modules[\\/]md-editor-v3[\\/]/,
|
|
name: "vendor-mdeditor",
|
|
priority: 75,
|
|
},
|
|
// WangEditor - 富文本编辑器
|
|
wangeditor: {
|
|
test: /[\\/]node_modules[\\/]@wangeditor-next[\\/]/,
|
|
name: "vendor-wangeditor",
|
|
priority: 70,
|
|
},
|
|
// ===== 功能库层 (50-60) =====
|
|
// Chart.js - 图表库(按需加载)
|
|
charts: {
|
|
test: /[\\/]node_modules[\\/](chart\.js|vue-chartjs|@kurkle|canvas-confetti)[\\/]/,
|
|
name: "vendor-charts",
|
|
priority: 60,
|
|
},
|
|
// Mermaid - 流程图库(按需加载)
|
|
mermaid: {
|
|
test: /[\\/]node_modules[\\/]mermaid[\\/]/,
|
|
name: "vendor-mermaid",
|
|
priority: 55,
|
|
},
|
|
// ===== 通用层 (10) =====
|
|
// 其他常用库 - 兜底分组
|
|
common: {
|
|
test: /[\\/]node_modules[\\/]/,
|
|
name: "vendor-common",
|
|
priority: 10,
|
|
minChunks: 2,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
removeConsole: ["log"],
|
|
},
|
|
resolve: {
|
|
alias: {
|
|
utils: "./src/utils",
|
|
oj: "./src/oj",
|
|
admin: "./src/admin",
|
|
shared: "./src/shared",
|
|
},
|
|
},
|
|
server: {
|
|
port: 5173,
|
|
proxy: {
|
|
"/api": proxyConfig,
|
|
"/public": proxyConfig,
|
|
"/ws": wsProxyConfig,
|
|
},
|
|
},
|
|
}
|
|
})
|