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

公众号:程序员白特,*********

背景

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

一、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 = true
      import('@/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中的代码单独打包成一个chunk
      config.optimization.splitChunks = {
        maxInitialRequests: Infinity, // 一个入口最大的并行请求数,默认为3
        minSize: 0, // 一个入口最小的请求数,默认为0
        chunks: 'all', // async只针对异步chunk生效,all针对所有chunk生效,initial只针对初始chunk生效
        cacheGroups: { // 这里开始设置缓存的 chunks
          packVendor: { // key 为entry中定义的 入口名称
            test: /[\\/]node_modules[\\/]/, // 正则规则验证,如果符合就提取 chunk
            name(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核心数减1
    workers: require('os').cpus().length - 1,
    // 设置cacheDirectory
    cacheDirectory: '.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 的图片转化为 base64
              limit: 1024 * 10
            }
        }]
     }]
  }
};

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

#晒一晒我的offer##牛客在线求职答疑中心##24秋招避雷总结##前端##华为开奖那些事#
全部评论
你的前端代码优化方案非常详细,涵盖了从代码结构到性能优化的各个方面。以下是我对你的方案的一些建议和补充: 1. 按需加载:你的方案中提到了使用import('@/views/xxxx.vue')进行按需加载,这是一种很好的方法。但是,如果你的项目使用了Vue Router,你还可以考虑使用Vue Router的懒加载功能,这样可以在路由切换时按需加载相应的组件。 2. 表格维护:你的方案中提到了使用函数生成表头,这是一种很好的方法,可以方便地维护和修改表头。但是,如果你的表格数据量非常大,你还可以考虑使用虚拟滚动技术,例如vue-virtual-scroll-list,这样可以提高表格的性能。 3. 依赖包单独抽离:你的方案中提到了使用webpack的splitChunks功能来单独抽离chunk包,这是一种很好的方法。但是,如果你的项目使用了Vue.js,你还可以考虑使用Vue.js的官方插件Vue Loader,它可以自动为你生成chunk包。 4. thread-loader打包:你的方案中提到了使用thread-loader来充分利用CPU核心数进行快速打包,这是一种很好的方法。但是,如果你的项目使用了Vue.js,你还可以考虑使用Vue.js的官方插件Vue Loader,它可以自动为你生成thread-loader配置。 5. ECharts按需使用:你的方案中提到了使用ECharts的按需加载功能,这是一种很好的方法。但是,如果你的项目使用了Vue.js,你还可以考虑使用Vue.js的官方插件Vue ECharts,它可以自动为你生成ECharts的配置。 6. Tree shaking:你的方案中提到了使用Tree shaking来优化打包,这是一种很好的方法。但是,如果你的项目使用了Vue.js,你还可以考虑使用Vue.js的官方插件Vue Loader,它可以自动为你生成Tree shaking配置。 7. 图片转base64:你的方案中提到了使用url-loader来将图片转成base64,这是一种很好的方法。但是,如果你的项目使用了Vue.js,你还可以考虑使用Vue.js的官方插件Vue Loader,它可以自动为你生成url-loader配置。 希望这些建议和补充对你有所帮助。
1 回复 分享
发布于 01-29 12:41 AI生成

相关推荐

不愿透露姓名的神秘牛友
11-01 21:30
点赞 评论 收藏
分享
9.25boss上投递,由于国庆节导致面试时间拉的较长,三面全是技术面,面的头都快要蒙掉了。9.29一面面试官很年轻,对我的竞赛很感兴趣,问了大概有半个小时,用到了什么方法,算法的原理,怎么实现的,都是自己全程参与的比赛,答得还可以。然后开始问项目,k8s的架构和相关组件的作用、docker的打包部署原理、docker是怎么实现隔离的。常规八股,输入url到网页显示的整个流程、进程线程协程的区别、tcp和udp的不同。手撕:一个数字数组有一个错误的数字重复了,找出来它的位置和并输出正确的数。10.11二面面试官也很年轻,先问项目的具体细节。八股:调度算法、线程的几种状态以及转换条件、dns的具体流程、ARP协议的作用、timewait的作用、对称加密和非对称加密、什么是证书(这个面试官比较喜欢深挖,然后一直问到我答不出来)手撕:简单题:他自己出的题目,一个文件有一百行数据,请读出并记录重复行的行数(hashmap实现)10.14三面一位年龄较大的leader,人很不错,一直在引导我回答,还给我提了建议(应该怎么清楚的回答问题、学技术多去理解原理),学到很多。挑一个感觉比较好的项目讲一讲,然后问项目的细节。k8s中pod的生命周期、什么是微服务八股:输入url到网页显示的整个流程、dns返回ip的名称(没想起来,反向dns)、http和https有什么不同、四次挥手的过程、为什么一定要是四次而不会是三次和五次介绍了下我的论文,对我的论文比较感兴趣,聊了十多分钟。无手撕反问:对年轻人的未来发展有什么建议、简历还有什么需要补充的(说简历只是个敲门砖)、后续的流程(有hr打电话就是通过了,没打电话就G了)找个日常实习真难,让本来就少的头发又掉不少,许愿一个oc
点赞 评论 收藏
分享
3 15 评论
分享
牛客网
牛客企业服务