你这人能不能灵活点?前端代码简单优化一下?

公众号:程序员白特,可jia前端qun

背景

贴近目前公司的业务,做的增删改查比较多。基本上都是做一些表格的业务系统比较多,因此在写的过程中,都会遇到一些优化的细点,仅供参考,觉得好的可以采纳,不好的欢迎提出来。

一、import按需加载

很多小伙伴肯定不少看到过,性能优化路由要用import('@/views/xxxx.vue')这样就可以按需加载了。
本身的vue-cli自动创建出来的时候也会有这一条语句。除了给路由优化之外呢,还有别的场景优化空间呢?那肯定有的啦。那就是结合<component/>自带的组件去一起实现。

场景呈现

正常情况下,做一个业务模块,都会分为【基础表】、【业务表】,一般情况下,用户维护好了基础表信息了之后,剩下的就是信息交叉复用,有可能在某个业务页面,我需要点击某个按钮后根据某个值到某个基础表的页面进行搜索信息,并勾选行信息。

<template><div><div class="count" @click="showDynamicComponent">按需加载页面</div> <Modal title="动态数据" :visible="visible" @ok="()=>dynamicComponent=null"><component :is="dynamicComponent" ref="dynamicRef"/></Modal></div>
</template><script>
import { Modal } from 'ant-design-vue'
export default {components: {Modal},data() {return {dynamicComponent: null,visible: false};},methods: {showDynamicComponent() {this.visible = trueimport('@/views/baseInfo/a.vue').then(res=>{this.dynamicComponent = res.module})},},
};
</script>

最后通过this.$refs.dynamicRef这个方式来拿到组件的信息和方法。

当然如果只引入一个组件的时候,可以不采用上面的方式进行。可以使用这种。

<template> <dynamicComponent ref="dynamicComponentRef"/> 
</template><script>
// import dynamicComponent from '@/components/dynamicComponent.vue'; // 原来的引入
const dynamicComponent = () => import('@/components/dynamicComponent.vue')export default {components: {dynamicComponent}
}
</script>

二、表格维护

因为公司的做的系统报表比较多,这时候表头的数量和表单都是比较多的,恰好公司使用的UI框架是ant-design-vue,表头的数量达到40-50的时候,那么代码的占用函数就很大,而且在产品经常在开发阶段,定义的表头位置顺序变来变去,于是为了方便维护和开发,我封装成一个函数,我还没考虑过这个性能损耗问题,但是维护起来确实方便很多。

业务场景

举个例子,一个表头有用户姓名年龄,正常情况下,ant-design-vue表头是这么写的。

const columns = [{dataIndex: 'username',title: '用户'
}, {dataIndex: 'realname',title: '姓名'
}, {dataIndex: 'age',title: '年龄'
}]

数据少的时候,维护没有什么问题,倒是表头数量很多的时候,可能40-50个,一百个?大概是这个数,看起来就很费劲。因为自己业务确实遇到过这个问题,维护起来要么单独创建一个文件大概一百多行一点点找,要么就放在业务代码里,但是无论如何阅读性都很差。所以我想了个办法,把它平铺变成数组形式。

import { genTableColumnsUtil } from '@/utils/tableJs'
const columns = genTableColumnsUtil([['username', '用户'],['realname', '姓名'],['age', '年龄'],
])

这时候是不是就好看多了?甚至这个可以做成二级表头,递归做嵌套。那额外的配置项拓展项怎么搞?

const columns = genTableColumnsUtil([['username', '用户'],['realname', '姓名'],['age', '年龄'],
], 
{username: { width: '20%' }})

我的做法就是在函数里面在传多一个对象,这样就可以填充上去了。毕竟大多数字段只是展示而已,没有做太多的单元格定制化,如果要定制化,搜索对应的dataIndex就好了。

这时候调整顺序的时候,还有定制化的时候就阅读性就好很多。

三、依赖包单独抽离

性能优化不只是代码层面的优化,除了nginx配置http2,gzip… 单独抽离chunk包也可以达到加快访问速度的目的。

业务场景
// 在vue.config.js加入这段代码
module.exports = {configureWebpack: config => {// 分包,打包时将node_modules中的代码单独打包成一个chunkconfig.optimization.splitChunks = {maxInitialRequests: Infinity, // 一个入口最大的并行请求数,默认为3minSize: 0, // 一个入口最小的请求数,默认为0chunks: 'all', // async只针对异步chunk生效,all针对所有chunk生效,initial只针对初始chunk生效cacheGroups: { // 这里开始设置缓存的 chunkspackVendor: { // key 为entry中定义的 入口名称test: /[\\/]node_modules[\\/]/, // 正则规则验证,如果符合就提取 chunkname(module) {const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]return `${packageName.replace('@', '')}`}}}}}}
}

最后在打包完了之后。可以查看一下。

四、thread-loader打包

业务场景

充分利用cpu核心数,进行快速打包、其实我也没感觉有多快。

 // 开启多线程打包
config.module.rule('js').test(/\.js$/).use('thread-loader').loader('thread-loader').options({// worker使用cpu核心数减1workers: require('os').cpus().length - 1,// 设置cacheDirectorycacheDirectory: '.cache/thread-loader'}).end()

五、ECharts按需使用

业务场景

数字化是趋势,图形可视化在所难免,但往往我们有时候没做那么复杂的图形,可能只用到了饼图和柱状图,或者别的,怎么样都用不完ECharts更多的图形,ECharts是大家常用的图形化之一,ECharts第一步教程都是告诉我们,在vue文件里

import * as echarts from 'echarts'

殊不知,我们用不到的图形都加载进来,打包的时候就可以看到,这玩意,3M多。 所以,看情况来加载图形配置

import * as echarts from 'echarts/core'import { BarChart, LineChart, PieChart } from 'echarts/charts'import {TitleComponent,TooltipComponent,GridComponent,LegendComponent,ToolboxComponent,
} from 'echarts/components'import { CanvasRenderer } from 'echarts/renderers'echarts.use([TitleComponent,TooltipComponent,GridComponent,BarChart,LineChart,PieChart,CanvasRenderer,LegendComponent,ToolboxComponent
])export default echarts

通过vscode的包插件,可以看到引入的模块大小

六、Tree shaking

每次百度,“vue性能优化”,“前端性能优化”…都会出现tree shaking关键词,这玩意到底是啥呢?
得益于ES6的模块特性,模块依赖关系是确定的,同时和运行时的状态无关,所以可以进行可靠的静态分析,这就是tree-shaking。
大白话的说就是——

项目只会打包用到的代码。比如你写一个方法A,我用到了A函数,那我就打包进来,否则不打包。

有时候我们会这样写,这样写当然也没啥问题。只是性能优化上不太友好

export default {A() {return 'A' },B() {return 'B'},
}

至于怎么做呢?最简单的方式就是拆分,以函数为例。

// util.js// 导出A方法
export function A() {return 'A'
}
// 导出B方法
export function B() {return 'B'
}

大家可以尝试一下,在dist包里面搜索一下对应方法名。

七、图片转base64

将图片转成base64的目的其实就减少http请求,当然图片可以放到云端、阿里云、七牛云来减小图片的体积大小。转成base64,其实体积会变大的,但是有些图片占用体积比较小的,可以将其转成base64,加快网页加载。

// 安装
npm install url-loader --save-dev// 配置
module.exports = {module: {rules: [{test: /.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {// 小于 10kb 的图片转化为 base64limit: 1024 * 10}}]}]}
};

以上是个人反复写业务的时候思考的地方,没考虑太全面,也希望有人能提出一个更好的解决办法。愿意倾听改正。共勉、共勉,😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FairGuard游戏加固入选《CCSIP 2023中国网络安全行业全景册(第六版)》

2024年1月24日&#xff0c; FreeBuf咨询正式发布《CCSIP 2023中国网络安全行业全景册(第六版)》。本次发布的全景图&#xff0c;共计展示20个一级分类、108个细分安全领域&#xff0c;旨在为广大企业提供网络安全产品选型参考&#xff0c;帮助企业了解中国网络安全技术与市场的…

C++11——新的类功能与可变参数模板

系列文章目录 文章目录 系列文章目录一、新的类功能默认成员函数类成员变量初始化强制生成默认函数的关键字default禁止生成默认函数的关键字delete继承和多态中的final与override关键字 二、可变参数模板递归函数方式展开参数包逗号表达式展开参数包STL容器中的empalce_back与…

100天精通鸿蒙从入门到跳槽——第20天:ArkTS装饰器@Link双向数据绑定

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》 — Go语言学习之旅!《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!100天…

免费分享一套微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) &#xff0c;分享下哈。 项目视频演示 【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现)…

【开源】基于JAVA语言的毕业生追踪系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登陆注册模块2.2 学生基本配置模块2.3 就业状况模块2.4 学历深造模块2.5 信息汇总分析模块2.6 校友论坛模块 三、系统设计3.1 用例设计3.2 实体设计 四、系统展示五、核心代码5.1 查询我的就业状况5.2 初始化就业状况5.…

SSL加密证书免费申请

首先&#xff0c;让我们来了解一下SSL证书的基本作用。SSL证书通过公钥和私钥的非对称加密技术&#xff0c;使得服务器与浏览器之间的通信内容得到高强度加密&#xff0c;同时验证网站的真实身份&#xff0c;从而提升用户的信任度&#xff0c;也是搜索引擎排名优化的一个重要因…

Idea设置代理后无法clone git项目

背景 对于我们程序员来说&#xff0c;经常上github找项目、找资料是必不可少的&#xff0c;但是一些原因&#xff0c;我们访问的时候速度特别的慢&#xff0c;需要有个代理&#xff0c;才能正常的访问。 今天碰到个问题&#xff0c;使用idea工具 clone项目&#xff0c;速度特…

2.【Vue3】Vue 基本使用——局部使用Vue

文章目录 1. 快速入门2. 常用指令2.1 v-for2.2 v-bind2.3 v-if 与 v-show2.4 v-on2.5 v-model 3. 生命周期4. Ajax 函数库 Axios4.1 Axios 基本使用4.2 Axios 请求方式别名 1. 快速入门 现在需要将 “hello vue3” 这样一个字符串渲染到页面上进行展示。 这个需求并不陌生&…

Vue-Cli3 - 从安装 nodejs 配置环境 ~ 搭建 cli 脚手架项目全过程

目录 前言提示 一、安装 & 配置 nodejs 1.1、安装 nodejs 1.2、配置必要目录 1.3、配置环境变量 1.4、测试 安装&配置 是否成功 1.5、安装淘宝镜像 1.5、cnpm 安装&#xff08;推荐安装&#xff09; 二、vue-cli3 创建项目 2.1、vue-cli2 和 vue-cli3 主要区…

C语言——N / 自定义类型:联合和枚举

目录 一、联合体 1、联合体类型的声明 2、联合体的特点 3、相同成员的结构体和联合体对比 4、联合体大小的计算 5、联合的一个练习 二、枚举类型 1、枚举类型的声明 2、枚举类型的优点 3、枚举类型的使用 一、联合体 1、联合体类型的声明 像结构体⼀样&#xff0c;…

批量导出域控用户及其所在OU和组

在Windows域环境中&#xff0c;批量导出域控用户及其所在OU&#xff08;组织单位&#xff09;和组成员身份信息&#xff0c;可以使用PowerShell脚本实现。以下是一个基本的示例脚本&#xff1a; Import-Module ActiveDirectory# 遍历所有用户 Get-ADUser -Filter * -Propertie…

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署(其三)

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab 前端自动化&#xff08;其二&#xff0…

05.领域驱动设计:认识领域事件,解耦微服务的关键

目录 1、概述 2、领域事件 2.1 如何识别领域事件 1.微服务内的领域事件 2.微服务之间的领域事件 3、领域事件总体架构 3.1 事件构建和发布 3.2 事件数据持久化 3.3 事件总线 (EventBus) 3.4 消息中间件 3.5 事件接收和处理 4、案例 5、总结 1、概述 在事件风暴&a…

百川智能发布超千亿大模型Baichuan 3

1月29日&#xff0c;百川智能发布超千亿参数的大语言模型Baichuan 3。在多个权威通用能力评测如CMMLU、GAOKAO和AGI-Eval中&#xff0c;Baichuan 3都展现了出色的能力&#xff0c;尤其在中文任务上更是超越了GPT-4。而在数学和代码专项评测如MATH、HumanEval和MBPP中同样表现出…

【Delphi】系统菜单中增加菜单项

目录 一、问题提出 二、程序截图 ​编辑 ​编辑 三、程序代码&#xff1a; 一、问题提出 我们在开发windows程序的时候&#xff0c;可能会希望在窗体的系统菜单中增加一个菜单项&#xff0c;那么如何实现呢&#xff0c;实际上通过调用windows API是可以实现的&#xff0c;…

go学习之air库的使用

首先下载air库 go install github.com/cosmtrek/air之后你需要去找到库下载的地方&#xff0c;若使用的是go mod可以使用命令 go env GOPATH找到下载库的位置 进入后&#xff0c;有bin&#xff0c;pkg目录&#xff0c;进入bin目录&#xff0c;你能看到air.exe文件 这时候将此…

备战蓝桥杯---二分(入门)

话不多说&#xff0c;先来个模板题来回顾一下上次讲的&#xff1a; 下面是AC代码&#xff1a; 下面进入正题&#xff1a; 本题对1&#xff0c;2行与3&#xff0c;4行组合&#xff0c;再用二分查找即可实现n^2logn的复杂度。 下面是AC代码&#xff1a; 接题&#xff1a; 让我们…

【更新】中国各省市是否属于“宽带中国”试点及“千兆城市”DID数据(2010-2023)

一、数据介绍 数据名称&#xff1a;【更新】中国各省市是否属于“宽带中国”试点及“千兆城市”DID数据 数据范围&#xff1a;全国所有地市 数据年份&#xff1a;2010-2023年 数据来源&#xff1a; “宽带中国”试点城市&#xff0c;来自工信部和国家发改委在2014年、2015…

幻兽帕鲁个人服务器怎么创建?

成功创建幻兽帕鲁服务器教程分享&#xff0c;阿里云和腾讯云均可以&#xff0c;总花费32元即可获得一台换手帕服务器4核16G配置&#xff0c;32人幻兽帕鲁服务器&#xff0c;阿腾云atengyun.com分享当前头部云厂商的Palworld服务器搭建教程&#xff0c;亲测可以&#xff01; 阿…

【JavaScript基础入门】05 JavaScript基础语法(三)

JavaScript基础语法&#xff08;三&#xff09; 目录 JavaScript基础语法&#xff08;三&#xff09;数组概述数组语法多维数组 操作数组修改数组获取数组长度数组和字符串之间的转换添加和删除数组项 Null 和 Undefined字符串连接字符串字符串转换获取字符串的长度在字符串中查…