当前位置:首页 > 技术分析 > 正文内容

提升vue项目性能的方法有哪些

ruisui883个月前 (03-29)技术分析37


提升 Vue 项目(特别是 Vue 3)的性能需要在开发、构建和运行时多个层面进行优化。以下是经过实践验证的常用方法,涵盖代码优化、组件设计、构建配置以及运行时策略,帮助你降低内存占用、加快渲染速度并提升用户体验:


1.代码层面的优化

组件优化

  • 按需加载组件

使用 defineAsyncComponent 实现动态导入,减少初次加载的代码量。

示例:

const MyComponent = defineAsyncComponent(() => import('./MyComponent.vue'));
  • 减少不必要渲染

使用 v-show 替代 v-if(仅隐藏而不销毁组件)。

使用 v-memo(Vue 3.2+)缓存静态内容:

{{ expensiveComputation() }}

使用 v-once 标记只渲染一次的元素。

  • 清理副作用

在 onUnmounted 中移除事件监听器和定时器,避免内存泄漏:

onUnmounted(() => {
  window.removeEventListener('resize', handleResize);
  clearInterval(timer);
});

数据管理

  • 优化 reactive 和 ref

避免对大数据对象使用 reactive,改用 ref 或普通对象,只代理必要部分:

const largeData = ref(null); // 仅包装关键数据

使用 shallowReactive 或 shallowRef 减少深层代理开销:

const state = shallowReactive({ nested: { a: 1 } });
  • 计算属性(computed)

用 computed 缓存复杂计算,避免重复执行:

const filteredList = computed(() => list.value.filter(item => item.active));

2.渲染性能提升

虚拟列表

  • 对于大数据列表(如表格),使用虚拟滚动技术,只渲染可视区域:

推荐库:vue-virtual-scroll-list 或 @vueuse/core 的虚拟滚动工具。

示例:

分页加载

  • 将大数据拆分为分页加载,配合后端 API:
  const page = ref(1);
  const pageSize = 20;
  const tableData = ref([]);
  async function loadData() {
    const res = await fetch(`/api/data?page=${page.value}&size=${pageSize}`);
    tableData.value = await res.json();
  }

避免频繁 DOM 操作

  • 使用 nextTick 确保 DOM 更新批量执行:
  import { nextTick } from 'vue';
  async function updateData() {
    data.value = newData;
    await nextTick(); // 等待 DOM 更新完成
    console.log('DOM updated');
  }

3.构建优化

打包工具配置

  • Tree Shaking

确保 Vite 或 Webpack 开启 Tree Shaking,移除未使用的代码。

Vite 默认支持,Webpack 需配置 sideEffects:

{
  "sideEffects": false
}
  • 分包加载

使用 manualChunks(Vite)或 splitChunks(Webpack)分离第三方库:

// vite.config.js
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          'vendor': ['vue', 'axios']
        }
      }
    }
  }
};
  • 压缩资源

启用生产模式压缩 JS、CSS 和图片:

// vite.config.js
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          'vendor': ['vue', 'axios']
        }
      }
    }
  }
};

按需引入第三方库

  • 避免全局引入,例如 element-plus:
  import { ElButton, ElTable } from 'element-plus';
  app.use(ElButton).use(ElTable);

4.运行时性能优化

Web Worker

  • 将复杂计算(如数据排序、过滤)移到 Web Worker,减轻主线程负担:
  const worker = new Worker('/worker.js');
  worker.postMessage(largeData);
  worker.onmessage = (e) => console.log('Result:', e.data);

路由优化

  • 懒加载路由

使用动态导入减少初始加载:

const routes = [
  {
    path: '/dashboard',
    component: () => import('./views/Dashboard.vue')
  }
];
  • 控制 keep-alive

限制缓存组件数量,避免内存占用过高:


  

CDN 加速

  • 将 Vue、Element Plus 等静态资源通过 CDN 加载,减少本地打包体积:
  <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>

5.服务端配合

  • 减少前端负担

将数据处理(如过滤、排序)交给后端 API,前端只负责展示。

  • 启用压缩

配置服务器使用 Gzip 或 Brotli 压缩响应数据:

gzip on;
gzip_types application/javascript text/css;
  • 缓存策略

对静态资源设置强缓存(Cache-Control: max-age=31536000),对 API 数据设置协商缓存。


6.性能监控与验证

  • 使用工具验证优化效果Vue Devtools:检查组件渲染时间。 Lighthouse:分析页面加载性能。 Chrome Performance:记录运行时开销。
  • 生产环境监控: 集成 Sentry 或自定义日志,跟踪慢请求和内存峰值。

总结

  • 轻量化:按需加载、减少冗余代码。
  • 高效渲染:虚拟列表、分页、缓存计算。
  • 构建优化:分包、压缩、CDN。
  • 运行时:Web Worker、路由优化。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3130.html

分享给朋友:

“提升vue项目性能的方法有哪些” 的相关文章

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...

Gemini应用在Android上广泛推出2.0闪电模式切换器

#头条精品计划# 快速导读谷歌(搜索)应用的测试频道在安卓设备的双子应用中推出了2.0闪电实验功能,现已向稳定用户开放。双子应用通过谷歌应用运行,目前推出的15.50版本中,用户可通过模型选择器体验不同选项,包括1.5专业版、1.5闪电版和2.0闪电实验版。2.0闪电实验模型提供了更快的响应速度和优...

数组、去重、排序、合并、过滤、删除

ES6数字去重 Array.from(new Set([1,2,3,3,4,4])) //[1,2,3,4] [...new Set([1,2,3,3,4,4])] //[1,2,3,4]2、ES6数字排序 [1,2,3,4].sort(); // [1, 2,3,4],默认是升序...

Vue2的16种传参通信方式

前言先直入主题列出有哪些传参方式,下面再通过事例一一讲解。props(父传子)$emit与v-on (子传父)EventBus (兄弟传参).sync与update: (父子双向)v-model (父子双向)ref$children与$parent$attrs与$listeners (爷孙双向)pr...

VUE-router

七.Vue-router1、什么是vue-routervue-router是vue.js官方路由管理器。vue的单页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统页面切换是用超链接a标签进行切换。但vue里是用路由,因为我们用Vue做的都是单页应用,就相当于只有一个主的i...

三、Uni-app + vue3 页面如何跳转及传参?

Vue 项目往往需要使用 vue-router 插件,刚开始入门 Uni-app + Vue3 项目的同学,会不会想着路由使用 vue-router V4 版本不就可以了吗?不怕大家笑话,我就是这样想的,毕竟我是第一次使用 Uni-app ,由于孕期记性贼差,所以我决定写成笔记,加深记忆。uni-a...