mirror of
https://gitee.com/gz-yami/mall4v.git
synced 2026-10-06 13:32:32 +08:00
升级vite版本和部分依赖
This commit is contained in:
@@ -1,9 +0,0 @@
|
|||||||
/build/
|
|
||||||
/config/
|
|
||||||
/dist/
|
|
||||||
/*.js
|
|
||||||
/src/components/verifition
|
|
||||||
/test/unit/coverage/
|
|
||||||
/src/icons/iconfont.js
|
|
||||||
/components.d.ts
|
|
||||||
/src/auto-import
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
{
|
|
||||||
"globals": {
|
|
||||||
"$t": true,
|
|
||||||
"Component": true,
|
|
||||||
"ComponentPublicInstance": true,
|
|
||||||
"ComputedRef": true,
|
|
||||||
"Debounce": true,
|
|
||||||
"EffectScope": true,
|
|
||||||
"InjectionKey": true,
|
|
||||||
"PropType": true,
|
|
||||||
"Ref": true,
|
|
||||||
"VNode": true,
|
|
||||||
"clearLoginInfo": true,
|
|
||||||
"computed": true,
|
|
||||||
"configDefInfo": true,
|
|
||||||
"createApp": true,
|
|
||||||
"customRef": true,
|
|
||||||
"defineAsyncComponent": true,
|
|
||||||
"defineComponent": true,
|
|
||||||
"effectScope": true,
|
|
||||||
"encrypt": true,
|
|
||||||
"flatten": true,
|
|
||||||
"checkFileUrl": true,
|
|
||||||
"formatConfigInfo": true,
|
|
||||||
"getCurrentInstance": true,
|
|
||||||
"getCurrentScope": true,
|
|
||||||
"getLevels": true,
|
|
||||||
"getUUID": true,
|
|
||||||
"h": true,
|
|
||||||
"http": true,
|
|
||||||
"idList": true,
|
|
||||||
"inject": true,
|
|
||||||
"isAuth": true,
|
|
||||||
"isEmail": true,
|
|
||||||
"isHtmlNull": true,
|
|
||||||
"isMobile": true,
|
|
||||||
"isPhone": true,
|
|
||||||
"isProxy": true,
|
|
||||||
"isQq": true,
|
|
||||||
"isReactive": true,
|
|
||||||
"isReadonly": true,
|
|
||||||
"isRef": true,
|
|
||||||
"isURL": true,
|
|
||||||
"markRaw": true,
|
|
||||||
"nextTick": true,
|
|
||||||
"onActivated": true,
|
|
||||||
"onBeforeMount": true,
|
|
||||||
"onBeforeRouteLeave": true,
|
|
||||||
"onBeforeRouteUpdate": true,
|
|
||||||
"onBeforeUnmount": true,
|
|
||||||
"onBeforeUpdate": true,
|
|
||||||
"onDeactivated": true,
|
|
||||||
"onErrorCaptured": true,
|
|
||||||
"onMounted": true,
|
|
||||||
"onRenderTracked": true,
|
|
||||||
"onRenderTriggered": true,
|
|
||||||
"onScopeDispose": true,
|
|
||||||
"onServerPrefetch": true,
|
|
||||||
"onUnmounted": true,
|
|
||||||
"onUpdated": true,
|
|
||||||
"provide": true,
|
|
||||||
"reactive": true,
|
|
||||||
"readonly": true,
|
|
||||||
"ref": true,
|
|
||||||
"resolveComponent": true,
|
|
||||||
"shallowReactive": true,
|
|
||||||
"shallowReadonly": true,
|
|
||||||
"shallowRef": true,
|
|
||||||
"toRaw": true,
|
|
||||||
"toRef": true,
|
|
||||||
"toRefs": true,
|
|
||||||
"treeDataTranslate": true,
|
|
||||||
"triggerRef": true,
|
|
||||||
"unref": true,
|
|
||||||
"uploadFile": true,
|
|
||||||
"useAttrs": true,
|
|
||||||
"useCommonStore": true,
|
|
||||||
"scoreProdStore":true,
|
|
||||||
"useCssModule": true,
|
|
||||||
"useCssVars": true,
|
|
||||||
"useLink": true,
|
|
||||||
"useRoute": true,
|
|
||||||
"useRouter": true,
|
|
||||||
"useSlots": true,
|
|
||||||
"useUserStore": true,
|
|
||||||
"useWebConfigStore": true,
|
|
||||||
"validHtmlLength": true,
|
|
||||||
"validNoEmptySpace": true,
|
|
||||||
"watch": true,
|
|
||||||
"watchEffect": true,
|
|
||||||
"watchPostEffect": true,
|
|
||||||
"watchSyncEffect": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
env: {
|
|
||||||
browser: true,
|
|
||||||
es2021: true
|
|
||||||
},
|
|
||||||
globals: {
|
|
||||||
BMap: 'readonly'
|
|
||||||
},
|
|
||||||
extends: [
|
|
||||||
'standard',
|
|
||||||
'./.eslintrc-auto-import.json',
|
|
||||||
'plugin:vue/vue3-recommended',
|
|
||||||
'plugin:vue-scoped-css/vue3-recommended'
|
|
||||||
],
|
|
||||||
overrides: [],
|
|
||||||
parserOptions: {
|
|
||||||
ecmaVersion: 'latest',
|
|
||||||
sourceType: 'module'
|
|
||||||
},
|
|
||||||
plugins: ['vue'],
|
|
||||||
rules: {
|
|
||||||
// Possible Errors
|
|
||||||
// 要求使用 let 或 const 而不是 var
|
|
||||||
'no-var': 'error',
|
|
||||||
// 强制 "for" 循环中更新子句的计数器朝着正确的方向移动
|
|
||||||
'for-direction': 'error',
|
|
||||||
// 强制 getter 函数中出现 return 语句
|
|
||||||
'getter-return': 'error',
|
|
||||||
// 禁止在嵌套的块中出现变量声明或 function 声明
|
|
||||||
'no-inner-declarations': 'error',
|
|
||||||
// 禁止由于 await 或 yield的使用而可能导致出现竞态条件的赋值
|
|
||||||
'require-atomic-updates': 'error',
|
|
||||||
// console 警告
|
|
||||||
'no-console': 'warn',
|
|
||||||
// 禁止出现未使用过的变量
|
|
||||||
'no-unused-vars': [
|
|
||||||
'warn',
|
|
||||||
{
|
|
||||||
args: 'all',
|
|
||||||
caughtErrors: 'none',
|
|
||||||
ignoreRestSiblings: true,
|
|
||||||
vars: 'all'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
// 关闭名称校验
|
|
||||||
'vue/multi-word-component-names': 'off',
|
|
||||||
// 非生产环境启用 debugger
|
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
|
||||||
|
|
||||||
// Best Practices
|
|
||||||
eqeqeq: 'off',
|
|
||||||
|
|
||||||
// Stylistic Issues
|
|
||||||
// 强制可嵌套的块的最大深度
|
|
||||||
'max-depth': ['error', 5],
|
|
||||||
// 强制函数最大代码行数
|
|
||||||
'max-lines-per-function': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
max: 150,
|
|
||||||
skipBlankLines: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
// 强制回调函数最大嵌套深度
|
|
||||||
'max-nested-callbacks': ['error', { max: 10 }],
|
|
||||||
// 强制函数定义中最多允许的参数数量
|
|
||||||
'max-params': ['error', { max: 5 }],
|
|
||||||
// 强制每一行中所允许的最大语句数量
|
|
||||||
'max-statements-per-line': ['error', { max: 1 }],
|
|
||||||
// 三目运算符换行
|
|
||||||
'multiline-ternary': ['error', 'never'],
|
|
||||||
// 传值给组件时的使用 kebab-case
|
|
||||||
'vue/v-on-event-hyphenation': ['warn', 'always', {
|
|
||||||
autofix: true,
|
|
||||||
ignore: []
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
// 指向本地 schema,方便编辑器识别 Oxfmt 的配置字段。
|
||||||
|
"$schema": "./node_modules/oxfmt/configuration_schema.json",
|
||||||
|
// 与现有项目代码风格保持一致:不自动补分号。
|
||||||
|
"semi": false,
|
||||||
|
// 与既有 JS / Vue 文件风格保持一致:优先使用单引号。
|
||||||
|
"singleQuote": true,
|
||||||
|
// 单参数箭头函数也强制保留括号,避免保存时因默认值或编辑器差异出现风格漂移。
|
||||||
|
"arrowParens": "always",
|
||||||
|
// HTML、Vue、JSX 标签中的属性强制一行一个,和原有 ESLint 风格保持一致。
|
||||||
|
"singleAttributePerLine": true,
|
||||||
|
// 避免保存时自动补尾逗号,减少无意义 diff。
|
||||||
|
"trailingComma": "none",
|
||||||
|
// package.json 保持人工控制字段顺序,避免依赖区块被自动重排。
|
||||||
|
"sortPackageJson": false,
|
||||||
|
// 忽略生成物与公开静态资源,避免格式化覆盖工具产物。
|
||||||
|
"ignorePatterns": ["dist/**", "public/**", "src/auto-import/**", "types/auto-import/**"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
{
|
||||||
|
// 指向本地 schema,方便编辑器做字段提示和校验。
|
||||||
|
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
||||||
|
// 声明当前项目默认运行在浏览器环境,并启用 ES6 全局变量集。
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"es6": true
|
||||||
|
},
|
||||||
|
// 注册项目里会直接访问的全局变量,避免被误判成未定义。
|
||||||
|
"globals": {},
|
||||||
|
// 显式声明迁移期真正需要的插件集合,避免继续吃到默认插件带来的额外噪音。
|
||||||
|
// 这里先只保留最接近原 ESLint 8 方案的 eslint 核心规则和 vue 脚本规则。
|
||||||
|
// 注意:设置 plugins 会覆盖 Oxlint 默认插件集合,所以需要的插件必须全部写全。
|
||||||
|
"plugins": ["eslint", "vue"],
|
||||||
|
// 统一维护不参与 lint 的目录,减少本地与 CI 结果偏差。
|
||||||
|
"ignorePatterns": [
|
||||||
|
"build/**",
|
||||||
|
"config/**",
|
||||||
|
"dist/**",
|
||||||
|
"public/**",
|
||||||
|
"test/unit/coverage/**",
|
||||||
|
"src/icons/iconfont.js",
|
||||||
|
"src/auto-import/**",
|
||||||
|
"types/auto-import/**"
|
||||||
|
],
|
||||||
|
// 先启用最有价值的规则分类,避免一次性引入过多历史噪音。
|
||||||
|
"categories": {
|
||||||
|
"correctness": "error",
|
||||||
|
"suspicious": "warn"
|
||||||
|
},
|
||||||
|
// 这里放项目级基础规则,优先覆盖原先 ESLint 中保留下来的核心校验。
|
||||||
|
// 迁移初期先追求和旧项目体感接近,再逐步补回更严格的规则。
|
||||||
|
"rules": {
|
||||||
|
// 禁止随手输出调试日志,但保留 console.error 作为异常排查和兜底告警的输出通道。
|
||||||
|
"no-console": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"allow": ["error"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
// 允许在本地联调阶段临时使用 debugger,避免影响现有排查流程。
|
||||||
|
"no-debugger": "off",
|
||||||
|
// 禁止继续使用 var,统一收敛到 let / const,减少变量提升带来的作用域问题。
|
||||||
|
"no-var": "error",
|
||||||
|
// 防止 for 循环的自增自减方向写反,避免出现死循环或根本不执行的情况。
|
||||||
|
"for-direction": "error",
|
||||||
|
// 要求 getter 必须显式返回值,避免读取属性时得到难以排查的 undefined。
|
||||||
|
"getter-return": "error",
|
||||||
|
// 禁止在块级作用域中声明易产生歧义的函数或变量,降低兼容性风险。
|
||||||
|
"no-inner-declarations": "error",
|
||||||
|
// 避免异步场景对同一变量的读写互相覆盖,减少竞态条件问题。
|
||||||
|
"require-atomic-updates": "error",
|
||||||
|
// 旧项目里这类变量名遮蔽并没有被大量提示,迁移期先关闭避免噪音过高。
|
||||||
|
"no-shadow": "off",
|
||||||
|
// 兼容现有代码里常见的“条件成立才执行”写法,避免把短路表达式都判成错误。
|
||||||
|
"no-unused-expressions": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"allowShortCircuit": true,
|
||||||
|
"allowTernary": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
// 旧项目并没有强制限制字符串拼接,这里先关闭避免产生额外迁移噪音。
|
||||||
|
"no-useless-concat": "off"
|
||||||
|
},
|
||||||
|
// 按文件类型细分规则,降低 JS 与 Vue 场景下的误报。
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
// JS 文件继续保留较宽松的未使用变量策略,兼容现有代码风格。
|
||||||
|
"files": ["src/**/*.js"],
|
||||||
|
"rules": {
|
||||||
|
"no-unused-vars": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
// 继续检查函数参数,帮助发现历史遗留的无效入参。
|
||||||
|
"args": "all",
|
||||||
|
// 不强制要求 catch 参数必须被使用,兼容现有异常捕获写法。
|
||||||
|
"caughtErrors": "none",
|
||||||
|
// 允许对象剩余解构时的兄弟字段暂时未使用,减少常见场景下的误报。
|
||||||
|
"ignoreRestSiblings": true,
|
||||||
|
// 对局部变量仍然给出提示,便于逐步清理废弃状态和冗余逻辑。
|
||||||
|
"vars": "all",
|
||||||
|
// 保留项目里常见的占位参数命名,避免批量改名造成无意义 diff。
|
||||||
|
"argsIgnorePattern": "^[rule, value, i, to, from, binding]"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
// 仅为编辑器与 Volar 提供路径别名和自动生成声明文件的索引能力。
|
||||||
|
"compilerOptions": {
|
||||||
|
// 对齐 Vite 的 @ 别名,避免业务源码和自动生成声明文件中的路径在编辑器里报错。
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["src/*"]
|
||||||
|
},
|
||||||
|
// 当前项目以 JavaScript 为主,不启用严格的 TS 检查。
|
||||||
|
"allowJs": true,
|
||||||
|
"checkJs": false,
|
||||||
|
"skipLibCheck": true
|
||||||
|
},
|
||||||
|
// 排除依赖目录与构建产物,减少编辑器项目分析开销。
|
||||||
|
"exclude": ["node_modules", "dist"],
|
||||||
|
// 同时索引业务源码与自动生成声明文件,和 b2c 项目保持一致。
|
||||||
|
"include": ["src/**/*.js", "src/**/*.vue", "types/**/*.d.ts"]
|
||||||
|
}
|
||||||
+41
-39
@@ -9,57 +9,59 @@
|
|||||||
"dev:test": "vite --mode testing",
|
"dev:test": "vite --mode testing",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"build:test": "vite build --mode testing",
|
"build:test": "vite build --mode testing",
|
||||||
"lint": "eslint --ext .js,.vue src",
|
"lint": "oxlint src",
|
||||||
"lint:fix": "eslint --fix --ext .js,.vue src",
|
"lint:fix": "oxlint --fix src",
|
||||||
|
"fmt": "oxfmt .",
|
||||||
|
"fmt:check": "oxfmt --check .",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"lint:staged": "lint-staged"
|
"lint:staged": "lint-staged"
|
||||||
},
|
},
|
||||||
"engines": {
|
|
||||||
"node": ">=16",
|
|
||||||
"pnpm": ">=6"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@element-plus/icons-vue": "2.1.0",
|
"@element-plus/icons-vue": "2.3.1",
|
||||||
"@smallwei/avue": "3.2.22",
|
"@smallwei/avue": "3.2.22",
|
||||||
"axios": "1.3.4",
|
"axios": "1.7.9",
|
||||||
"big.js": "6.2.1",
|
"big.js": "6.2.2",
|
||||||
"crypto-js": "4.1.1",
|
"crypto-js": "4.2.0",
|
||||||
"echarts": "5.4.1",
|
"echarts": "5.6.0",
|
||||||
"element-plus": "2.3.6",
|
"element-plus": "2.9.3",
|
||||||
"element-resize-detector": "1.2.4",
|
"element-resize-detector": "1.2.4",
|
||||||
"js-base64": "3.7.5",
|
"js-base64": "3.7.5",
|
||||||
"lodash": "4.17.21",
|
"lodash": "4.17.21",
|
||||||
"moment": "2.29.4",
|
"moment": "2.30.1",
|
||||||
"pinia": "2.0.33",
|
"pinia": "2.3.0",
|
||||||
"qs": "6.11.1",
|
"qs": "6.14.0",
|
||||||
"vue": "3.2.47",
|
"vue": "3.5.13",
|
||||||
"vue-cookies": "1.8.3",
|
"vue-cookies": "1.8.5",
|
||||||
"vue-draggable-next": "2.1.1",
|
"vue-draggable-next": "2.2.1",
|
||||||
"vue-router": "4.1.6"
|
"vue-router": "4.5.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/eslint-parser": "7.21.3",
|
"@vitejs/plugin-vue": "6.0.5",
|
||||||
"@vitejs/plugin-vue": "4.1.0",
|
"lint-staged": "15.3.0",
|
||||||
"eslint": "8.38.0",
|
"oxfmt": "0.41.0",
|
||||||
"eslint-config-standard": "17.0.0",
|
"oxlint": "1.56.0",
|
||||||
"eslint-plugin-import": "2.27.5",
|
"sass": "1.83.4",
|
||||||
"eslint-plugin-n": "15.7.0",
|
"sortablejs": "1.15.6",
|
||||||
"eslint-plugin-promise": "6.1.1",
|
"unplugin-auto-import": "19.0.0",
|
||||||
"eslint-plugin-vue": "9.10.0",
|
"unplugin-vue-components": "28.0.0",
|
||||||
"eslint-plugin-vue-scoped-css": "2.4.0",
|
"vite": "8.0.1",
|
||||||
"lint-staged": "13.2.2",
|
"vite-plugin-compression2": "2.5.3",
|
||||||
"sass": "1.59.3",
|
"vite-plugin-svg-icons": "2.0.1"
|
||||||
"unplugin-auto-import": "0.15.1",
|
|
||||||
"unplugin-vue-components": "0.24.1",
|
|
||||||
"vite": "4.3.9",
|
|
||||||
"vite-plugin-compression": "0.5.1",
|
|
||||||
"vite-plugin-eslint": "1.8.1",
|
|
||||||
"vite-plugin-svg-icons": "2.0.1",
|
|
||||||
"vue-eslint-parser": "9.1.1"
|
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"*.{js,vue}": [
|
"src/**/*.{js,vue}": [
|
||||||
"eslint --fix"
|
"oxlint --fix",
|
||||||
|
"oxfmt"
|
||||||
|
],
|
||||||
|
"src/**/*.{css,scss}": [
|
||||||
|
"oxfmt"
|
||||||
|
],
|
||||||
|
"*.{json,md,html,yml,yaml}": [
|
||||||
|
"oxfmt"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.19.0 || >=22.12.0",
|
||||||
|
"pnpm": ">=7"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-18
@@ -1,3 +1,6 @@
|
|||||||
|
@use "sass:color";
|
||||||
|
@use "./variables" as *;
|
||||||
|
|
||||||
*,
|
*,
|
||||||
*:before,
|
*:before,
|
||||||
*:after {
|
*:after {
|
||||||
@@ -11,11 +14,11 @@ body {
|
|||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
}
|
}
|
||||||
a {
|
a {
|
||||||
color: mix(#fff, $--color-primary, 20%);
|
color: color.mix(#fff, $color-primary, 20%);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
&:focus,
|
&:focus,
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $--color-primary;
|
color: $color-primary;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -132,7 +135,7 @@ img {
|
|||||||
z-index: 1030;
|
z-index: 1030;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
box-shadow: 0 2px 4px rgba(0, 0, 0, .08);
|
box-shadow: 0 2px 4px rgba(0, 0, 0, .08);
|
||||||
background-color: $navbar--background-color;
|
background-color: $navbar-background-color;
|
||||||
|
|
||||||
&--inverse {
|
&--inverse {
|
||||||
.site-navbar__body {
|
.site-navbar__body {
|
||||||
@@ -145,12 +148,12 @@ img {
|
|||||||
&:focus,
|
&:focus,
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: mix(#000, $navbar--background-color, 15%);
|
background-color: color.mix(#000, $navbar-background-color, 15%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
> .el-menu-item.is-active,
|
> .el-menu-item.is-active,
|
||||||
> .el-submenu.is-active > .el-submenu__title {
|
> .el-submenu.is-active > .el-submenu__title {
|
||||||
border-bottom-color: mix(#fff, $navbar--background-color, 85%);
|
border-bottom-color: color.mix(#fff, $navbar-background-color, 85%);
|
||||||
}
|
}
|
||||||
.el-menu-item i,
|
.el-menu-item i,
|
||||||
.el-submenu__title i,
|
.el-submenu__title i,
|
||||||
@@ -159,7 +162,7 @@ img {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.el-menu--popup-bottom-start {
|
.el-menu--popup-bottom-start {
|
||||||
background-color: $navbar--background-color;
|
background-color: $navbar-background-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,26 +269,26 @@ img {
|
|||||||
|
|
||||||
&--dark,
|
&--dark,
|
||||||
&--dark-popper {
|
&--dark-popper {
|
||||||
background-color: $sidebar--background-color-dark;
|
background-color: $sidebar-background-color-dark;
|
||||||
.site-sidebar__menu.el-menu,
|
.site-sidebar__menu.el-menu,
|
||||||
> .el-menu--popup {
|
> .el-menu--popup {
|
||||||
background-color: $sidebar--background-color-dark;
|
background-color: $sidebar-background-color-dark;
|
||||||
.el-menu-item,
|
.el-menu-item,
|
||||||
.el-submenu > .el-submenu__title {
|
.el-submenu > .el-submenu__title {
|
||||||
color: $sidebar--color-text-dark;
|
color: $sidebar-color-text-dark;
|
||||||
&:focus,
|
&:focus,
|
||||||
&:hover {
|
&:hover {
|
||||||
color: mix(#fff, $sidebar--color-text-dark, 50%);
|
color: color.mix(#fff, $sidebar-color-text-dark, 50%);
|
||||||
background-color: mix(#fff, $sidebar--background-color-dark, 2.5%);
|
background-color: color.mix(#fff, $sidebar-background-color-dark, 2.5%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.el-menu,
|
.el-menu,
|
||||||
.el-submenu.is-opened {
|
.el-submenu.is-opened {
|
||||||
background-color: mix(#000, $sidebar--background-color-dark, 15%);
|
background-color: color.mix(#000, $sidebar-background-color-dark, 15%);
|
||||||
}
|
}
|
||||||
.el-menu-item.is-active,
|
.el-menu-item.is-active,
|
||||||
.el-submenu.is-active > .el-submenu__title {
|
.el-submenu.is-active > .el-submenu__title {
|
||||||
color: mix(#fff, $sidebar--color-text-dark, 80%);
|
color: color.mix(#fff, $sidebar-color-text-dark, 80%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -322,10 +325,7 @@ img {
|
|||||||
padding-top: 50px;
|
padding-top: 50px;
|
||||||
margin-left: 230px;
|
margin-left: 230px;
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
background: $content--background-color;
|
background: $content-background-color;
|
||||||
}
|
|
||||||
&--tabs {
|
|
||||||
padding: 55px 0 0;
|
|
||||||
}
|
}
|
||||||
> .el-tabs {
|
> .el-tabs {
|
||||||
> .el-tabs__header {
|
> .el-tabs__header {
|
||||||
@@ -355,7 +355,7 @@ img {
|
|||||||
padding: 0 12px;
|
padding: 0 12px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
background-color: $content--background-color;
|
background-color: $content-background-color;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
.el-icon--right {
|
.el-icon--right {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
// 站点主色
|
// 站点主色
|
||||||
// tips: 要达到整站主题修改效果, 请确保[$--color-primary]站点主色与[/src/element-ui-theme/index.js]文件中[import './element-[#17B3A3]/index.css']当前主题色一致
|
// tips: 要达到整站主题修改效果, 请确保[$color-primary]站点主色与[/src/element-ui-theme/index.js]文件中[import './element-[#17B3A3]/index.css']当前主题色一致
|
||||||
$--color-primary: #02A1E9;
|
$color-primary: #02A1E9;
|
||||||
|
|
||||||
// Navbar
|
// Navbar
|
||||||
$navbar--background-color: $--color-primary;
|
$navbar-background-color: $color-primary;
|
||||||
|
|
||||||
// Sidebar
|
// Sidebar
|
||||||
$sidebar--background-color-dark: #263238;
|
$sidebar-background-color-dark: #263238;
|
||||||
$sidebar--color-text-dark: #8a979e;
|
$sidebar-color-text-dark: #8a979e;
|
||||||
|
|
||||||
// Content
|
// Content
|
||||||
$content--background-color: #f1f4f5;
|
$content-background-color: #f1f4f5;
|
||||||
|
|||||||
@@ -1,3 +1,2 @@
|
|||||||
@import "normalize"; // api: https://github.com/necolas/normalize.css/
|
@use "./normalize"; // api: https://github.com/necolas/normalize.css/
|
||||||
@import "variables"; // 站点变量
|
@use "./base";
|
||||||
@import "base";
|
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ import moment from 'moment'
|
|||||||
import 'element-plus/dist/index.css'
|
import 'element-plus/dist/index.css'
|
||||||
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
|
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
|
||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
import locale from 'element-plus/lib/locale/lang/zh-cn'
|
import locale from 'element-plus/es/locale/lang/zh-cn'
|
||||||
import Avue from '@smallwei/avue'
|
import Avue from '@smallwei/avue'
|
||||||
import '@smallwei/avue/lib/index.css'
|
import '@smallwei/avue/lib/index.css'
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ const globalRoutes = [
|
|||||||
export const mainRoutes = {
|
export const mainRoutes = {
|
||||||
path: '/',
|
path: '/',
|
||||||
component: Layout,
|
component: Layout,
|
||||||
name: 'home',
|
|
||||||
redirect: '/home',
|
redirect: '/home',
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
@use "sass:color";
|
||||||
|
@use "./variables" as *;
|
||||||
|
|
||||||
*,
|
*,
|
||||||
*:before,
|
*:before,
|
||||||
*:after {
|
*:after {
|
||||||
@@ -11,11 +14,11 @@ body {
|
|||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
}
|
}
|
||||||
a {
|
a {
|
||||||
color: mix(#fff, $--color-primary, 20%);
|
color: color.mix(#fff, $color-primary, 20%);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
&:focus,
|
&:focus,
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $--color-primary;
|
color: $color-primary;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,7 +111,7 @@ img {
|
|||||||
z-index: 1030;
|
z-index: 1030;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
// box-shadow: 0 2px 4px rgba(0, 0, 0, .08);
|
// box-shadow: 0 2px 4px rgba(0, 0, 0, .08);
|
||||||
background-color: $navbar--background-color;
|
background-color: $navbar-background-color;
|
||||||
|
|
||||||
&__header {
|
&__header {
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -199,7 +202,7 @@ img {
|
|||||||
|
|
||||||
&--dark,
|
&--dark,
|
||||||
&--dark-popper {
|
&--dark-popper {
|
||||||
background-color: $sidebar--background-color-dark;
|
background-color: $sidebar-background-color-dark;
|
||||||
}
|
}
|
||||||
&__inner {
|
&__inner {
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -235,10 +238,7 @@ img {
|
|||||||
padding-top: 50px;
|
padding-top: 50px;
|
||||||
margin-left: 230px;
|
margin-left: 230px;
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
background: $content--background-color;
|
background: $content-background-color;
|
||||||
}
|
|
||||||
&--tabs {
|
|
||||||
padding: 55px 0 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,4 +514,4 @@ img {
|
|||||||
}
|
}
|
||||||
.time-select-item {
|
.time-select-item {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
|
|
||||||
// css 变量
|
// css 变量
|
||||||
$--color-primary: #155BD4;
|
$color-primary: #155BD4;
|
||||||
|
|
||||||
// Navbar
|
// Navbar
|
||||||
$navbar--background-color: $--color-primary;
|
$navbar-background-color: $color-primary;
|
||||||
|
|
||||||
// Sidebar
|
// Sidebar
|
||||||
$sidebar--background-color-dark: #263238;
|
$sidebar-background-color-dark: #263238;
|
||||||
$sidebar--color-text-dark: #8a979e;
|
$sidebar-color-text-dark: #8a979e;
|
||||||
|
|
||||||
// Content
|
// Content
|
||||||
$content--background-color: #f1f4f5;
|
$content-background-color: #f1f4f5;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
@import "_normalize"; // api: https://github.com/necolas/normalize.css/
|
@use "./normalize"; // api: https://github.com/necolas/normalize.css/
|
||||||
@import "_variables";
|
@use "./base";
|
||||||
@import "_base";
|
@use "./element-variables";
|
||||||
@import "@/styles/element-variables.scss";
|
|
||||||
|
|
||||||
.element-error-message-zindex {
|
.element-error-message-zindex {
|
||||||
z-index:3000 !important;
|
z-index:3000 !important;
|
||||||
|
|||||||
@@ -555,5 +555,8 @@ const getSoldExcel = () => {
|
|||||||
margin: 50px 0;
|
margin: 50px 0;
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
|
.el-select {
|
||||||
|
width: 200px
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ const dataForm = ref({
|
|||||||
status: 1,
|
status: 1,
|
||||||
isDefault: null,
|
isDefault: null,
|
||||||
prodCount: null,
|
prodCount: null,
|
||||||
seq: null,
|
seq: 0,
|
||||||
style: 0
|
style: 0
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -120,6 +120,9 @@ const dataFormRef = ref(null)
|
|||||||
* 表单提交
|
* 表单提交
|
||||||
*/
|
*/
|
||||||
const onSubmit = Debounce(() => {
|
const onSubmit = Debounce(() => {
|
||||||
|
if (!dataForm.value.seq) {
|
||||||
|
dataForm.value.seq = 0
|
||||||
|
}
|
||||||
dataFormRef.value?.validate((valid) => {
|
dataFormRef.value?.validate((valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
http({
|
http({
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"module": "commonjs",
|
|
||||||
"target": "es5",
|
|
||||||
"sourceMap": true,
|
|
||||||
"skipLibCheck": true
|
|
||||||
},
|
|
||||||
"exclude": [
|
|
||||||
"node_modules"
|
|
||||||
],
|
|
||||||
"include": [
|
|
||||||
"src/auto-import/components.d.ts",
|
|
||||||
"src/auto-import/imports.d.ts"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
Vendored
+96
@@ -0,0 +1,96 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
/* prettier-ignore */
|
||||||
|
// @ts-nocheck
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
|
// Generated by unplugin-auto-import
|
||||||
|
// biome-ignore lint: disable
|
||||||
|
export {}
|
||||||
|
declare global {
|
||||||
|
const Debounce: typeof import('../../src/utils/debounce.js')['Debounce']
|
||||||
|
const EffectScope: typeof import('vue')['EffectScope']
|
||||||
|
const checkFileUrl: typeof import('../../src/utils/index.js')['checkFileUrl']
|
||||||
|
const clearLoginInfo: typeof import('../../src/utils/index.js')['clearLoginInfo']
|
||||||
|
const computed: typeof import('vue')['computed']
|
||||||
|
const createApp: typeof import('vue')['createApp']
|
||||||
|
const customRef: typeof import('vue')['customRef']
|
||||||
|
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
|
||||||
|
const defineComponent: typeof import('vue')['defineComponent']
|
||||||
|
const effectScope: typeof import('vue')['effectScope']
|
||||||
|
const encrypt: typeof import('../../src/utils/crypto.js')['encrypt']
|
||||||
|
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
|
||||||
|
const getCurrentScope: typeof import('vue')['getCurrentScope']
|
||||||
|
const getUUID: typeof import('../../src/utils/index.js')['getUUID']
|
||||||
|
const h: typeof import('vue')['h']
|
||||||
|
const http: typeof import('../../src/utils/http.js')['default']
|
||||||
|
const idList: typeof import('../../src/utils/index.js')['idList']
|
||||||
|
const inject: typeof import('vue')['inject']
|
||||||
|
const isAuth: typeof import('../../src/utils/index.js')['isAuth']
|
||||||
|
const isEmail: typeof import('../../src/utils/validate.js')['isEmail']
|
||||||
|
const isMobile: typeof import('../../src/utils/validate.js')['isMobile']
|
||||||
|
const isPhone: typeof import('../../src/utils/validate.js')['isPhone']
|
||||||
|
const isProxy: typeof import('vue')['isProxy']
|
||||||
|
const isQq: typeof import('../../src/utils/validate.js')['isQq']
|
||||||
|
const isReactive: typeof import('vue')['isReactive']
|
||||||
|
const isReadonly: typeof import('vue')['isReadonly']
|
||||||
|
const isRef: typeof import('vue')['isRef']
|
||||||
|
const isURL: typeof import('../../src/utils/validate.js')['isURL']
|
||||||
|
const markRaw: typeof import('vue')['markRaw']
|
||||||
|
const nextTick: typeof import('vue')['nextTick']
|
||||||
|
const onActivated: typeof import('vue')['onActivated']
|
||||||
|
const onBeforeMount: typeof import('vue')['onBeforeMount']
|
||||||
|
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
|
||||||
|
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
|
||||||
|
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
|
||||||
|
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
|
||||||
|
const onDeactivated: typeof import('vue')['onDeactivated']
|
||||||
|
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
|
||||||
|
const onMounted: typeof import('vue')['onMounted']
|
||||||
|
const onRenderTracked: typeof import('vue')['onRenderTracked']
|
||||||
|
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
|
||||||
|
const onScopeDispose: typeof import('vue')['onScopeDispose']
|
||||||
|
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
|
||||||
|
const onUnmounted: typeof import('vue')['onUnmounted']
|
||||||
|
const onUpdated: typeof import('vue')['onUpdated']
|
||||||
|
const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
|
||||||
|
const provide: typeof import('vue')['provide']
|
||||||
|
const reactive: typeof import('vue')['reactive']
|
||||||
|
const readonly: typeof import('vue')['readonly']
|
||||||
|
const ref: typeof import('vue')['ref']
|
||||||
|
const resolveComponent: typeof import('vue')['resolveComponent']
|
||||||
|
const scoreProdStore: typeof import('../../src/stores/prod.js')['scoreProdStore']
|
||||||
|
const shallowReactive: typeof import('vue')['shallowReactive']
|
||||||
|
const shallowReadonly: typeof import('vue')['shallowReadonly']
|
||||||
|
const shallowRef: typeof import('vue')['shallowRef']
|
||||||
|
const toRaw: typeof import('vue')['toRaw']
|
||||||
|
const toRef: typeof import('vue')['toRef']
|
||||||
|
const toRefs: typeof import('vue')['toRefs']
|
||||||
|
const toValue: typeof import('vue')['toValue']
|
||||||
|
const treeDataTranslate: typeof import('../../src/utils/index.js')['treeDataTranslate']
|
||||||
|
const triggerRef: typeof import('vue')['triggerRef']
|
||||||
|
const unitOption: typeof import('../../src/utils/unitOption.js')['unitOption']
|
||||||
|
const unref: typeof import('vue')['unref']
|
||||||
|
const uploadFile: typeof import('../../src/utils/http.js')['uploadFile']
|
||||||
|
const useAttrs: typeof import('vue')['useAttrs']
|
||||||
|
const useCommonStore: typeof import('../../src/stores/common.js')['useCommonStore']
|
||||||
|
const useCssModule: typeof import('vue')['useCssModule']
|
||||||
|
const useCssVars: typeof import('vue')['useCssVars']
|
||||||
|
const useId: typeof import('vue')['useId']
|
||||||
|
const useLink: typeof import('vue-router')['useLink']
|
||||||
|
const useModel: typeof import('vue')['useModel']
|
||||||
|
const useRoute: typeof import('vue-router')['useRoute']
|
||||||
|
const useRouter: typeof import('vue-router')['useRouter']
|
||||||
|
const useSlots: typeof import('vue')['useSlots']
|
||||||
|
const useTemplateRef: typeof import('vue')['useTemplateRef']
|
||||||
|
const useUserStore: typeof import('../../src/stores/user.js')['useUserStore']
|
||||||
|
const validNoEmptySpace: typeof import('../../src/utils/validate.js')['validNoEmptySpace']
|
||||||
|
const watch: typeof import('vue')['watch']
|
||||||
|
const watchEffect: typeof import('vue')['watchEffect']
|
||||||
|
const watchPostEffect: typeof import('vue')['watchPostEffect']
|
||||||
|
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
|
||||||
|
}
|
||||||
|
// for type re-export
|
||||||
|
declare global {
|
||||||
|
// @ts-ignore
|
||||||
|
export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
|
||||||
|
import('vue')
|
||||||
|
}
|
||||||
+111
-45
@@ -1,57 +1,118 @@
|
|||||||
import { defineConfig, loadEnv } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
import vue from '@vitejs/plugin-vue'
|
import vue from '@vitejs/plugin-vue'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
|
||||||
import AutoImport from 'unplugin-auto-import/vite'
|
import AutoImport from 'unplugin-auto-import/vite'
|
||||||
import Components from 'unplugin-vue-components/vite'
|
import Components from 'unplugin-vue-components/vite'
|
||||||
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
|
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
|
||||||
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
|
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
|
||||||
import viteCompression from 'vite-plugin-compression'
|
import { compression } from 'vite-plugin-compression2'
|
||||||
|
|
||||||
// eslint
|
// 开发态预扫描全部业务源码入口,尽量在冷启动阶段就发现懒路由里的第三方依赖。
|
||||||
import eslintPlugin from 'vite-plugin-eslint'
|
const optimizeDepEntries = [
|
||||||
|
'index.html',
|
||||||
|
'src/main.js',
|
||||||
|
'src/**/*.js',
|
||||||
|
'src/**/*.vue',
|
||||||
|
'!dist/**',
|
||||||
|
'!types/**'
|
||||||
|
]
|
||||||
|
// 显式预构建插件动态注入的深层依赖,避免首次访问新页面时才触发依赖重优化并整页刷新。
|
||||||
|
const optimizeDepIncludes = [
|
||||||
|
'element-plus/es/components/**',
|
||||||
|
'element-plus/es/components/**/style/css'
|
||||||
|
]
|
||||||
|
// 自动组件扫描时,排除仅供容器组件内部手动引用的私有子组件目录。
|
||||||
|
const componentGlobs = [
|
||||||
|
'src/components/**/*.vue',
|
||||||
|
'!src/components/decorate-dialog-select/components/**/*.vue'
|
||||||
|
]
|
||||||
|
// 预先记录 Element Plus 图标组件名,供自动按需解析使用。
|
||||||
|
const elementPlusIconNames = new Set(Object.keys(ElementPlusIconsVue))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析第三方依赖的分包名称
|
||||||
|
* @param {String} moduleId 模块路径
|
||||||
|
* @returns {String|null} 分包名称
|
||||||
|
*/
|
||||||
|
function resolveVendorChunkName(moduleId) {
|
||||||
|
// 统一路径分隔符,避免 Windows 反斜杠路径导致分包命名逻辑失效。
|
||||||
|
const normalizedModuleId = moduleId.replace(/\\/g, '/')
|
||||||
|
|
||||||
|
// 只对第三方依赖做分包命名,业务代码继续走 Vite 默认拆分策略。
|
||||||
|
if (!normalizedModuleId.includes('node_modules')) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
// 兼容 pnpm 的物理目录结构,保持历史产物命名规则稳定。
|
||||||
|
if (normalizedModuleId.includes('.pnpm/')) {
|
||||||
|
return normalizedModuleId.split('.pnpm/')[1].split('/')[0].toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 兼容普通 node_modules 目录结构,避免不同包管理方式下 chunk 名称漂移。
|
||||||
|
if (normalizedModuleId.includes('node_modules/')) {
|
||||||
|
return normalizedModuleId.split('node_modules/')[1].split('/')[0].toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'vendor'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析 Element Plus 图标组件
|
||||||
|
* @param {String} componentName 组件名称
|
||||||
|
* @returns {{name: String, from: String}|null} 自动导入配置
|
||||||
|
*/
|
||||||
|
function resolveElementPlusIcon(componentName) {
|
||||||
|
// 只有命中 Element Plus 图标导出名时,才按需导入对应图标组件。
|
||||||
|
if (elementPlusIconNames.has(componentName)) {
|
||||||
|
return {
|
||||||
|
name: componentName,
|
||||||
|
from: '@element-plus/icons-vue'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
// https://vitejs.dev/config/
|
||||||
export default defineConfig(({ command })=> {
|
export default defineConfig(() => {
|
||||||
return {
|
return {
|
||||||
|
optimizeDeps: {
|
||||||
|
// 扩大开发态依赖扫描范围,提前覆盖懒加载页面里的直接依赖导入。
|
||||||
|
entries: optimizeDepEntries,
|
||||||
|
// 显式纳入插件运行时生成的 Element Plus 深层导入,避免访问新路由时补优化触发 reload。
|
||||||
|
include: optimizeDepIncludes
|
||||||
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
vue(),
|
vue(),
|
||||||
createSvgIconsPlugin({
|
createSvgIconsPlugin({
|
||||||
iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')],
|
iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')],
|
||||||
symbolId: 'icon-[dir]-[name]'
|
symbolId: 'icon-[dir]-[name]'
|
||||||
}),
|
}),
|
||||||
// 自动引入内容
|
// 自动引入组合式 API、路由 API 以及 Element Plus 指令/方法。
|
||||||
AutoImport({
|
AutoImport({
|
||||||
imports: [
|
imports: ['vue', 'vue-router'],
|
||||||
'vue',
|
dirs: ['src/hooks/**', 'src/stores/**', 'src/utils/**'],
|
||||||
'vue-router'
|
// 开发态和生产态统一走同一套 Element Plus 解析链路,减少两边行为差异。
|
||||||
],
|
resolvers: [ElementPlusResolver()],
|
||||||
dirs: [
|
// 将自动生成的声明文件移出 src,避免开发态写入声明时触发页面整刷。
|
||||||
'src/hooks/**',
|
dts: 'types/auto-import/imports.d.ts'
|
||||||
'src/stores/**',
|
|
||||||
'src/utils/**'
|
|
||||||
],
|
|
||||||
resolvers: command === 'build' ? [ElementPlusResolver()] : [],
|
|
||||||
dts: 'src/auto-import/imports.d.ts',
|
|
||||||
eslintrc: {
|
|
||||||
enabled: false
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
// 自动引入组件
|
// 自动引入业务组件与 Element Plus 组件。
|
||||||
Components({
|
Components({
|
||||||
dirs: [
|
// 使用精确 globs 控制自动注册范围,避免内部私有子组件参与全局组件命名。
|
||||||
'src/components'
|
globs: componentGlobs,
|
||||||
],
|
// 同时补齐 Element Plus 图标的按需注册,替代 main.js 里的整包全局注册。
|
||||||
resolvers: command === 'build' ? [ElementPlusResolver()] : [],
|
resolvers: [resolveElementPlusIcon, ElementPlusResolver()],
|
||||||
dts: 'src/auto-import/components.d.ts'
|
// 将自动生成的组件声明移出 src,减少首次访问新页面时的全量刷新概率。
|
||||||
|
dts: 'types/auto-import/components.d.ts'
|
||||||
}),
|
}),
|
||||||
// 对大于 1k 的文件进行压缩
|
// 对大于 1 KB 的静态资源生成 gzip 预压缩文件。
|
||||||
viteCompression({
|
compression({
|
||||||
threshold: 1000,
|
threshold: 1024,
|
||||||
|
algorithms: ['gzip']
|
||||||
})
|
})
|
||||||
].concat(
|
],
|
||||||
// eslint
|
|
||||||
command !== 'build' ? [eslintPlugin({ include: ['src/**/*.js', 'src/**/*.vue', 'src/*.js', 'src/*.vue'] })] : []
|
|
||||||
),
|
|
||||||
server: {
|
server: {
|
||||||
host: true,
|
host: true,
|
||||||
port: 9527,
|
port: 9527,
|
||||||
@@ -64,27 +125,32 @@ export default defineConfig(({ command })=> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
build: {
|
build: {
|
||||||
base: './',
|
rolldownOptions: {
|
||||||
rollupOptions: {
|
// 静态资源分类打包。
|
||||||
// 静态资源分类打包
|
|
||||||
output: {
|
output: {
|
||||||
chunkFileNames: 'static/js/[name]-[hash].js',
|
chunkFileNames: 'static/js/[name]-[hash].js',
|
||||||
entryFileNames: 'static/js/[name]-[hash].js',
|
entryFileNames: 'static/js/[name]-[hash].js',
|
||||||
assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
|
assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
|
||||||
// 静态资源分拆打包
|
// 使用 Rolldown 的 codeSplitting 配置替代旧链路中的 manualChunks 写法。
|
||||||
manualChunks (id) {
|
codeSplitting: {
|
||||||
if (id.includes('node_modules')) {
|
groups: [
|
||||||
if (id.toString().indexOf('.pnpm/') !== -1) {
|
{
|
||||||
return id.toString().split('.pnpm/')[1].split('/')[0].toString();
|
// 动态计算第三方依赖的 chunk 名称,延续原有按包拆分的缓存策略。
|
||||||
} else if (id.toString().indexOf('node_modules/') !== -1) {
|
name(moduleId) {
|
||||||
return id.toString().split('node_modules/')[1].split('/')[0].toString();
|
return resolveVendorChunkName(moduleId)
|
||||||
|
},
|
||||||
|
// 仅捕获第三方依赖模块,避免业务代码被强行归并到 vendor chunk。
|
||||||
|
test: /node_modules[\\/]/
|
||||||
}
|
}
|
||||||
}
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
sourcemap: false,
|
sourcemap: false,
|
||||||
target: 'es2015',
|
// 使用 Vite 8 默认的 Oxc 压缩链路,避免引入额外压缩依赖。
|
||||||
|
minify: 'oxc',
|
||||||
|
// 保留对超大共享库的提醒,同时减少后台项目常规 chunk 的误报。
|
||||||
|
chunkSizeWarningLimit: 700,
|
||||||
reportCompressedSize: false
|
reportCompressedSize: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user