配置别名
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"> |
注册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
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<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName" :fill="color" />
</svg>
</template>
<script setup>
import { computed } from 'vue'
const props = defineProps({
iconClass: {
type: String,
required: true
},
className: {
type: String,
default: ''
},
color: {
type: String,
default: ''
},
})
const iconName = computed(() => `#icon-${props.iconClass}`)
const svgClass = computed(() => {
if (props.className) {
return `svg-icon ${props.className}`
}
return 'svg-icon'
})
</script>
<style scope lang="scss">
.sub-el-icon,
.nav-icon {
display: inline-block;
font-size: 15px;
margin-right: 12px;
position: relative;
}
.svg-icon {
width: 1em;
height: 1em;
position: relative;
fill: currentColor;
vertical-align: -2px;
}
</style>svg 资源
path 需添加 fill=”currentColor” 让图标自适应颜色
1
2
3<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
<path fill="currentColor" 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 就自动设置完成 **
支持 require 语法
vite 默认不支持 require ,需要引入 “vite-plugin-require-transform”
1 | plugins: [ |
配置需忽略 node_modules 文件,不然打包可能导致其他第三方包报错。
环境变量获取
在 vue-cli 中, 使用的是 webpack 打包,使用
1 | process.env.NODE_ENV === 'production' |
判断,但是在vite中,没有 process,而是使用
1 | import.meta.env.MODE === "production" |
全局 api 自动引入
1 | npm i -D unplugin-auto-import |
使用前
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 许可协议。转载请注明出处!