配置别名
1 | resolve: { |
代码分割
1 | build: { |
1.Vite代码分割方法1
// vite.config.ts
1 | build: { |
Vite代码分割方法2
// vite.config.ts
1 | build: { |
清除代码console和debugger
terser 配置需要额外安装依赖
1 | build: { |
配置 px 转 rem 自适应
npm i postcss-pxtorem@5.1.1 -D
vite.config.js
1 | css: { |
main.js
1 | import { useREM } from "@/utils/flexible"; |
flexble.js
1 | /** |
gzip静态资源压缩
1 | import viteCompression from 'vite-plugin-compression' |
全局样式注入
全局注入的样式最好是全局变量,非全局变量样式最好在main.js中引入
1 | css: { |
引入 iconfont
iconfont 图标文件下载后,放置在 /assets/iconfont 文件夹下
注册icon组件
1 | <template> |
使用组件
1 | <m-icon name="fanhui"></m-icon> |
配合 element 组件使用
1 | <el-button type="primary" size="large"> |
注册指令
directives
modules
xxx.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21export default {
// 在绑定元素的 attribute 前
// 或事件监听器应用前调用
created(el, binding, vnode) {
// 下面会介绍各个参数的细节
},
// 在元素被插入到 DOM 前调用
beforeMount(el, binding, vnode) {},
// 在绑定元素的父组件
// 及他自己的所有子节点都挂载完成后调用
mounted(el, binding, vnode) {},
// 绑定元素的父组件更新前调用
beforeUpdate(el, binding, vnode, prevVnode) {},
// 在绑定元素的父组件
// 及他自己的所有子节点都更新后调用
updated(el, binding, vnode, prevVnode) {},
// 绑定元素的父组件卸载前调用
beforeUnmount(el, binding, vnode) {},
// 绑定元素的父组件卸载后调用
unmounted(el, binding, vnode) {}
}index.js
1 | export default { |
注册svg组件
安装依赖
1
yarn add vite-plugin-svg-icons -D
修改vite配置项
1
2
3
4
5
6
7
8
9import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
...
plugins: [
...,
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
symbolId: 'icon-[name]',
})
]引入注册
1
2
3
4
5
6
7// svg图标, 第一行不能少
import 'virtual:svg-icons-register'
import SvgIcon from './components/SvgIcon'
// 注册svg-icon组件
app.component('svg-icon', SvgIcon)SvgIcon 组件代码
1 | <template> |
svg 资源
path 不需添加 fill=”currentColor”, 让图标自适应颜色,如果添加了fill 那么color参数就不生效了
1
2
3<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<path d="M288 896h448q32 0 32 32t-32 32H288q-32 0-32-32t32-32"/>
</svg>使用
1 | <svg-icon icon-class="bug"></svg-icon> |
字典通用解决方案
若依参考方案
useDict 直接返回 字典信息,使用时不直接从 store 中取
useDict 函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21/**
* 获取字典数据
*/
export function useDict(...args) {
const res = ref({});
return (() => {
args.forEach((dictType, index) => {
res.value[dictType] = [];
const dicts = useDictStore().getDict(dictType);
if (dicts) {
res.value[dictType] = dicts;
} else {
getDicts(dictType).then(resp => {
res.value[dictType] = resp.data.map(p => ({ label: p.dictLabel, value: p.dictValue, elTagType: p.listClass, elTagClass: p.cssClass }))
useDictStore().setDict(dictType, res.value[dictType]);
})
}
})
return toRefs(res.value);
})()
}pinia useDictStore 模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58const useDictStore = defineStore(
'dict',
{
state: () => ({
dict: new Array()
}),
actions: {
// 获取字典
getDict(_key) {
if (_key == null && _key == "") {
return null;
}
try {
for (let i = 0; i < this.dict.length; i++) {
if (this.dict[i].key == _key) {
return this.dict[i].value;
}
}
} catch (e) {
return null;
}
},
// 设置字典
setDict(_key, value) {
if (_key !== null && _key !== "") {
this.dict.push({
key: _key,
value: value
});
}
},
// 删除字典
removeDict(_key) {
var bln = false;
try {
for (let i = 0; i < this.dict.length; i++) {
if (this.dict[i].key == _key) {
this.dict.splice(i, 1);
return true;
}
}
} catch (e) {
bln = false;
}
return bln;
},
// 清空字典
cleanDict() {
this.dict = new Array();
},
// 初始字典
initDict() {
}
}
})
export default useDictStore全局注册 useDict 函数
1
2
3
4import { useDict } from '@/utils/dict'
// 全局方法挂载
app.config.globalProperties.useDict = useDict使用
1
2const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
自定义方案
dict.js 定义 pinia 全局状态管理
1 | import { defineStore } from "pinia"; |
common.sj 中定义注册字典方法
如果后端除了标准字典接口之外还有非标准接口可以使用options参数,可自定义 字典label,字典value(字典id使用 value,也可以再加一个字典id),参数取值支持 dataStr (如接口取值 res.rows 传 “rows”, res.data.data 传 “data.data”, 默认 取值res.data),request 非标准的字典接口(axios封装后的接口),params (非标准字典接口的参数)
1 | // 加载的字典名称(与接口请求字典类型保持一至),字典store对象,非标准字典加载配置 |
使用
1 | import { loadDict } from '@/utils/common'; |
完整的配置参考
1 | import { fileURLToPath, URL } from 'node:url' |
代码风格配置
可以在脚手架初始化项目是添加 eslint 和 prettier, 也可以为已有项目添加,参考如下
[注意]新版本eslit和prettier配置文件后缀都必须是.cjs
**vue3 新版本 脚手架,使用vite构建项目,添加eslit和prettier 就自动设置完成 ** 但是可能还要设置.vscode 文件夹 中的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // settings.json
{
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig"
},
"editor.codeActionsOnSave": {
"source.fixAll": "explicit"
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
1
2
3
4
5
6
7
8
9
10 // extensioins
{
"recommendations": [
"Vue.volar",
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode"
]
}
支持 require 语法
vite 默认不支持 require ,需要引入 “vite-plugin-require-transform”
1 | plugins: [ |
配置需忽略 node_modules 文件,不然打包可能导致其他第三方包报错。
环境变量获取
在 vue-cli 中, 使用的是 webpack 打包,使用
1 | process.env.NODE_ENV === 'production' |
判断,但是在vite中,没有 process,而是使用
【注意】vite.config.js 配置文件中还是使用 process.env.NODE_ENV 访问
1 | import.meta.env.MODE === "production" |
全局 api 自动引入
1 | npm i -D unplugin-auto-import |
配置完成后 根目录会新增 auto-imports.d.ts,或一个json 文件,在 eslint.config.js 中配置 忽略即可,不然 eslint 会提示你 引用错误
使用前
1 | import { computed, ref } from 'vue' |
使用后
1 | const count = ref(0) |
index.html 模板使用 ejs 语法
1 | yarn add vite-plugin-ejs |
注入
1 | import {defineConfig} from "vite"; |
使用
1 |
|
- 本文作者: 王不留行
- 本文链接: https://wyf195075595.github.io/2022/06/17/programming/vue/vite优化项/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!