“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情”
前言
这段时间开发了一个数据可视化大屏项目,开发前在网上找了个 Vue3 + vite的项目框架,然后在这个基础上加入了自己前端项目代码规范。项目规范(husky+prettier+eslint+commitlint)
当时没有在 vite.config.ts 进行查看,导致有些配置导致后面开始上线测试就发生了加载速度过慢。
sourcemap 未关闭
sourcemap 开启会在 dist包下面产生一个 .map 是保存源代码映射关系的文件。 什么是 SourceMap?
当时看到接口都在排队很是疑惑。
因为测试环境使用的 http1.1, google 浏览器是可以建立6条 tcp的连接。
从图上可以看到通道都没有连续性,谷歌开发工具看不到后台在默默的加载 .map 文件。 当然这里我还是没有意识到这个等待是 sourcemap 未关闭导致的,后面打开 dist 包看到 map没有关闭就随手关了,发现就好了。
后面思考原因: 使用了 Fidder 抓包软件就发现了 .map文件。
Vite 默认是把 false(关闭) 的
,只是我下载项目配置开启了。 build.sourcemap
rollup-plugin-visualizer
因为 vite 的打包是使用了 rollup 进行打包的,所以使用 rollup 的插件进行 dist 包的分析。
npm install --save-dev rollup-plugin-visualizer
或者
yarn add --dev rollup-plugin-visualizer
rollup-plugin-visualizer 提供了 cjs 和 es 两种引入方式,我使用的是 Vite 肯定是使用 es 的方式。
import { visualizer } from "rollup-plugin-visualizer";
module.exports = {
plugins: [visualizer()],
};
打包完成后会在根目录下看到 stats.html, 当然也可以进行配置 打包完成自动打开 stats.html 文件。
module.exports = {
plugins: [visualizer(open: true})],
};
更多配置: rollup-plugin-visualizer
Echarts 和 Element Plus 按需引入
项目中有使用到几个 Element Plus 的组件,它的按需加载详情可以看官网这里就不说了。 element plus 按需加载
因为项目的 Echarts 也只使用到一部分组件,开发过程中是全部加载了进来。
然后使用 Echart 的按需加载。 Echarts 官网
官网例子中就有,当不知道项目中引进哪些组件,Echarts 报错就会告诉你。
然后根据这些报错 一一添加这些组件。最后 Echarts 的包小了 1MB 左右。
开启 gzip
yarn add vite-plugin-compression -D
or
npm i vite-plugin-compression -D
使用:
import viteCompression from 'vite-plugin-compression';
export default () => {
return {
plugins: [viteCompression()],
};
};
打包就可以看到产生了 .gz 文件。
当然这个配置完还是没有开启的,需要在 nginx 服务器的 server 中加上以下内容。
gzip on;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/bmp application/x-bmp image/x-ms-bmp application/vnd.ms-fontobject font/ttf font/opentype font/x-woff;
配置好后重启服务器(我很经常忘记): sudo nginx -s reload
开启后就可以看到
router 跳转取消上个页面未响应接口
项目中有几个接口请求速度偏慢,客户可能不等待就返回,这时候需要把这些未响应的接口给终止掉。
我下面使用 pinia 进行全局数据的管理
cancelRequest 文件
import { defineStore } from 'pinia'
export const useCancelRequestStore = defineStore({
id: 'cancelRequest',
state: () => {
return {
cancelRequestList: [] as any[]
}
},
actions: {
// 添加取消的接口
setCancelRequestList(cancel: any) {
this.cancelRequestList.push(cancel)
},
handlerCance() {
// 循环执行取消的接口
this.cancelRequestList.forEach(cancel => {
cancel('路由跳转 Cancel')
})
// 重置
this.cancelRequestList = []
}
}
})
service.interceptors.request.use 添加下面请求取消的代码
const reqCancel = useCancelRequestStore()
service.interceptors.request.use(
(config: AxiosRequestConfig) => {
config.cancelToken = new axios.CancelToken(function (cancel) {
reqCancel.setCancelRequestList(cancel)
})
return config
})
监听 router 的跳转
const reqCancel = useCancelRequestStore()
router.beforeEach(function (to, from, next) {
reqCancel.handlerCance() // 取消请求
next()
})
最后
做完以上这些操作,项目的运行速度有了显著的提升。