feat: 🚀 多语言配置,修复vite打包无法跳转路由
This commit is contained in:
parent
fe70679ea2
commit
d348a8cc37
84
.eslintrc.js
84
.eslintrc.js
|
@ -1,26 +1,25 @@
|
||||||
// @see: http://eslint.cn
|
// @see: http://eslint.cn
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
root: true,
|
root: true,
|
||||||
env: {
|
env: {
|
||||||
browser: true,
|
browser: true,
|
||||||
node: true,
|
node: true,
|
||||||
es6: true,
|
es6: true
|
||||||
},
|
},
|
||||||
/* 指定如何解析语法 */
|
/* 指定如何解析语法 */
|
||||||
parser: 'vue-eslint-parser',
|
parser: "vue-eslint-parser",
|
||||||
/* 优先级低于 parse 的语法解析配置 */
|
/* 优先级低于 parse 的语法解析配置 */
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
parser: '@typescript-eslint/parser',
|
parser: "@typescript-eslint/parser",
|
||||||
ecmaVersion: 2020,
|
ecmaVersion: 2020,
|
||||||
sourceType: 'module',
|
sourceType: "module",
|
||||||
jsxPragma: 'React',
|
jsxPragma: "React",
|
||||||
ecmaFeatures: {
|
ecmaFeatures: {
|
||||||
jsx: true,
|
jsx: true
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
/* 继承某些已有的规则 */
|
/* 继承某些已有的规则 */
|
||||||
extends: ['plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended', 'prettier', 'plugin:prettier/recommended'],
|
extends: ["plugin:vue/vue3-recommended", "plugin:@typescript-eslint/recommended", "prettier", "plugin:prettier/recommended"],
|
||||||
/*
|
/*
|
||||||
* "off" 或 0 ==> 关闭规则
|
* "off" 或 0 ==> 关闭规则
|
||||||
* "warn" 或 1 ==> 打开的规则作为警告(不影响代码执行)
|
* "warn" 或 1 ==> 打开的规则作为警告(不影响代码执行)
|
||||||
|
@ -28,42 +27,41 @@ module.exports = {
|
||||||
*/
|
*/
|
||||||
rules: {
|
rules: {
|
||||||
// eslint (http://eslint.cn/docs/rules)
|
// eslint (http://eslint.cn/docs/rules)
|
||||||
'no-var': 'error', // 要求使用 let 或 const 而不是 var
|
"no-var": "error", // 要求使用 let 或 const 而不是 var
|
||||||
'no-multiple-empty-lines': ['error', { max: 1 }], // 不允许多个空行
|
"no-multiple-empty-lines": ["error", { max: 1 }], // 不允许多个空行
|
||||||
'no-use-before-define': 'off', // 禁止在 函数/类/变量 定义之前使用它们
|
"no-use-before-define": "off", // 禁止在 函数/类/变量 定义之前使用它们
|
||||||
'prefer-const': 'off', // 此规则旨在标记使用 let 关键字声明但在初始分配后从未重新分配的变量,要求使用 const
|
"prefer-const": "off", // 此规则旨在标记使用 let 关键字声明但在初始分配后从未重新分配的变量,要求使用 const
|
||||||
'no-irregular-whitespace': 'off', // 禁止不规则的空白
|
"no-irregular-whitespace": "off", // 禁止不规则的空白
|
||||||
|
|
||||||
// typeScript (https://typescript-eslint.io/rules)
|
// typeScript (https://typescript-eslint.io/rules)
|
||||||
'@typescript-eslint/no-unused-vars': 'error', // 禁止定义未使用的变量
|
"@typescript-eslint/prefer-ts-expect-error": "error", // 禁止使用 @ts-ignore
|
||||||
'@typescript-eslint/prefer-ts-expect-error': 'error', // 禁止使用 @ts-ignore
|
"@typescript-eslint/no-inferrable-types": "off", // 可以轻松推断的显式类型可能会增加不必要的冗长
|
||||||
'@typescript-eslint/no-inferrable-types': 'off', // 可以轻松推断的显式类型可能会增加不必要的冗长
|
"@typescript-eslint/no-namespace": "off", // 禁止使用自定义 TypeScript 模块和命名空间。
|
||||||
'@typescript-eslint/no-namespace': 'off', // 禁止使用自定义 TypeScript 模块和命名空间。
|
"@typescript-eslint/no-explicit-any": "off", // 禁止使用 any 类型
|
||||||
'@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 类型
|
"@typescript-eslint/ban-types": "off", // 禁止使用特定类型
|
||||||
'@typescript-eslint/ban-types': 'off', // 禁止使用特定类型
|
"@typescript-eslint/explicit-function-return-type": "off", // 不允许对初始化为数字、字符串或布尔值的变量或参数进行显式类型声明
|
||||||
'@typescript-eslint/explicit-function-return-type': 'off', // 不允许对初始化为数字、字符串或布尔值的变量或参数进行显式类型声明
|
"@typescript-eslint/no-var-requires": "off", // 不允许在 import 语句中使用 require 语句
|
||||||
'@typescript-eslint/no-var-requires': 'off', // 不允许在 import 语句中使用 require 语句
|
"@typescript-eslint/no-empty-function": "off", // 禁止空函数
|
||||||
'@typescript-eslint/no-empty-function': 'off', // 禁止空函数
|
"@typescript-eslint/no-use-before-define": "off", // 禁止在变量定义之前使用它们
|
||||||
'@typescript-eslint/no-use-before-define': 'off', // 禁止在变量定义之前使用它们
|
"@typescript-eslint/ban-ts-comment": "off", // 禁止 @ts-<directive> 使用注释或要求在指令后进行描述
|
||||||
'@typescript-eslint/ban-ts-comment': 'off', // 禁止 @ts-<directive> 使用注释或要求在指令后进行描述
|
"@typescript-eslint/no-non-null-assertion": "off", // 不允许使用后缀运算符的非空断言(!)
|
||||||
'@typescript-eslint/no-non-null-assertion': 'off', // 不允许使用后缀运算符的非空断言(!)
|
"@typescript-eslint/explicit-module-boundary-types": "off", // 要求导出函数和类的公共类方法的显式返回和参数类型
|
||||||
'@typescript-eslint/explicit-module-boundary-types': 'off', // 要求导出函数和类的公共类方法的显式返回和参数类型
|
"@typescript-eslint/no-unused-vars": "off",
|
||||||
'@typescript-eslint/no-unused-vars': 'off',
|
|
||||||
|
|
||||||
// vue (https://eslint.vuejs.org/rules)
|
// vue (https://eslint.vuejs.org/rules)
|
||||||
'vue/no-v-html': 'off', // 禁止使用 v-html
|
"vue/no-v-html": "off", // 禁止使用 v-html
|
||||||
'vue/script-setup-uses-vars': 'error', // 防止<script setup>使用的变量<template>被标记为未使用,此规则仅在启用该no-unused-vars规则时有效。
|
"vue/script-setup-uses-vars": "error", // 防止<script setup>使用的变量<template>被标记为未使用,此规则仅在启用该no-unused-vars规则时有效。
|
||||||
'vue/v-slot-style': 'error', // 强制执行 v-slot 指令样式
|
"vue/v-slot-style": "error", // 强制执行 v-slot 指令样式
|
||||||
'vue/no-mutating-props': 'off', // 不允许组件 prop的改变
|
"vue/no-mutating-props": "off", // 不允许组件 prop的改变
|
||||||
'vue/custom-event-name-casing': 'off', // 为自定义事件名称强制使用特定大小写
|
"vue/custom-event-name-casing": "off", // 为自定义事件名称强制使用特定大小写
|
||||||
'vue/attributes-order': 'off', // vue api使用顺序,强制执行属性顺序
|
"vue/attributes-order": "off", // vue api使用顺序,强制执行属性顺序
|
||||||
'vue/one-component-per-file': 'off', // 强制每个组件都应该在自己的文件中
|
"vue/one-component-per-file": "off", // 强制每个组件都应该在自己的文件中
|
||||||
'vue/html-closing-bracket-newline': 'off', // 在标签的右括号之前要求或禁止换行
|
"vue/html-closing-bracket-newline": "off", // 在标签的右括号之前要求或禁止换行
|
||||||
'vue/max-attributes-per-line': 'off', // 强制每行的最大属性数
|
"vue/max-attributes-per-line": "off", // 强制每行的最大属性数
|
||||||
'vue/multiline-html-element-content-newline': 'off', // 在多行元素的内容之前和之后需要换行符
|
"vue/multiline-html-element-content-newline": "off", // 在多行元素的内容之前和之后需要换行符
|
||||||
'vue/singleline-html-element-content-newline': 'off', // 在单行元素的内容之前和之后需要换行符
|
"vue/singleline-html-element-content-newline": "off", // 在单行元素的内容之前和之后需要换行符
|
||||||
'vue/attribute-hyphenation': 'off', // 对模板中的自定义组件强制执行属性命名样式
|
"vue/attribute-hyphenation": "off", // 对模板中的自定义组件强制执行属性命名样式
|
||||||
'vue/require-default-prop': 'off', // 此规则要求为每个 prop 为必填时,必须提供默认值
|
"vue/require-default-prop": "off", // 此规则要求为每个 prop 为必填时,必须提供默认值
|
||||||
'vue/multi-word-component-names': 'off', // 要求组件名称始终为 “-” 链接的单词
|
"vue/multi-word-component-names": "off" // 要求组件名称始终为 “-” 链接的单词
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// @see: https://www.prettier.cn
|
// @see: https://www.prettier.cn
|
||||||
|
|
||||||
module.exports = {
|
export default {
|
||||||
// 超过最大值换行
|
// 超过最大值换行
|
||||||
printWidth: 130,
|
printWidth: 130,
|
||||||
// 缩进字节数
|
// 缩进字节数
|
||||||
|
@ -12,28 +12,28 @@ module.exports = {
|
||||||
// 使用单引号(true单引号,false双引号)
|
// 使用单引号(true单引号,false双引号)
|
||||||
singleQuote: true,
|
singleQuote: true,
|
||||||
// 更改引用对象属性的时间 可选值"<as-needed|consistent|preserve>"
|
// 更改引用对象属性的时间 可选值"<as-needed|consistent|preserve>"
|
||||||
quoteProps: 'as-needed',
|
quoteProps: "as-needed",
|
||||||
// 在对象,数组括号与文字之间加空格 "{ foo: bar }"
|
// 在对象,数组括号与文字之间加空格 "{ foo: bar }"
|
||||||
bracketSpacing: true,
|
bracketSpacing: true,
|
||||||
// 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"<none|es5|all>",默认none
|
// 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"<none|es5|all>",默认none
|
||||||
trailingComma: 'all',
|
trailingComma: "all",
|
||||||
// 在JSX中使用单引号而不是双引号
|
// 在JSX中使用单引号而不是双引号
|
||||||
jsxSingleQuote: true,
|
jsxSingleQuote: true,
|
||||||
// (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号 ,always:不省略括号
|
// (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号 ,always:不省略括号
|
||||||
arrowParens: 'avoid',
|
arrowParens: "avoid",
|
||||||
// 如果文件顶部已经有一个 doclock,这个选项将新建一行注释,并打上@format标记。
|
// 如果文件顶部已经有一个 doclock,这个选项将新建一行注释,并打上@format标记。
|
||||||
insertPragma: false,
|
insertPragma: false,
|
||||||
// 指定要使用的解析器,不需要写文件开头的 @prettier
|
// 指定要使用的解析器,不需要写文件开头的 @prettier
|
||||||
requirePragma: false,
|
requirePragma: false,
|
||||||
// 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行
|
// 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行
|
||||||
proseWrap: 'preserve',
|
proseWrap: "preserve",
|
||||||
// 在html中空格是否是敏感的 "css" - 遵守CSS显示属性的默认值, "strict" - 空格被认为是敏感的 ,"ignore" - 空格被认为是不敏感的
|
// 在html中空格是否是敏感的 "css" - 遵守CSS显示属性的默认值, "strict" - 空格被认为是敏感的 ,"ignore" - 空格被认为是不敏感的
|
||||||
htmlWhitespaceSensitivity: 'css',
|
htmlWhitespaceSensitivity: "css",
|
||||||
// 换行符使用 lf 结尾是 可选值"<auto|lf|crlf|cr>"
|
// 换行符使用 lf 结尾是 可选值"<auto|lf|crlf|cr>"
|
||||||
endOfLine: 'auto',
|
endOfLine: "auto",
|
||||||
// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码
|
// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码
|
||||||
rangeStart: 0,
|
rangeStart: 0,
|
||||||
rangeEnd: Infinity,
|
rangeEnd: Infinity,
|
||||||
|
|
||||||
vueIndentScriptAndStyle: false, // Vue文件脚本和样式标签缩进
|
vueIndentScriptAndStyle: false // Vue文件脚本和样式标签缩进
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,62 +1,62 @@
|
||||||
// @see: https://stylelint.io
|
// @see: https://stylelint.io
|
||||||
|
|
||||||
module.exports = {
|
export default {
|
||||||
root: true,
|
root: true,
|
||||||
defaultSeverity: 'error',
|
defaultSeverity: "error",
|
||||||
plugins: ['stylelint-order', 'stylelint-scss'],
|
plugins: ["stylelint-order", "stylelint-scss"],
|
||||||
/* 继承某些已有的规则 */
|
/* 继承某些已有的规则 */
|
||||||
extends: [
|
extends: [
|
||||||
'stylelint-config-standard', // 配置stylelint拓展插件
|
"stylelint-config-standard", // 配置stylelint拓展插件
|
||||||
'stylelint-config-html/html', // the shareable html config for Stylelint.
|
"stylelint-config-html/html", // the shareable html config for Stylelint.
|
||||||
'stylelint-config-html/vue', // 配置 vue 中 template 样式格式化
|
"stylelint-config-html/vue", // 配置 vue 中 template 样式格式化
|
||||||
'stylelint-config-recess-order', // 配置stylelint css属性书写顺序插件,
|
"stylelint-config-recess-order", // 配置stylelint css属性书写顺序插件,
|
||||||
'stylelint-config-prettier', // 配置stylelint和prettier兼容
|
"stylelint-config-prettier" // 配置stylelint和prettier兼容
|
||||||
],
|
],
|
||||||
overrides: [
|
overrides: [
|
||||||
// 扫描 .vue/html 文件中的<style>标签内的样式
|
// 扫描 .vue/html 文件中的<style>标签内的样式
|
||||||
{
|
{
|
||||||
files: ['**/*.{vue,html}'],
|
files: ["**/*.{vue,html}"],
|
||||||
customSyntax: 'postcss-html',
|
customSyntax: "postcss-html",
|
||||||
rules: {
|
rules: {
|
||||||
// 禁止未知的伪类选择器
|
// 禁止未知的伪类选择器
|
||||||
'selector-pseudo-class-no-unknown': [true, { ignorePseudoClasses: ['deep', 'global'] }],
|
"selector-pseudo-class-no-unknown": [true, { ignorePseudoClasses: ["deep", "global"] }],
|
||||||
// 禁止未知的伪元素选择器
|
// 禁止未知的伪元素选择器
|
||||||
'selector-pseudo-element-no-unknown': [true, { ignorePseudoElements: ['v-deep', 'v-global', 'v-slotted'] }],
|
"selector-pseudo-element-no-unknown": [true, { ignorePseudoElements: ["v-deep", "v-global", "v-slotted"] }]
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
files: ['*.less', '**/*.less', '*.scss', '**/*.scss'],
|
files: ["*.less", "**/*.less", "*.scss", "**/*.scss"],
|
||||||
customSyntax: 'postcss-less',
|
customSyntax: "postcss-less",
|
||||||
rules: {
|
rules: {
|
||||||
'less/color-no-invalid-hex': true,
|
"less/color-no-invalid-hex": true,
|
||||||
'less/no-duplicate-variables': true,
|
"less/no-duplicate-variables": true
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
],
|
],
|
||||||
/**
|
/**
|
||||||
* null => 关闭该规则
|
* null => 关闭该规则
|
||||||
*/
|
*/
|
||||||
rules: {
|
rules: {
|
||||||
'value-keyword-case': null, // 在 css 中使用 v-bind,不报错
|
"value-keyword-case": null, // 在 css 中使用 v-bind,不报错
|
||||||
'no-descending-specificity': null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器
|
"no-descending-specificity": null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器
|
||||||
'function-url-quotes': 'always', // 要求或禁止 URL 的引号 "always(必须加上引号)"|"never(没有引号)"
|
"function-url-quotes": "always", // 要求或禁止 URL 的引号 "always(必须加上引号)"|"never(没有引号)"
|
||||||
'string-quotes': 'double', // 指定字符串使用单引号或双引号
|
"string-quotes": "double", // 指定字符串使用单引号或双引号
|
||||||
'unit-case': null, // 指定单位的大小写 "lower(全小写)"|"upper(全大写)"
|
"unit-case": null, // 指定单位的大小写 "lower(全小写)"|"upper(全大写)"
|
||||||
'color-hex-case': 'lower', // 指定 16 进制颜色的大小写 "lower(全小写)"|"upper(全大写)"
|
"color-hex-case": "lower", // 指定 16 进制颜色的大小写 "lower(全小写)"|"upper(全大写)"
|
||||||
'color-hex-length': 'long', // 指定 16 进制颜色的简写或扩写 "short(16进制简写)"|"long(16进制扩写)"
|
"color-hex-length": "long", // 指定 16 进制颜色的简写或扩写 "short(16进制简写)"|"long(16进制扩写)"
|
||||||
'rule-empty-line-before': 'never', // 要求或禁止在规则之前的空行 "always(规则之前必须始终有一个空行)"|"never(规则前绝不能有空行)"|"always-multi-line(多行规则之前必须始终有一个空行)"|"never-multi-line(多行规则之前绝不能有空行。)"
|
"rule-empty-line-before": "never", // 要求或禁止在规则之前的空行 "always(规则之前必须始终有一个空行)"|"never(规则前绝不能有空行)"|"always-multi-line(多行规则之前必须始终有一个空行)"|"never-multi-line(多行规则之前绝不能有空行。)"
|
||||||
'font-family-no-missing-generic-family-keyword': null, // 禁止在字体族名称列表中缺少通用字体族关键字
|
"font-family-no-missing-generic-family-keyword": null, // 禁止在字体族名称列表中缺少通用字体族关键字
|
||||||
'block-opening-brace-space-before': 'always', // 要求在块的开大括号之前必须有一个空格或不能有空白符 "always(大括号前必须始终有一个空格)"|"never(左大括号之前绝不能有空格)"|"always-single-line(在单行块中的左大括号之前必须始终有一个空格)"|"never-single-line(在单行块中的左大括号之前绝不能有空格)"|"always-multi-line(在多行块中,左大括号之前必须始终有一个空格)"|"never-multi-line(多行块中的左大括号之前绝不能有空格)"
|
"block-opening-brace-space-before": "always", // 要求在块的开大括号之前必须有一个空格或不能有空白符 "always(大括号前必须始终有一个空格)"|"never(左大括号之前绝不能有空格)"|"always-single-line(在单行块中的左大括号之前必须始终有一个空格)"|"never-single-line(在单行块中的左大括号之前绝不能有空格)"|"always-multi-line(在多行块中,左大括号之前必须始终有一个空格)"|"never-multi-line(多行块中的左大括号之前绝不能有空格)"
|
||||||
'property-no-unknown': null, // 禁止未知的属性(true 为不允许)
|
"property-no-unknown": null, // 禁止未知的属性(true 为不允许)
|
||||||
'no-empty-source': null, // 禁止空源码
|
"no-empty-source": null, // 禁止空源码
|
||||||
'declaration-block-trailing-semicolon': null, // 要求或不允许在声明块中使用尾随分号 string:"always(必须始终有一个尾随分号)"|"never(不得有尾随分号)"
|
"declaration-block-trailing-semicolon": null, // 要求或不允许在声明块中使用尾随分号 string:"always(必须始终有一个尾随分号)"|"never(不得有尾随分号)"
|
||||||
'selector-class-pattern': null, // 强制选择器类名的格式
|
"selector-class-pattern": null, // 强制选择器类名的格式
|
||||||
'value-no-vendor-prefix': null, // 关闭 vendor-prefix(为了解决多行省略 -webkit-box)
|
"value-no-vendor-prefix": null, // 关闭 vendor-prefix(为了解决多行省略 -webkit-box)
|
||||||
'selector-pseudo-class-no-unknown': [
|
"selector-pseudo-class-no-unknown": [
|
||||||
true,
|
true,
|
||||||
{
|
{
|
||||||
ignorePseudoClasses: ['global', 'v-deep', 'deep'],
|
ignorePseudoClasses: ["global", "v-deep", "deep"]
|
||||||
},
|
}
|
||||||
],
|
]
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,98 +1,98 @@
|
||||||
// @see: https://cz-git.qbenben.com/zh/guide
|
// @see: https://cz-git.qbenben.com/zh/guide
|
||||||
/** @type {import('cz-git').UserConfig} */
|
/** @type {import("cz-git").UserConfig} */
|
||||||
|
|
||||||
module.exports= {
|
export default {
|
||||||
ignores: [commit => commit === 'init'],
|
ignores: [commit => commit === "init"],
|
||||||
extends: ['@commitlint/config-conventional'],
|
extends: ["@commitlint/config-conventional"],
|
||||||
rules: {
|
rules: {
|
||||||
// @see: https://commitlint.js.org/#/reference-rules
|
// @see: https://commitlint.js.org/#/reference-rules
|
||||||
'body-leading-blank': [2, 'always'],
|
"body-leading-blank": [2, "always"],
|
||||||
'footer-leading-blank': [1, 'always'],
|
"footer-leading-blank": [1, "always"],
|
||||||
'header-max-length': [2, 'always', 108],
|
"header-max-length": [2, "always", 108],
|
||||||
'subject-empty': [2, 'never'],
|
"subject-empty": [2, "never"],
|
||||||
'type-empty': [2, 'never'],
|
"type-empty": [2, "never"],
|
||||||
'subject-case': [0],
|
"subject-case": [0],
|
||||||
'type-enum': [
|
"type-enum": [
|
||||||
2,
|
2,
|
||||||
'always',
|
"always",
|
||||||
[
|
[
|
||||||
'init',
|
"init",
|
||||||
'feat',
|
"feat",
|
||||||
'page',
|
"page",
|
||||||
'media',
|
"media",
|
||||||
'completepage',
|
"completepage",
|
||||||
'fix',
|
"fix",
|
||||||
'fixbug',
|
"fixbug",
|
||||||
'docs',
|
"docs",
|
||||||
'style',
|
"style",
|
||||||
'refactor',
|
"refactor",
|
||||||
'perf',
|
"perf",
|
||||||
'test',
|
"test",
|
||||||
'build',
|
"build",
|
||||||
'ci',
|
"ci",
|
||||||
'chore',
|
"chore",
|
||||||
'revert',
|
"revert",
|
||||||
'wip',
|
"wip",
|
||||||
'workflow',
|
"workflow",
|
||||||
'types',
|
"types",
|
||||||
'release',
|
"release",
|
||||||
'optimize',
|
"optimize"
|
||||||
],
|
]
|
||||||
],
|
]
|
||||||
},
|
},
|
||||||
prompt: {
|
prompt: {
|
||||||
messages: {
|
messages: {
|
||||||
type: '选择你要提交的类型 :',
|
type: "选择你要提交的类型 :",
|
||||||
scope: '选择一个提交范围(可选):',
|
scope: "选择一个提交范围(可选):",
|
||||||
customScope: '请输入自定义的提交范围 :',
|
customScope: "请输入自定义的提交范围 :",
|
||||||
subject: '填写简短精炼的变更描述 :\n',
|
subject: "填写简短精炼的变更描述 :\n",
|
||||||
body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n',
|
body: "填写更加详细的变更描述(可选)。使用 \"|\" 换行 :\n",
|
||||||
breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n',
|
breaking: "列举非兼容性重大的变更(可选)。使用 \"|\" 换行 :\n",
|
||||||
footerPrefixsSelect: '选择关联issue前缀(可选):',
|
footerPrefixsSelect: "选择关联issue前缀(可选):",
|
||||||
customFooterPrefixs: '输入自定义issue前缀 :',
|
customFooterPrefixs: "输入自定义issue前缀 :",
|
||||||
footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
|
footer: "列举关联issue (可选) 例如: #31, #I3244 :\n",
|
||||||
confirmCommit: '是否提交或修改commit ?',
|
confirmCommit: "是否提交或修改commit ?"
|
||||||
},
|
},
|
||||||
types: [
|
types: [
|
||||||
{ value: 'init', name: '初始化: ⏳ 初始化项目', emoji: '⏳' },
|
{ value: "init", name: "初始化: ⏳ 初始化项目", emoji: "⏳" },
|
||||||
{ value: 'optimize', name: '优化代码: ♻️ 优化项目代码', emoji: '♻️' },
|
{ value: "optimize", name: "优化代码: ♻️ 优化项目代码", emoji: "♻️" },
|
||||||
{ value: 'feat', name: '新增: 🚀 新增功能', emoji: '🚀' },
|
{ value: "feat", name: "新增: 🚀 新增功能", emoji: "🚀" },
|
||||||
{ value: 'media', name: '媒体: 🎁 新增媒体资源', emoji: '🎁' },
|
{ value: "media", name: "媒体: 🎁 新增媒体资源", emoji: "🎁" },
|
||||||
{ value: 'page', name: '页面: 📄 新增页面', emoji: '📄' },
|
{ value: "page", name: "页面: 📄 新增页面", emoji: "📄" },
|
||||||
{ value: 'completepage', name: '完成页面: 🍻 完成页面', emoji: '🍻' },
|
{ value: "completepage", name: "完成页面: 🍻 完成页面", emoji: "🍻" },
|
||||||
{ value: 'fixbug', name: 'bug: 🐛 修改bug', emoji: '🐛' },
|
{ value: "fixbug", name: "bug: 🐛 修改bug", emoji: "🐛" },
|
||||||
{ value: 'fix', name: '修复: 🧩 修复缺陷', emoji: '🧩' },
|
{ value: "fix", name: "修复: 🧩 修复缺陷", emoji: "🧩" },
|
||||||
{ value: 'docs', name: '文档: 📚 文档变更', emoji: '📚' },
|
{ value: "docs", name: "文档: 📚 文档变更", emoji: "📚" },
|
||||||
{ value: 'style', name: '格式: 🎨 代码格式(不影响功能,例如空格、分号等格式修正)', emoji: '🎨' },
|
{ value: "style", name: "格式: 🎨 代码格式(不影响功能,例如空格、分号等格式修正)", emoji: "🎨" },
|
||||||
{ value: 'refactor', name: '重构: 〽️ 代码重构(不包括 bug 修复、功能新增)', emoji: '〽️' },
|
{ value: "refactor", name: "重构: 〽️ 代码重构(不包括 bug 修复、功能新增)", emoji: "〽️" },
|
||||||
{ value: 'perf', name: '性能: ⚡️ 性能优化', emoji: '⚡️' },
|
{ value: "perf", name: "性能: ⚡️ 性能优化", emoji: "⚡️" },
|
||||||
{ value: 'test', name: '测试: ✅ 添加疏漏测试或已有测试改动', emoji: '✅' },
|
{ value: "test", name: "测试: ✅ 添加疏漏测试或已有测试改动", emoji: "✅" },
|
||||||
{
|
{
|
||||||
value: 'chore',
|
value: "chore",
|
||||||
name: '构建: 📦️ 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等)',
|
name: "构建: 📦️ 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等)",
|
||||||
emoji: '📦️',
|
emoji: "📦️"
|
||||||
},
|
},
|
||||||
{ value: 'ci', name: '集成: 🎡 修改 CI 配置、脚本', emoji: '🎡' },
|
{ value: "ci", name: "集成: 🎡 修改 CI 配置、脚本", emoji: "🎡" },
|
||||||
{ value: 'revert', name: '回退: ⏪️ 回滚 commit', emoji: '⏪️' },
|
{ value: "revert", name: "回退: ⏪️ 回滚 commit", emoji: "⏪️" },
|
||||||
{ value: 'build', name: '打包: 🔨 项目打包发布', emoji: '🔨' },
|
{ value: "build", name: "打包: 🔨 项目打包发布", emoji: "🔨" }
|
||||||
],
|
],
|
||||||
useEmoji: true,
|
useEmoji: true,
|
||||||
themeColorCode: '',
|
themeColorCode: "",
|
||||||
scopes: [],
|
scopes: [],
|
||||||
allowCustomScopes: true,
|
allowCustomScopes: true,
|
||||||
allowEmptyScopes: true,
|
allowEmptyScopes: true,
|
||||||
customScopesAlign: 'bottom',
|
customScopesAlign: "bottom",
|
||||||
customScopesAlias: 'custom',
|
customScopesAlias: "custom",
|
||||||
emptyScopesAlias: 'empty',
|
emptyScopesAlias: "empty",
|
||||||
upperCaseSubject: false,
|
upperCaseSubject: false,
|
||||||
allowBreakingChanges: ['feat', 'fix'],
|
allowBreakingChanges: ["feat", "fix"],
|
||||||
breaklineNumber: 100,
|
breaklineNumber: 100,
|
||||||
breaklineChar: '|',
|
breaklineChar: "|",
|
||||||
skipQuestions: [],
|
skipQuestions: [],
|
||||||
issuePrefixs: [{ value: 'closed', name: 'closed: ISSUES has been processed' }],
|
issuePrefixs: [{ value: "closed", name: "closed: ISSUES has been processed" }],
|
||||||
customIssuePrefixsAlign: 'top',
|
customIssuePrefixsAlign: "top",
|
||||||
emptyIssuePrefixsAlias: 'skip',
|
emptyIssuePrefixsAlias: "skip",
|
||||||
customIssuePrefixsAlias: 'custom',
|
customIssuePrefixsAlias: "custom",
|
||||||
allowCustomIssuePrefixs: true,
|
allowCustomIssuePrefixs: true,
|
||||||
allowEmptyIssuePrefixs: true,
|
allowEmptyIssuePrefixs: true,
|
||||||
confirmColorize: true,
|
confirmColorize: true,
|
||||||
|
@ -100,9 +100,9 @@ module.exports= {
|
||||||
maxSubjectLength: Infinity,
|
maxSubjectLength: Infinity,
|
||||||
minSubjectLength: 0,
|
minSubjectLength: 0,
|
||||||
scopeOverrides: undefined,
|
scopeOverrides: undefined,
|
||||||
defaultBody: '',
|
defaultBody: "",
|
||||||
defaultIssues: '',
|
defaultIssues: "",
|
||||||
defaultScope: '',
|
defaultScope: "",
|
||||||
defaultSubject: '',
|
defaultSubject: ""
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
module.exports = {
|
export default {
|
||||||
'*.{js,jsx,ts,tsx}': ['eslint --fix --no-ignore', 'prettier --write'],
|
// "*.{js,jsx,ts,tsx}": ["eslint --fix --no-ignore", "prettier --write"],
|
||||||
'{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --write--parser json'],
|
"{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": ["prettier --write--parser json"],
|
||||||
'package.json': ['prettier --write'],
|
"package.json": ["prettier --write"],
|
||||||
'*.vue': ['eslint --fix --no-ignore', 'prettier --write'],
|
// "*.vue": ["eslint --fix", "prettier --write"],
|
||||||
'*.{scss,less,styl,html}': ['prettier --write', 'eslint --fix --no-ignore'], // 'stylelint --fix',
|
"*.{scss,less,styl,html}": ["prettier --write", "eslint --fix --no-ignore"], // 'stylelint --fix',
|
||||||
'*.md': ['prettier --write'],
|
"*.md": ["prettier --write"]
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,6 +2,7 @@
|
||||||
"name": "vite_ts_auto",
|
"name": "vite_ts_auto",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
|
"type": "module",
|
||||||
"description": "Bunny-Vite模板",
|
"description": "Bunny-Vite模板",
|
||||||
"author": "Bunny-Admin <1319900154@qq.com>",
|
"author": "Bunny-Admin <1319900154@qq.com>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
@ -28,7 +29,6 @@
|
||||||
"dayjs": "^1.11.10",
|
"dayjs": "^1.11.10",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"echarts": "^5.5.0",
|
"echarts": "^5.5.0",
|
||||||
"loadsh": "^0.0.4",
|
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mitt": "^3.0.1",
|
"mitt": "^3.0.1",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
|
@ -36,13 +36,13 @@
|
||||||
"pinia-plugin-persistedstate": "^3.2.1",
|
"pinia-plugin-persistedstate": "^3.2.1",
|
||||||
"stylelint-scss": "^6.3.0",
|
"stylelint-scss": "^6.3.0",
|
||||||
"uuid": "^9.0.1",
|
"uuid": "^9.0.1",
|
||||||
|
"vite-plugin-cdn-import": "^1.0.1",
|
||||||
"vite-plugin-compression2": "^1.1.1",
|
"vite-plugin-compression2": "^1.1.1",
|
||||||
"vue": "^3.4.21",
|
"vue": "^3.4.21",
|
||||||
"vue-cookies": "^1.8.3",
|
"vue-cookies": "^1.8.3",
|
||||||
"vue-i18n": "^9.13.1",
|
"vue-i18n": "^9.13.1",
|
||||||
"vue-lazyload": "^3.0.0",
|
"vue-lazyload": "^3.0.0",
|
||||||
"vue-router": "^4.3.0",
|
"vue-router": "^4.3.0"
|
||||||
"webpackbar": "^6.0.1"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^17.8.1",
|
"@commitlint/cli": "^17.8.1",
|
||||||
|
@ -70,6 +70,7 @@
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
"husky": "^8.0.1",
|
"husky": "^8.0.1",
|
||||||
"lint-staged": "^15.2.2",
|
"lint-staged": "^15.2.2",
|
||||||
|
"mockjs": "^1.1.0",
|
||||||
"postcss": "^8.4.35",
|
"postcss": "^8.4.35",
|
||||||
"postcss-html": "^1.6.0",
|
"postcss-html": "^1.6.0",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
|
@ -77,6 +78,7 @@
|
||||||
"sass-loader": "^14.1.1",
|
"sass-loader": "^14.1.1",
|
||||||
"typescript": "~5.3.3",
|
"typescript": "~5.3.3",
|
||||||
"vite": "^5.2.0",
|
"vite": "^5.2.0",
|
||||||
|
"vite-plugin-mock": "^3.0.2",
|
||||||
"vue-tsc": "^2.0.6"
|
"vue-tsc": "^2.0.6"
|
||||||
},
|
},
|
||||||
"gitHooks": {
|
"gitHooks": {
|
||||||
|
|
29
src/App.vue
29
src/App.vue
|
@ -1,8 +1,31 @@
|
||||||
<script setup lang="ts">
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<RouterView />
|
<RouterView />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { userI18nStore } from "@/store/i18n.ts";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
import { onMounted } from "vue";
|
||||||
|
|
||||||
|
const i18nStore = userI18nStore();
|
||||||
|
const i18n = useI18n();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 设置多语言内容
|
||||||
|
*/
|
||||||
|
const setI18n = async () => {
|
||||||
|
await i18nStore.fetchI18n();
|
||||||
|
const languageData = JSON.parse(localStorage.getItem("i18nStore") as any);
|
||||||
|
const local = languageData.i18n.local;
|
||||||
|
|
||||||
|
// 初始化设置多语言内容
|
||||||
|
i18n.locale.value = local;
|
||||||
|
i18n.mergeLocaleMessage(local, languageData.i18n[local]);
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await setI18n();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped></style>
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
import Request from "@/service/request-mock.ts";
|
||||||
|
|
||||||
|
export const fetchGetI18n = () => {
|
||||||
|
return Request({
|
||||||
|
url: "/getI18n",
|
||||||
|
method: "GET"
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
import { createI18n } from 'vue-i18n';
|
import { createI18n } from "vue-i18n";
|
||||||
import en from './modules/en';
|
|
||||||
import zh_CN from './modules/zh_CN';
|
|
||||||
|
|
||||||
|
// ? 从本地存储中获取数据
|
||||||
|
const languageData = localStorage.getItem("i18nStore");
|
||||||
|
|
||||||
|
// 配置多语言
|
||||||
const i18n = createI18n({
|
const i18n = createI18n({
|
||||||
legacy: false, // 如果要支持 compositionAPI,此项必须设置为 false
|
// 如果要支持 compositionAPI,此项必须设置为 false
|
||||||
locale: 'zh_CN', // 设置语言类型
|
legacy: false,
|
||||||
globalInjection: true, // 全局注册$t方法
|
// ? 全局注册$t方法
|
||||||
messages: { zh_CN, en },
|
globalInjection: true,
|
||||||
|
// 本地内容存在时,首次加载如果本地存储没有多语言需要再刷新
|
||||||
|
messages: languageData ? JSON.parse(languageData).i18n : {}
|
||||||
});
|
});
|
||||||
|
|
||||||
export default i18n;
|
export default i18n;
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
export default {
|
|
||||||
login: {
|
|
||||||
reset: 'reset',
|
|
||||||
register: 'register',
|
|
||||||
},
|
|
||||||
home: {},
|
|
||||||
tabs: {},
|
|
||||||
header: {
|
|
||||||
fullScreen: 'Full Screen',
|
|
||||||
exitFullScreen: 'Exit Full Screen',
|
|
||||||
personalData: 'Personal Data',
|
|
||||||
changePassword: 'Change Password',
|
|
||||||
logout: 'Logout',
|
|
||||||
},
|
|
||||||
tip: {
|
|
||||||
loading: 'Loading...',
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -1,18 +0,0 @@
|
||||||
export default {
|
|
||||||
login: {
|
|
||||||
reset: '重置',
|
|
||||||
register: '登录',
|
|
||||||
},
|
|
||||||
home: {},
|
|
||||||
tabs: {},
|
|
||||||
header: {
|
|
||||||
fullScreen: '全屏',
|
|
||||||
exitFullScreen: '退出全屏',
|
|
||||||
personalData: '个人信息',
|
|
||||||
changePassword: '修改密码',
|
|
||||||
logout: '退出登录',
|
|
||||||
},
|
|
||||||
tip: {
|
|
||||||
loading: '加载中...',
|
|
||||||
},
|
|
||||||
};
|
|
21
src/main.ts
21
src/main.ts
|
@ -1,12 +1,12 @@
|
||||||
import directives from '@/directives';
|
import directives from "@/directives";
|
||||||
import i18n from '@/i18n/index.ts';
|
import i18n from "@/i18n/index.ts";
|
||||||
import { createPinia } from 'pinia';
|
import { createPinia } from "pinia";
|
||||||
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
|
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
|
||||||
import { createApp } from 'vue';
|
import { createApp } from "vue";
|
||||||
import App from './App.vue';
|
import App from "./App.vue";
|
||||||
import './assets/css/index.scss';
|
import "./assets/css/index.scss";
|
||||||
import './assets/css/reset.css';
|
import "./assets/css/reset.css";
|
||||||
import router from './router';
|
import router from "./router";
|
||||||
|
|
||||||
const pinia = createPinia();
|
const pinia = createPinia();
|
||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
|
@ -15,4 +15,5 @@ const app = createApp(App);
|
||||||
pinia.use(piniaPluginPersistedstate);
|
pinia.use(piniaPluginPersistedstate);
|
||||||
|
|
||||||
app.use(router).use(pinia).use(i18n).use(directives);
|
app.use(router).use(pinia).use(i18n).use(directives);
|
||||||
app.mount('#app');
|
app.mount("#app");
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { MockMethod } from "vite-plugin-mock";
|
||||||
|
import { zh_cn } from "@/mock/i18n/modules/zh_cn.ts";
|
||||||
|
import { en } from "@/mock/i18n/modules/en.ts";
|
||||||
|
|
||||||
|
const list: MockMethod[] = [
|
||||||
|
{
|
||||||
|
url: "/mock/getI18n",
|
||||||
|
method: "get",
|
||||||
|
response: () => ({ data: { zh_cn, en, local: "zh_cn" } })
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
export default list;
|
|
@ -0,0 +1,18 @@
|
||||||
|
export const en = {
|
||||||
|
login: {
|
||||||
|
reset: "reset",
|
||||||
|
register: "register"
|
||||||
|
},
|
||||||
|
home: {},
|
||||||
|
tabs: {},
|
||||||
|
header: {
|
||||||
|
fullScreen: "Full Screen",
|
||||||
|
exitFullScreen: "Exit Full Screen",
|
||||||
|
personalData: "Personal Data",
|
||||||
|
changePassword: "Change Password",
|
||||||
|
logout: "Logout"
|
||||||
|
},
|
||||||
|
tip: {
|
||||||
|
loading: "Loading..."
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,19 @@
|
||||||
|
export const zh_cn = {
|
||||||
|
login: {
|
||||||
|
reset: "重置",
|
||||||
|
register: "登录"
|
||||||
|
},
|
||||||
|
home: {},
|
||||||
|
tabs: {},
|
||||||
|
header: {
|
||||||
|
fullScreen: "全屏",
|
||||||
|
exitFullScreen: "退出全屏",
|
||||||
|
personalData: "个人信息",
|
||||||
|
changePassword: "修改密码",
|
||||||
|
logout: "退出登录"
|
||||||
|
},
|
||||||
|
tip: {
|
||||||
|
loading: "加载中..."
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { ResultEnum } from '@/enums/httpEnum';
|
import { ResultEnum } from "@/enums/httpEnum";
|
||||||
import axios from 'axios';
|
import axios from "axios";
|
||||||
import { BASE_MOCK } from './config/servicePort';
|
import { BASE_MOCK } from "./config/servicePort";
|
||||||
|
|
||||||
const request = axios.create({
|
const request = axios.create({
|
||||||
baseURL: BASE_MOCK,
|
baseURL: BASE_MOCK,
|
||||||
timeout: ResultEnum.TIMEOUT as number,
|
timeout: ResultEnum.TIMEOUT as number
|
||||||
});
|
});
|
||||||
|
|
||||||
// 请求拦截器
|
// 请求拦截器
|
||||||
|
@ -18,8 +18,9 @@ request.interceptors.response.use(
|
||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
return Promise.reject(new Error('网络错误'));
|
console.log(error);
|
||||||
},
|
return Promise.reject(new Error("网络错误"));
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
export default request;
|
export default request;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { ResultEnum } from '@/enums/httpEnum';
|
import { ResultEnum } from "@/enums/httpEnum";
|
||||||
import axios from 'axios';
|
import axios from "axios";
|
||||||
import { BASE_API } from './config/servicePort';
|
import { BASE_API } from "./config/servicePort";
|
||||||
|
|
||||||
const request = axios.create({
|
const request = axios.create({
|
||||||
// 默认请求地址
|
// 默认请求地址
|
||||||
baseURL: BASE_API,
|
baseURL: BASE_API,
|
||||||
// 设置超时时间
|
// 设置超时时间
|
||||||
timeout: ResultEnum.TIMEOUT as number,
|
timeout: ResultEnum.TIMEOUT as number
|
||||||
// 跨域允许携带凭证
|
// 跨域允许携带凭证
|
||||||
// withCredentials: true,
|
// withCredentials: true,
|
||||||
});
|
});
|
||||||
|
@ -22,8 +22,9 @@ request.interceptors.response.use(
|
||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
return Promise.reject(new Error('网络错误'));
|
console.log(error);
|
||||||
},
|
return Promise.reject(new Error("网络错误"));
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
export default request;
|
export default request;
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
import { defineStore } from "pinia";
|
||||||
|
import { fetchGetI18n } from "@/api/mock/i18n.ts";
|
||||||
|
|
||||||
|
export const userI18nStore = defineStore("i18nStore", {
|
||||||
|
persist: true,
|
||||||
|
state() {
|
||||||
|
return {
|
||||||
|
// ? 多语言内容
|
||||||
|
i18n: {} as any
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getters: {},
|
||||||
|
actions: {
|
||||||
|
async fetchI18n() {
|
||||||
|
this.i18n = (await fetchGetI18n()).data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<template>
|
<template>
|
||||||
<h1>vite-pinia 模板</h1>
|
<h1>vite-pinia 模板</h1>
|
||||||
<h1>成功</h1>
|
<h1>多语言:{{ $t("tip.loading") }}</h1>
|
||||||
|
<button @click="handleI18n('en')">切换英文</button>
|
||||||
|
<button @click="handleI18n('zh_cn')">切换中文</button>
|
||||||
<ul>
|
<ul>
|
||||||
<li v-for="(route, index) in pageRoutes" :key="index">
|
<li v-for="(route, index) in pageRoutes" :key="index">
|
||||||
<RouterLink :to="route.path">{{ `${route.path}【${String(route.name)}】` }}</RouterLink>
|
<RouterLink :to="route.path">{{ `${route.path}【${String(route.name)}】` }}</RouterLink>
|
||||||
|
@ -12,9 +14,24 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import Test from '@/views/test-tsx/index.tsx';
|
import Test from "@/views/test-tsx/index.tsx";
|
||||||
import { pageRoutes } from '@/router/module/pageRoutes';
|
import { pageRoutes } from "@/router/module/pageRoutes";
|
||||||
|
import { userI18nStore } from "@/store/i18n.ts";
|
||||||
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
|
const i18nStore = userI18nStore();
|
||||||
|
const i18n = useI18n();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 切换多语言
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
const handleI18n = (value: string) => {
|
||||||
|
i18n.locale.value = value;
|
||||||
|
i18n.mergeLocaleMessage(value, i18nStore.i18n[value]);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
ul {
|
ul {
|
||||||
padding-left: 50px;
|
padding-left: 50px;
|
||||||
|
|
|
@ -1,61 +1,72 @@
|
||||||
import vue from '@vitejs/plugin-vue';
|
import vue from "@vitejs/plugin-vue";
|
||||||
import { resolve } from 'path';
|
import { resolve } from "path";
|
||||||
import { defineConfig, UserConfig } from 'vite';
|
import { defineConfig, UserConfig } from "vite";
|
||||||
import legacy from '@vitejs/plugin-legacy';
|
import legacy from "@vitejs/plugin-legacy";
|
||||||
import vueJsx from '@vitejs/plugin-vue2-jsx';
|
import vueJsx from "@vitejs/plugin-vue2-jsx";
|
||||||
import { compression } from 'vite-plugin-compression2';
|
import { compression } from "vite-plugin-compression2";
|
||||||
|
import cdn from "vite-plugin-cdn-import";
|
||||||
|
import { viteMockServe } from "vite-plugin-mock";
|
||||||
|
|
||||||
export default defineConfig(
|
export default defineConfig(
|
||||||
(): UserConfig => ({
|
(): UserConfig => ({
|
||||||
// base: './', // ? 在每个文件前加上这个前缀
|
// base: './', // ? 在每个文件前加上这个前缀
|
||||||
// publicDir: './static',// ? 设置静态资源目录
|
// publicDir: './static',// ? 设置静态资源目录
|
||||||
envPrefix: 'BUNNY',
|
envPrefix: "BUNNY",
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
'@': resolve(__dirname, './src'),
|
"@": resolve(__dirname, "./src"),
|
||||||
'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js',
|
"vue-i18n": "vue-i18n/dist/vue-i18n.cjs.js"
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
server: {
|
server: {
|
||||||
host: '0.0.0.0',
|
host: "0.0.0.0",
|
||||||
port: 6261,
|
port: 6261,
|
||||||
open: true,
|
open: true,
|
||||||
cors: true,
|
cors: true,
|
||||||
proxy: {
|
proxy: {
|
||||||
'/api': {
|
"/api": {
|
||||||
target: process.env.BUNNY_APP_URL,
|
target: process.env.BUNNY_APP_URL,
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (path: string) => path.replace(/^\/api/, '/api'),
|
rewrite: (path: string) => path.replace(/^\/api/, "/api")
|
||||||
},
|
},
|
||||||
'/mock': {
|
"/mock": {
|
||||||
target: process.env.BUNNY_APP_URL,
|
target: process.env.BUNNY_APP_URL,
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (path: string) => path.replace(/^\/mock/, '/mock'),
|
rewrite: (path: string) => path.replace(/^\/mock/, "/mock")
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
},
|
plugins: [
|
||||||
},
|
vue(),
|
||||||
plugins: [vue(), legacy({ targets: ['defaults', 'not IE 11'] }), vueJsx(), compression()],
|
legacy({ targets: ["defaults", "not IE 11"] }),
|
||||||
|
vueJsx(),
|
||||||
|
compression(),
|
||||||
|
cdn({
|
||||||
|
modules: []
|
||||||
|
}),
|
||||||
|
viteMockServe({ mockPath: "src/mock" })
|
||||||
|
],
|
||||||
esbuild: {
|
esbuild: {
|
||||||
pure: ['console.log', 'debugger'],
|
pure: ["console.log", "debugger"],
|
||||||
jsxFactory: 'h',
|
jsxFactory: "h",
|
||||||
jsxFragment: 'Fragment',
|
jsxFragment: "Fragment",
|
||||||
jsxInject: "import { h } from 'vue';",
|
jsxInject: "import { h } from 'vue';"
|
||||||
},
|
},
|
||||||
// 配置构建过程的选项,例如是否生成压缩文件和源映射
|
// 配置构建过程的选项,例如是否生成压缩文件和源映射
|
||||||
build: {
|
build: {
|
||||||
assetsInlineLimit: 20000,
|
assetsInlineLimit: 20000,
|
||||||
// 构建输出的目录,默认值为"dist"
|
// 构建输出的目录,默认值为"dist"
|
||||||
outDir: 'dist',
|
outDir: "dist",
|
||||||
// 用于指定使用的代码压缩工具。在这里,minify 被设置为 'terser',表示使用 Terser 进行代码压缩。默认值terser
|
// 用于指定使用的代码压缩工具。在这里,minify 被设置为 'terser',表示使用 Terser 进行代码压缩。默认值terser
|
||||||
// esbuild 打包更快,但是不能去除 console.log,terser打包慢,但能去除 console.log
|
// esbuild 打包更快,但是不能去除 console.log,terser打包慢,但能去除 console.log
|
||||||
minify: 'terser',
|
minify: "terser",
|
||||||
// 用于配置 Terser 的选项
|
// 用于配置 Terser 的选项
|
||||||
terserOptions: {
|
terserOptions: {
|
||||||
// 用于配置压缩选项
|
// 用于配置压缩选项
|
||||||
compress: {
|
compress: {
|
||||||
drop_console: true, // 是否删除代码中的 console 语句, 默认值false
|
drop_console: true, // 是否删除代码中的 console 语句, 默认值false
|
||||||
drop_debugger: true, // 是否删除代码中的 debugger 语句, 默认值false
|
drop_debugger: true // 是否删除代码中的 debugger 语句, 默认值false
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
// 禁用 gzip 压缩大小报告,可略微减少打包时间
|
// 禁用 gzip 压缩大小报告,可略微减少打包时间
|
||||||
reportCompressedSize: false,
|
reportCompressedSize: false,
|
||||||
|
@ -64,7 +75,7 @@ export default defineConfig(
|
||||||
// 用于配置 CommonJS 模块的选项
|
// 用于配置 CommonJS 模块的选项
|
||||||
commonjsOptions: {
|
commonjsOptions: {
|
||||||
// 用于指定是否忽略 CommonJS 模块中的 try-catch 语句。当设置为false时,构建过程会保留 CommonJS 模块中的 try-catch 语句
|
// 用于指定是否忽略 CommonJS 模块中的 try-catch 语句。当设置为false时,构建过程会保留 CommonJS 模块中的 try-catch 语句
|
||||||
ignoreTryCatch: false,
|
ignoreTryCatch: false
|
||||||
},
|
},
|
||||||
// 规定触发警告的 chunk 大小, 当某个代码分块的大小超过该限制时,Vite 会发出警告
|
// 规定触发警告的 chunk 大小, 当某个代码分块的大小超过该限制时,Vite 会发出警告
|
||||||
chunkSizeWarningLimit: 2000,
|
chunkSizeWarningLimit: 2000,
|
||||||
|
@ -73,18 +84,18 @@ export default defineConfig(
|
||||||
// 用于配置输出选项
|
// 用于配置输出选项
|
||||||
output: {
|
output: {
|
||||||
// 静态资源分类和包装
|
// 静态资源分类和包装
|
||||||
chunkFileNames: 'js/[name]-[hash].js', // 用于指定代码分块的输出文件名格式
|
chunkFileNames: "js/[name]-[hash].js", // 用于指定代码分块的输出文件名格式
|
||||||
entryFileNames: 'js/[name]-[hash].js', // 用于指定入口文件的输出文件名格式
|
entryFileNames: "js/[name]-[hash].js", // 用于指定入口文件的输出文件名格式
|
||||||
assetFileNames: 'assets/[ext]/[name]-[hash].[ext]', // 用于指定静态资源的输出文件名格式
|
assetFileNames: "assets/[ext]/[name]-[hash].[ext]", // 用于指定静态资源的输出文件名格式
|
||||||
// ? 配置文件生成方式
|
// ? 配置文件生成方式
|
||||||
manualChunks: (id, meta) => {
|
manualChunks: (id, meta) => {
|
||||||
// 如果是包含在包中则打包成 vendor
|
// 如果是包含在包中则打包成 vendor
|
||||||
if (id.includes('mode_modules')) {
|
if (id.includes("node_modules")) {
|
||||||
return 'vendor';
|
return "vendor";
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue