From a7942616bf61b3ed9985ab4043432545a52fb34a Mon Sep 17 00:00:00 2001
From: zhangtao <9480807882@qq.com>
Date: Mon, 28 Jul 2025 00:23:29 +0800
Subject: [PATCH] =?UTF-8?q?feat(=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6):=20?=
=?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6=E7=95=8C?=
=?UTF-8?q?=E9=9D=A2=E5=B9=B6=E6=9B=BF=E6=8D=A2cron=E7=BB=84=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
refactor(IntervalTab): 优化时间间隔选择组件样式和功能
feat(任务管理): 使用vue3-cron-plus替换原有cron组件
fix(样式): 修复导航栏下拉菜单图标颜色问题
chore(依赖): 更新package.json依赖项和node版本要求
perf(构建): 优化vite配置和代码分割策略
---
frontend/package.json | 6 +-
frontend/src/App.vue | 1 -
frontend/src/components/IntervalTab/index.vue | 173 +++++++++++++++---
.../NavBar/components/NavbarActions.vue | 14 +-
frontend/src/plugins/index.ts | 6 +-
frontend/src/styles/variables.scss | 3 +
frontend/src/types/auto-imports.d.ts | 2 +-
frontend/src/types/components.d.ts | 101 +++++-----
frontend/src/types/vue3-cron-plus-picker.d.ts | 20 --
frontend/src/types/vue3-cron-plus.d.ts | 12 ++
frontend/src/views/monitor/job/index.vue | 117 ++++++------
frontend/vite.config.ts | 49 ++++-
12 files changed, 326 insertions(+), 178 deletions(-)
delete mode 100644 frontend/src/types/vue3-cron-plus-picker.d.ts
create mode 100644 frontend/src/types/vue3-cron-plus.d.ts
diff --git a/frontend/package.json b/frontend/package.json
index 994a1072..4a368293 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -37,7 +37,7 @@
"vue-draggable-plus": "^0.6.0",
"vue-i18n": "^11.1.10",
"vue-router": "^4.5.1",
- "vue3-cron-plus-picker": "^1.0.2"
+ "vue3-cron-plus": "^0.1.9"
},
"devDependencies": {
"@iconify/utils": "^2.3.0",
@@ -45,7 +45,7 @@
"@types/node": "^22.16.5",
"@types/nprogress": "^0.2.3",
"@types/qs": "^6.14.0",
- "@vitejs/plugin-vue": "^6.0.0",
+ "@vitejs/plugin-vue": "^5.2.4",
"sass": "^1.89.2",
"terser": "^5.43.1",
"typescript": "^5.8.3",
@@ -55,7 +55,7 @@
"vite": "^6.3.5"
},
"engines": {
- "node": ">=20.0.0",
+ "node": ">=18.0.0",
"npm": ">=10.0.0"
},
"repository": "https://gitee.com/tao__tao/fastapi_vue3_admin.git",
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index 0a42330e..5037385a 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -17,7 +17,6 @@ import { useAppStore, useSettingsStore } from "@/store";
import { defaultSettings } from "@/settings";
import { ThemeMode } from "@/enums/settings/theme.enum";
import { ComponentSize } from "@/enums/settings/layout.enum";
-import { ElNotification } from 'element-plus'
const appStore = useAppStore();
const settingsStore = useSettingsStore();
diff --git a/frontend/src/components/IntervalTab/index.vue b/frontend/src/components/IntervalTab/index.vue
index c078d1a9..75e2b752 100644
--- a/frontend/src/components/IntervalTab/index.vue
+++ b/frontend/src/components/IntervalTab/index.vue
@@ -1,37 +1,74 @@
-
-
-
- {{ second }}
+
+
+
+ *
+ {{ second }}
-
-
- {{min}}
+
+
+ *
+ {{min}}
-
-
- {{hour}}
+
+
+ *
+ {{hour}}
-
-
- {{day}}
+
+
+ *
+ {{day}}
-
-
- {{week}}
+
+
+ *
+ {{week.label}}
+
+
+ 取消
+ 确认
+
-
+.interval-tab-form {
+ width: 100%;
+ flex-wrap: wrap;
+ gap: 16px 8px;
+}
+
+.form-item {
+ width: calc(20% - 8px);
+ min-width: 120px;
+}
+
+.form-actions {
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
+ margin-top: 16px;
+ gap: 8px;
+}
+
+// 响应式调整
+@media (max-width: 768px) {
+ .form-item {
+ width: calc(33.33% - 8px);
+ }
+}
+
+@media (max-width: 480px) {
+ .form-item {
+ width: calc(50% - 8px);
+ }
+}
+
\ No newline at end of file
diff --git a/frontend/src/layouts/components/NavBar/components/NavbarActions.vue b/frontend/src/layouts/components/NavBar/components/NavbarActions.vue
index 3954b486..e043912c 100644
--- a/frontend/src/layouts/components/NavBar/components/NavbarActions.vue
+++ b/frontend/src/layouts/components/NavBar/components/NavbarActions.vue
@@ -152,7 +152,7 @@ function handleDocumentClick() {
* Gitee 项目地址
*/
function handleGiteeClick() {
- window.open('https://element-plus-admin-doc.cn/')
+ window.open('https://gitee.com/tao__tao/fastapi_vue3_admin')
}
/**
@@ -283,7 +283,7 @@ function logout() {
display: flex;
align-items: center;
justify-content: center;
- // height: 100%;
+ height: 100%;
padding: 0 8px;
&__avatar {
@@ -344,4 +344,14 @@ function logout() {
}
}
+// 确保下拉菜单中的图标不受影响
+:deep(.el-dropdown-menu) {
+ [class^="i-svg:"] {
+ color: var(--el-text-color-regular) !important;
+
+ &:hover {
+ color: var(--el-color-primary) !important;
+ }
+ }
+}
diff --git a/frontend/src/plugins/index.ts b/frontend/src/plugins/index.ts
index 15f81363..56b6be51 100644
--- a/frontend/src/plugins/index.ts
+++ b/frontend/src/plugins/index.ts
@@ -6,7 +6,7 @@ import { setupStore } from "@/store";
import { setupElIcons } from "./icons";
import { setupPermission } from "./permission";
import { InstallCodeMirror } from "codemirror-editor-vue3";
-// import ElementPlus from 'element-plus'
+import ElementPlus from 'element-plus'
export default {
install(app: App) {
@@ -22,7 +22,7 @@ export default {
setupPermission();
// 注册 CodeMirror
app.use(InstallCodeMirror);
- // // 注册 ElementPlus
- // app.use(ElementPlus);
+ // 注册 ElementPlus
+ app.use(ElementPlus);
},
};
diff --git a/frontend/src/styles/variables.scss b/frontend/src/styles/variables.scss
index c907f33a..ff74825c 100644
--- a/frontend/src/styles/variables.scss
+++ b/frontend/src/styles/variables.scss
@@ -16,6 +16,9 @@
"info": (
"base": #a9aeb8,
),
+ "default": (
+ "base": #f5f5f5,
+ ),
),
$bg-color: (
diff --git a/frontend/src/types/auto-imports.d.ts b/frontend/src/types/auto-imports.d.ts
index d473968a..f9d5d930 100644
--- a/frontend/src/types/auto-imports.d.ts
+++ b/frontend/src/types/auto-imports.d.ts
@@ -626,4 +626,4 @@ declare module 'vue' {
readonly watchWithFilter: UnwrapRef
readonly whenever: UnwrapRef
}
-}
+}
\ No newline at end of file
diff --git a/frontend/src/types/components.d.ts b/frontend/src/types/components.d.ts
index 76ca6ee3..bcee9063 100644
--- a/frontend/src/types/components.d.ts
+++ b/frontend/src/types/components.d.ts
@@ -8,18 +8,18 @@ export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
- AppLink: typeof import('./src/components/AppLink/index.vue')['default']
- AppLogo: typeof import('./src/layouts/components/AppLogo/index.vue')['default']
- AppMain: typeof import('./src/layouts/components/AppMain/index.vue')['default']
- BasicMenu: typeof import('./src/layouts/components/Menu/BasicMenu.vue')['default']
- Breadcrumb: typeof import('./src/components/Breadcrumb/index.vue')['default']
- CommonWrapper: typeof import('./src/components/CommonWrapper/index.vue')['default']
- ConfigInfoDrawer: typeof import('./src/views/system/config/components/ConfigInfoDrawer.vue')['default']
- CopyButton: typeof import('./src/components/CopyButton/index.vue')['default']
- DarkModeSwitch: typeof import('./src/components/DarkModeSwitch/index.vue')['default']
- DataDrawer: typeof import('./src/views/system/dict/components/DataDrawer.vue')['default']
- DeptTree: typeof import('./src/views/system/user/components/DeptTree.vue')['default']
- ECharts: typeof import('./src/components/ECharts/index.vue')['default']
+ AppLink: typeof import('./../components/AppLink/index.vue')['default']
+ AppLogo: typeof import('./../layouts/components/AppLogo/index.vue')['default']
+ AppMain: typeof import('./../layouts/components/AppMain/index.vue')['default']
+ BasicMenu: typeof import('./../layouts/components/Menu/BasicMenu.vue')['default']
+ Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default']
+ CommonWrapper: typeof import('./../components/CommonWrapper/index.vue')['default']
+ ConfigInfoDrawer: typeof import('./../views/system/config/components/ConfigInfoDrawer.vue')['default']
+ CopyButton: typeof import('./../components/CopyButton/index.vue')['default']
+ DarkModeSwitch: typeof import('./../components/DarkModeSwitch/index.vue')['default']
+ DataDrawer: typeof import('./../views/system/dict/components/DataDrawer.vue')['default']
+ DeptTree: typeof import('./../views/system/user/components/DeptTree.vue')['default']
+ ECharts: typeof import('./../components/ECharts/index.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElAside: typeof import('element-plus/es')['ElAside']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
@@ -30,7 +30,6 @@ declare module 'vue' {
ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
- ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
@@ -63,6 +62,7 @@ declare module 'vue' {
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
+ ElResult: typeof import('element-plus/es')['ElResult']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
@@ -85,46 +85,45 @@ declare module 'vue' {
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
ElWatermark: typeof import('element-plus/es')['ElWatermark']
- Vue3CronPlusPicker: typeof import('vue3-cron-plus-picker')['default']
- FileUpload: typeof import('./src/components/Upload/FileUpload.vue')['default']
- Frame: typeof import('./src/components/Frame/index.vue')['default']
- Fullscreen: typeof import('./src/components/Fullscreen/index.vue')['default']
- GithubCorner: typeof import('./src/components/GithubCorner/index.vue')['default']
- Guide: typeof import('./src/components/Guide/index.vue')['default']
- Hamburger: typeof import('./src/components/Hamburger/index.vue')['default']
- IconSelect: typeof import('./src/components/IconSelect/index.vue')['default']
- InputTag: typeof import('./src/components/InputTag/index.vue')['default']
- IntervalTab: typeof import('./src/components/IntervalTab/index.vue')['default']
- LangSelect: typeof import('./src/components/LangSelect/index.vue')['default']
- LockDialog: typeof import('./src/layouts/components/NavBar/components/LockDialog.vue')['default']
- LockPage: typeof import('./src/layouts/components/NavBar/components/LockPage.vue')['default']
- Login: typeof import('./src/views/system/auth/components/Login.vue')['default']
- MenuItem: typeof import('./src/layouts/components/Menu/components/MenuItem.vue')['default']
- MenuItemContent: typeof import('./src/layouts/components/Menu/components/MenuItemContent.vue')['default']
- MenuSearch: typeof import('./src/components/MenuSearch/index.vue')['default']
- MixTopMenu: typeof import('./src/layouts/components/Menu/MixTopMenu.vue')['default']
- MultiImageUpload: typeof import('./src/components/Upload/MultiImageUpload.vue')['default']
- NavBar: typeof import('./src/layouts/components/NavBar/index.vue')['default']
- NavbarActions: typeof import('./src/layouts/components/NavBar/components/NavbarActions.vue')['default']
- Notification: typeof import('./src/components/Notification/index.vue')['default']
- OperationColumn: typeof import('./src/components/OperationColumn/index.vue')['default']
- PageContent: typeof import('./src/components/CURD/PageContent.vue')['default']
- PageModal: typeof import('./src/components/CURD/PageModal.vue')['default']
- PageSearch: typeof import('./src/components/CURD/PageSearch.vue')['default']
- Pagination: typeof import('./src/components/Pagination/index.vue')['default']
- PermissonDrawer: typeof import('./src/views/system/role/components/PermissonDrawer.vue')['default']
- Register: typeof import('./src/views/system/auth/components/Register.vue')['default']
- ResetPwd: typeof import('./src/views/system/auth/components/ResetPwd.vue')['default']
+ FileUpload: typeof import('./../components/Upload/FileUpload.vue')['default']
+ Frame: typeof import('./../components/Frame/index.vue')['default']
+ Fullscreen: typeof import('./../components/Fullscreen/index.vue')['default']
+ GithubCorner: typeof import('./../components/GithubCorner/index.vue')['default']
+ Guide: typeof import('./../components/Guide/index.vue')['default']
+ Hamburger: typeof import('./../components/Hamburger/index.vue')['default']
+ IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
+ InputTag: typeof import('./../components/InputTag/index.vue')['default']
+ IntervalTab: typeof import('./../components/IntervalTab/index.vue')['default']
+ LangSelect: typeof import('./../components/LangSelect/index.vue')['default']
+ LockDialog: typeof import('./../layouts/components/NavBar/components/LockDialog.vue')['default']
+ LockPage: typeof import('./../layouts/components/NavBar/components/LockPage.vue')['default']
+ Login: typeof import('./../views/system/auth/components/Login.vue')['default']
+ MenuItem: typeof import('./../layouts/components/Menu/components/MenuItem.vue')['default']
+ MenuItemContent: typeof import('./../layouts/components/Menu/components/MenuItemContent.vue')['default']
+ MenuSearch: typeof import('./../components/MenuSearch/index.vue')['default']
+ MixTopMenu: typeof import('./../layouts/components/Menu/MixTopMenu.vue')['default']
+ MultiImageUpload: typeof import('./../components/Upload/MultiImageUpload.vue')['default']
+ NavBar: typeof import('./../layouts/components/NavBar/index.vue')['default']
+ NavbarActions: typeof import('./../layouts/components/NavBar/components/NavbarActions.vue')['default']
+ Notification: typeof import('./../components/Notification/index.vue')['default']
+ OperationColumn: typeof import('./../components/OperationColumn/index.vue')['default']
+ PageContent: typeof import('./../components/CURD/PageContent.vue')['default']
+ PageModal: typeof import('./../components/CURD/PageModal.vue')['default']
+ PageSearch: typeof import('./../components/CURD/PageSearch.vue')['default']
+ Pagination: typeof import('./../components/Pagination/index.vue')['default']
+ PermissonDrawer: typeof import('./../views/system/role/components/PermissonDrawer.vue')['default']
+ Register: typeof import('./../views/system/auth/components/Register.vue')['default']
+ ResetPwd: typeof import('./../views/system/auth/components/ResetPwd.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
- Settings: typeof import('./src/layouts/components/Settings/index.vue')['default']
- SingleImageUpload: typeof import('./src/components/Upload/SingleImageUpload.vue')['default']
- SizeSelect: typeof import('./src/components/SizeSelect/index.vue')['default']
- TableSelect: typeof import('./src/components/TableSelect/index.vue')['default']
- TagsView: typeof import('./src/layouts/components/TagsView/index.vue')['default']
- TextScroll: typeof import('./src/components/TextScroll/index.vue')['default']
- UserImport: typeof import('./src/views/system/user/components/UserImport.vue')['default']
- WangEditor: typeof import('./src/components/WangEditor/index.vue')['default']
+ Settings: typeof import('./../layouts/components/Settings/index.vue')['default']
+ SingleImageUpload: typeof import('./../components/Upload/SingleImageUpload.vue')['default']
+ SizeSelect: typeof import('./../components/SizeSelect/index.vue')['default']
+ TableSelect: typeof import('./../components/TableSelect/index.vue')['default']
+ TagsView: typeof import('./../layouts/components/TagsView/index.vue')['default']
+ TextScroll: typeof import('./../components/TextScroll/index.vue')['default']
+ UserImport: typeof import('./../views/system/user/components/UserImport.vue')['default']
+ WangEditor: typeof import('./../components/WangEditor/index.vue')['default']
}
export interface GlobalDirectives {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
diff --git a/frontend/src/types/vue3-cron-plus-picker.d.ts b/frontend/src/types/vue3-cron-plus-picker.d.ts
deleted file mode 100644
index e42896f7..00000000
--- a/frontend/src/types/vue3-cron-plus-picker.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-declare module "vue3-cron-plus-picker" {
- import { DefineComponent } from "vue";
-
- export const Vue3CronPlusPicker: DefineComponent<{}, {}, any>;
-
- export default Vue3CronPlusPicker;
-}
-
-declare module "vue3-cron-plus-picker/style.css" {
- const content: any;
- export default content;
-}
-
-declare module "vue3-cron-plus-picker/vue3-cron-plus-picker.js" {
- import { DefineComponent } from "vue";
-
- export const Vue3CronPlusPicker: DefineComponent<{}, {}, any>;
-
- export default Vue3CronPlusPicker;
-}
diff --git a/frontend/src/types/vue3-cron-plus.d.ts b/frontend/src/types/vue3-cron-plus.d.ts
new file mode 100644
index 00000000..c51701a9
--- /dev/null
+++ b/frontend/src/types/vue3-cron-plus.d.ts
@@ -0,0 +1,12 @@
+declare module "vue3-cron-plus" {
+ import { DefineComponent } from "vue";
+
+ export const vue3CronPlus: DefineComponent<{}, {}, any>;
+
+ export default vue3CronPlus;
+}
+
+declare module "vue3-cron-plus/dist/index.css" {
+ const content: any;
+ export default content;
+}
diff --git a/frontend/src/views/monitor/job/index.vue b/frontend/src/views/monitor/job/index.vue
index 2ec2c0f8..b9db6f3d 100644
--- a/frontend/src/views/monitor/job/index.vue
+++ b/frontend/src/views/monitor/job/index.vue
@@ -364,37 +364,62 @@
v-else-if="formData.trigger === 'interval'"
label="间隔时间"
prop="trigger_args"
- :rules="[{ required: true, message: '请输入间隔时间' }]"
+ :rules="[{ required: true, message: '请输入间隔时间', trigger: 'change' }]"
style="width: 40%"
>
-
+
+
+
+
+
+
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
@@ -478,11 +486,10 @@ defineOptions({
});
import JobAPI, { JobTable, JobForm, JobPageQuery } from "@/api/monitor/job";
-
import IntervalTab from "@/components/IntervalTab/index.vue";
-import "vue3-cron-plus-picker/style.css";
-import { Vue3CronPlusPicker } from "vue3-cron-plus-picker";
import { useDictStore } from "@/store/index";
+import { vue3CronPlus } from 'vue3-cron-plus'
+import 'vue3-cron-plus/dist/index.css' // 引入样式
const dictStore = useDictStore();
@@ -504,8 +511,7 @@ const isExpandable = ref(true);
// const tableLoading = ref(false);
// const openModal = ref(false);
const openCron = ref(false);
-const cronMode = ref("create");
-const modalTitle = ref("");
+
// const modalSubmitLoading = ref(false);
// const detailStateLoading = ref(false);
// const dataSource = ref([]);
@@ -514,7 +520,6 @@ const modalTitle = ref("");
// const detailState = ref({})
const openIntervalTab = ref(false);
const intervalTabRef = ref();
-const expression = ref();
// 分页表单
const pageTableData = ref([]);
@@ -541,7 +546,7 @@ const formData = reactive({
args: undefined,
kwargs: undefined,
coalesce: undefined,
- max_instances: undefined,
+ max_instances: 1,
jobstore: undefined,
executor: undefined,
trigger_args: undefined,
@@ -659,7 +664,7 @@ async function handleSubmit() {
handleCloseDialog();
handleResetQuery();
} catch (error: any) {
- ElMessage.error(error.message);
+ console.log(error);
} finally {
loading.value = false;
}
@@ -671,7 +676,7 @@ async function handleSubmit() {
handleCloseDialog();
handleResetQuery();
} catch (error: any) {
- ElMessage.error(error.message);
+ console.log(error);
} finally {
loading.value = false;
}
@@ -739,7 +744,6 @@ async function handleExport() {
document.body.appendChild(link);
link.click();
} catch (error: any) {
- ElMessage.error("文件处理失败", error.message);
console.error("导出错误:", error);
} finally {
loading.value = false;
@@ -749,27 +753,16 @@ async function handleExport() {
});
}
-function openIntervalTabHandle(value: any) {
- openIntervalTab.value = true;
- modalTitle.value = value;
-}
-
-function handleIntervalConfirm() {
- formData.trigger_args = intervalTabRef.value.handleConfirm();
+function handleIntervalConfirm(interval: string) {
+ formData.trigger_args = interval;
openIntervalTab.value = false;
}
-const handleShowCron = () => {
- openCron.value = true;
- expression.value = formData.trigger_args;
-};
-
-const closeDialog = () => {
- openCron.value = false;
-};
-
-const fillValue = (cronValue: string) => {
- formData.trigger_args = cronValue;
+const handlechangeCron = (cronStr: string) => {
+ // formData.trigger_args = cronStr;
+ if (typeof (cronStr) == "string") {
+ formData.trigger_args = cronStr;
+ }
};
// 清空按钮操作
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index ddc76976..362a58e3 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -39,7 +39,7 @@ export default defineConfig(({ mode }: ConfigEnv) => {
},
server: {
host: true,
- port: env.VITE_APP_PORT,
+ port: Number(env.VITE_APP_PORT),
open: true,
proxy: {
// 代理 /dev-api 的请求
@@ -69,8 +69,8 @@ export default defineConfig(({ mode }: ConfigEnv) => {
},
vueTemplate: true,
// 导入函数类型声明文件路径 (false:关闭自动生成)
- dts: false,
- // dts: "src/types/auto-imports.d.ts",
+ // dts: true,
+ dts: "src/types/auto-imports.d.ts",
}),
// 组件自动导入
Components({
@@ -81,8 +81,8 @@ export default defineConfig(({ mode }: ConfigEnv) => {
// 指定自定义组件位置(默认:src/components)
dirs: ["src/components", "src/**/components"],
// 导入组件类型声明文件路径 (false:关闭自动生成)
- dts: false,
- // dts: "src/types/components.d.ts",
+ // dts: false,
+ dts: "src/types/components.d.ts",
}),
],
// 预加载项目必需的组件
@@ -192,7 +192,7 @@ export default defineConfig(({ mode }: ConfigEnv) => {
},
// 构建配置
build: {
- chunkSizeWarningLimit: 2000, // 消除打包大小超过500kb警告
+ chunkSizeWarningLimit: 4000, // 消除打包大小超过4000kb警告
minify: isProduction ? "terser" : false, // 只在生产环境启用压缩
terserOptions: isProduction
? {
@@ -203,7 +203,7 @@ export default defineConfig(({ mode }: ConfigEnv) => {
pure_funcs: ["console.log", "console.info"], // 移除指定的函数调用
},
format: {
- comments: false, // 删除注释
+ comments: true, // 删除注释
},
}
: {},
@@ -212,6 +212,41 @@ export default defineConfig(({ mode }: ConfigEnv) => {
// manualChunks: {
// "vue-i18n": ["vue-i18n"],
// },
+ manualChunks(id) {
+ if (id.includes('node_modules')) {
+ // 针对大型库进行单独拆分
+ if (id.includes('echarts')) {
+ return 'echarts';
+ }
+ if (id.includes('element-plus')) {
+ return 'element-plus';
+ }
+ if (id.includes('@wangeditor-next')) {
+ return 'wangeditor';
+ }
+ if (id.includes('codemirror')) {
+ return 'codemirror';
+ }
+ if (id.includes('exceljs')) {
+ return 'exceljs';
+ }
+ // 添加更多大型库
+ if (id.includes('vue')) {
+ return 'vue';
+ }
+ if (id.includes('pinia')) {
+ return 'pinia';
+ }
+ if (id.includes('axios')) {
+ return 'axios';
+ }
+
+ // 其他模块保持当前拆分方式
+ const module = id.toString().split('node_modules/')[1].split('/')[0]
+ if (['birpc', 'hookable'].includes(module)) return
+ return module
+ }
+ },
// 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
entryFileNames: "js/[name].[hash].js",
// 用于命名代码拆分时创建的共享块的输出命名