写点什么

Vue.js 最佳实践:提高性能和减少耦合的方法

作者:xfgg
  • 2023-06-08
    福建
  • 本文字数:4069 字

    阅读完需:约 13 分钟

Vue.js 最佳实践:提高性能和减少耦合的方法

引言

Vue.js 是当今一款最受欢迎的前端框架之一,它让我们能够快速、灵活地开发 Web 应用程序。然而,尽管这种灵活性是 Vue.js 的优点之一,但对于大型应用程序而言,也会带来性能方面的一些挑战。此时,优秀的 Vue.js 最佳实践就能派上用场了。本文将为您探究提高性能和减少耦合的最佳实践。我们将挖掘前端开发中常见的问题,帮助您更好地理解如何将 Vue.js 作为最好的工具来轻松构建出高质量的 Web 应用程序。

组件和结构

Vue.js 中和组件结构相关的最佳实践

在使用 Vue.js 开发应用时,组件化就变得至关重要。下面是组件结构相关的最佳实践:

  • 每个组件应该拥有一个单独的文件,包括模板、JavaScript 和 CSS。

  • 在使用组件时,可以尽量将 CSS 局部化,避免影响到其它组件。

  • 避免对全局样式做出改变。

  • 保持你的组件可用,复用组件并在其他项目中使用他们是非常重要的。

如何定义和使用组件

定义组件的方式非常简单,使用 Vue.extend() 方法即可

Vue.component('component-name', {  // component options})
复制代码

在以上例子中,'component-name' 为组件的名称,在其他地方将会用到。component options 中包含了一些组件的配置选项,如模板、数据、方法等等。

使用组件也很简单,在需要使用它的组件中将它加入 html 模板中:

<component-name></component-name>
复制代码

这样就可以在需要的地方生成组件了。如果想要在组件内部传递属性和自定义事件,可以用 v-bind 和 v-on,如下例子:

<template>  <div>    <child-component :prop-name="parentProp" @custom-event="parentMethod"></child-component>  </div></template>
复制代码

代码管理和组件分类

在一个大型的项目中,存在许多组件,组件的分类管理是很必要的。一个推荐的组件类型管理方式如下(这只是一些可能的方式,具体实现还需考虑具体情况):

  • 基础组件:各组件都需要用到的,如通用样式、函数等等。

  • 全局公共组件:被多个模块或页面复用,如全局头部组件。

  • 局部公共组件:在某个模块或页面中作为局部公共的组件进行复用。

  • 业务组件:业务相关的具体组件。

数据与状态管理

如何管理和处理数据

数据是应用中非常重要的一部分,Vue.js 通过使用组件、指令和计算属性等功能来管理和处理数据。在大部分情况下,基础的 Vue.js 功能已足够满足项目的需求。如果存在一些复杂的数据处理需求,可以选择以下几种处理方式:

  • 计算属性:计算属性是基于其它数据来源进行计算而来的属性,通常被用于基于已有的状态来返回一个新状态。

  • 监视(watch) 对象或数组的变化:对于对象和数组,Vue.js 通过它的“双向绑定”功能侦听变化。在某些情况下,由于对象或数组中状态深度嵌套或需要反应式处理,可以通过 watch 来监视数据变化并采取适当的行动。

  • 使用自定义过滤器:可以通过自定义过滤器将输入转化成如页面显示数据、请求时的格式等。

Vuex 状态管理的最佳实践

在 Vue.js 的状态管理中,Vuex 是官方推荐的状态管理方案,它对基于模块的配合、派发异步处理操作和控制管理中心等功能提供了很好的架构支持。一下是在使用 Vuex 状态管理时的最佳实践:

  • 将 Vuex module(模块)细分化,以便更易于理解/UI 和 viewer 维护。适用于模块设计带有<u>schemas</u>等列表中存在相对简单的聚合数据类型;

  • 将想在任何组件上获得的数据放到根目录 modules 树下的 App 模特块(App Module)中;

  • 使用 Actions 实现业务逻辑操作逻辑且清醒,至单一事件(Single event per intent or action ),严禁在同一 针对逻辑字符调用多个 mutations(streamline );

  • 在严禁 mutations 中做一些具确业务操作、从外部网络请求的操作,以免出现不确定状态;

  • 如果已赋值给 state ,请永远使用状态,而不进行开发 observable flow(ref,data)的锁定。

减少命名冲突的技巧

在编写大型项目的代码时,命名冲突常常是一个问题。以下是几个减少命名冲突的技巧:

  • 增加 Scope 前缀:为了避免名称混淆和不清晰,可以在变量或元素名称前增加模块或域的前缀,明确其属于哪个的模块。

  • 元素隔离:如果名称增加前缀,还是难以与其他模块或页面区分开来,我们可以借助组件的封装来将元素隔离,保持模块或页面之间的状态相互独立。

  • 命名规范:采用一些命名规范,例如,在方法和计算属性名前增加指明性词汇。例如,前缀“to”,“is”,“can”和“when”等,以表明该元素可能的行为或类型等。

  • 手势使用特殊前缀:为了清楚表达手势事件,可以特殊表明一些特殊前缀。

  • 避免与在全局或使用的前端框架或库中使用的名称冲突。

这些技巧可以一起使用,确保名称清晰且易于阅读。重要的是保持代码的一致性,并选择与项目时行符合的规范和约定。

性能相关问题

Vue.js 中的性能优化技巧和策略

  1. 使用 computed 和 watched 属性:计算属性和监视属性是 Vue.js 的核心特性,可以有效地避免昂贵的计算,以及响应式地更新 DOM。

  2. 避免在模板中使用过多的计算:过多的计算和复杂的表达式会显著降低渲染性能。

  3. 合理利用 Vue.js 的 v-if 和 v-for 指令:在渲染较大数据集时,v-for 指令易致使性能下降,应尽量避免使用不必要的重复元素和条件渲染。

  4. 利用路由懒加载:将页面划分成许多小块编写易于配置和维护。

  5. 利用代码拆分:通过使用应用程序之前访问的确切代码来仅加载所需功能模块的部分代码,这可以实现灵活、快速和可扩展性的前端编程技术。

  6. 缓存进入位置:记录应用程序用户上一次停留的位置是比动效和过度更重要的实际统计数据之一。

  7. 如何知晓性能余地:随意阻止 Vue.js 的性能和内存使用表现良好的应用程序往往花不了多长时间截至到加载时间。

  8. 利用 Vue-once 指令:Vue.js 通过 Vue-once 指令提供不需重新渲染 DOM 的功能,它会断开计算回溯而一次性渲染整个模板。

异步组件和代码分割

异步组件(Async Components)

Vue.js 的异步组件能够让你在需要的时候再去加载一个组件,而不是在应用程序初次渲染时就读取所有组件。这有助于提高应用的性能和缩短加载时间。

你可以使用 import() 语法来定义一个异步组件。

Vue.component('async-component', () =>  import('./AsyncComponent.vue'));
复制代码

这样,在应用程序运行时就只加载了主线程需要用到的组件和代码,非常适用于长列表或滚动视图等只需要渲染一部分内容的场合。

代码分割(Code Splitting)

代码分割是指将具有共同特征的代码块(如多个 JS 文件)分拆为尽可能小的块,并在需要时再按需加载,以确保不影响初始页面加载速度,并在接下来的过程中获得很好的用户体验。

你可以使用 Webpack 按需加载需要的代码模块,代码块也可以根据应用程序进行分组,这样会使应用程序更为充实和可维护。下面是一个 Webpack 中基于代码分割生成的路由在同步和异步模式下的代码规范:

防止浪费资源和保持应用程序对于驱动和页面之间的状态分离。错误的同时加载代码代码import Vue from "vue";import Application from "./views/Application.vue";import Settings from "./views/Settings.vue";
2. Laoding Routes and Components Asynchronously以异步方式生成路由和所有组件将相应降低应用程序程序的初始加载时间。组件只会在需要时重新渲染。实际Vue Router使用示例import Vue from "vue";import Router from "vue-router";
Vue.use(Router);
export default new Router({ mode: "history", base: process.env.BASE_URL, routes: [ { to: "/loadable-layout", component: () => Promise.resolve().then(() => import(/* webpack chunkName: "loadableLayout" */"./views/Application.vue"))}, { to: "/loadable-settings", component: () => Promise.resolve().then(() => import(/* webpack chunkName: "loadableComponents" */"./views/Settings.vue"))} ]});同时为了将代码分割应用于应用程序,Webpack还专警下面的规范:让 Webpack 实现按需加载代码块,并把组件使用import()引入
复制代码

除了 Webpack,还可以使用一些其他工具规范分片的职责治理渲染混淆和最小。  

总之,异步组件和代码分割能够提高应用性能和加载速度,不过需要进行合适的配置及决策,以获得尽量大的优化效果。

应用懒加载和分块加载

应用懒加载

Vue.js 中的懒加载是一种异步加载组件的方式,在需要的时候再去加载组件,而不是一开始就加载所有组件,以提高应用程序的性能。

常用的组件懒加载方式是使用 Vue异步组件(Async Component),通过 第二个重载参数 给 Vue.component() 方法传递一个 回调函数,让这个回调函数就接加载对应的组件:

Vue.component('lazy-load', (resolve, reject) => {  import('./lazy-load.vue').then(resolve).catch((error) => {    reject(error);  });});
复制代码

只要加载组件的过程不能确保一个事物的完传才正确执行,我们的加载将产生问题。考虑下面代码:

var list = document.getElementsByType('li');
list[number].addEventList({ type: 'click', func() { import('/every-module.js'); }});
复制代码

需要注意,这里的 event.currentTarget 变量对象在一个时间窗口内长时间等待捕捉当前的元素。并且在捕捉掉后,你的 every-module.js 文件很可能已经过期了。这就说明,在调用异步资源项目时必须仔细考虑目前 router 的状态及用户的行为证据,比如等待完成所有元素选染完后,调用所有元素的循环逻断或使用 Web 化进行资源分配。

分块加载

Vue.js 中的分块加载也是一种异步加载代码的方式,它是为了将打包好的代码文件根据业务块进行拆分,按需加载而设计的。

常用的代码分块方式是使用 Webpack 和 ES6 的 import() 语法,在符合条件的情况下会想调配整'chunk([name])方法:

// webpack.config.js
module.exports = { entry: { app: './src/app.js', }, output: { path: __dirname + '/dist', filename: '[name].bundle.js', chunkFile: '[name].chunk.js' }};
// app.js
// 加载模块 promise all 或其他编程条件
import('/router.js') .them(({ historyWebsiteRouter })=>{ console.log('Router compiled with history mode'); historyWebsiteRouter.handlers.baseIdentifier.then(() => console.log('Router initialized')); load.bind(this) }) .catch((error) => console.log(error));
复制代码


发布于: 刚刚阅读数: 9
用户头像

xfgg

关注

THINK TWICE! CODE ONCE! 2022-11-03 加入

目前:全栈工程师(前端+后端+大数据) 目标:架构师

评论

发布
暂无评论
Vue.js 最佳实践:提高性能和减少耦合的方法_JavaScript_xfgg_InfoQ写作社区