前端性能优化总结(SPA篇)

news2024/11/29 10:49:25

性能优化

所有开发者都无法避免的一个问题,即关于项目的性能优化。性能优化是一个经久不衰的问题,它几乎贯穿于整个项目的开发过程。做好性能优化的项目不仅能在用户体验上更胜一筹,还能让服务资源的分配更加的合理。

关于SPA(单页面)应用程序的优化

前端开发者基本上都知道单页面的程序有一个通病,首屏加载太慢了,因为第一次访问的时候需要加载的东西太多,资源量太大以至于体验起来可能并不那么友好,以下就这个点便可以针对性地展开优化。

1、路由懒加载

SPA 项目,一个路由对应一个页面,如果不做处理,项目打包后,会把所有页面打包成一个文件,当用户打开首页时,会一次性加载所有的资源,造成首页加载很慢,降低用户体验。

官方其实也就这个问题给出了答复,我们只需要按照他们的提示去改动代码,那么就可以在一定程度上去提高项目的运行速度。

// 通过webpackChunkName设置分割后代码块的名字
const Home = () => import(/* webpackChunkName: "home" */ "@/views/home/index.vue");
const MetricGroup = () => import(/* webpackChunkName: "metricGroup" */ "@/views/metricGroup/index.vue");
…………
const routes = [
    {
       path: "/",
       name: "home",
       component: Home
    },
    {
       path: "/metricGroup",
       name: "metricGroup",
       component: MetricGroup
    },
    …………
]

2、组件懒加载

组件懒加载跟路由懒加载的方式一样,将资源分开,等到需要的时候我们再把它引入到我们的页面中,从而节省资源,优化页面的加载速度。

例如弹窗组件的懒加载。

<script>
const dialogInfo = () => import(/* webpackChunkName: "dialogInfo" */ '@/components/dialogInfo');
export default {
  name: 'homeView',
  components: {
    dialogInfo
  }
}
</script>

重新打包后,home.js 和 about.js 中没有了弹框组件的代码,该组件被独立打包成 dialogInfo.js,当用户点击按钮时,才会去加载 dialogInfo.js 和 dialogInfo.css

组件懒加载的使用场景

有时资源拆分的过细也不好,可能会造成浏览器 http 请求的增多
总结出三种适合组件懒加载的场景:
1)该页面的 JS 文件体积大,导致页面打开慢,可以通过组件懒加载进行资源拆分,利用浏览器并行下载资源,提升下载速度(比如首页)
2)该组件不是一进入页面就展示,需要一定条件下才触发(比如弹框组件)
3)该组件复用性高,很多页面都有引入,利用组件懒加载抽离出该组件,一方面可以很好利用缓存,同时也可以减少页面的 JS 文件大小(比如表格组件、图形组件等)

懒加载原理

懒加载前提的实现:ES6的动态地加载模块——import()。

要实现懒加载,就得先将进行懒加载的子模块分离出来,打包成一个单独的文件

webpackChunkName 作用是 webpack 在打包的时候,对异步引入的库代码(lodash)进行代码分割时,设置代码块的名字。webpack 会将任何一个异步模块与相同的块名称组合到相同的异步块中

简而言之,就是用懒加载后程序只会去加载你当前页面所需要的资源,不需要的资源暂时不会请求,而且在后续如果重复的资源被利用了,也不会再做请求,从而消耗了我们浏览器资源。

3、 Tree shaking的优化

tree-shaking 原理:
依赖于ES6的模块特性,ES6模块依赖关系是确定的,和运行时的状态无关,可以进行可靠的静态分析,这就是 tree-shaking 的基础
静态分析就是不需要执行代码,就可以从字面量上对代码进行分析。ES6之前的模块化,比如 CommonJS 是动态加载,只有执行后才知道引用的什么模块,就不能通过静态分析去做优化,正是基于这个基础上,才使得 tree-shaking 成为可能

Tree shaking 的作用:
消除无用的 JS 代码,减少代码体积

对比以下两端代码

// 第一段
export function targetType(target) {
  return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();
}
export function deepClone(target) {
  return JSON.parse(JSON.stringify(target));
}


// 第二段
export default {
  targetType(target) {
    return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();
  },
  deepClone(target) {
    return JSON.parse(JSON.stringify(target));
  }
};

// 引入并使用
import util from '../util';
util.targetType(null)

其实两者在使用上并无太大的区别,只是第二段又多做了一层封装,但是这样的封装会让tree shaking失效,使项目打包体积增大,降低我们资源包的精准分配。因为我们所进行的封装会默认地把该文件中所有的函数整个被引入到组件页面中,导致一些无用代码的产生。

究其原因,export default 导出的是一个对象,无法通过静态分析判断出一个对象的哪些变量未被使用,所以 tree-shaking 只对使用 export 导出的变量生效
这也是函数式编程越来越火的原因,因为可以很好利用 tree-shaking 精简项目的体积,也是 vue3 全面拥抱了函数式编程的原因之一

4、骨架屏优化白屏时长

在这里插入图片描述

使用骨架屏,可以缩短白屏时间,提升用户体验。国内大多数的主流网站都使用了骨架屏,特别是手机端的项目
SPA 单页应用,无论 vue 还是 react,最初的 html 都是空白的,需要通过加载 JS 将内容挂载到根节点上,这套机制的副作用:会造成长时间的白屏

常见的骨架屏插件就是基于这种原理,在项目打包时将骨架屏的内容直接放到 html 文件的根节点中
使用骨架屏插件,打包后的 html 文件(根节点内部为骨架屏):

骨架屏插件

①安装插件

npm i vue-skeleton-webpack-plugin 

②vue.config.js 配置

const SkeletonWebpackPlugin = require("vue-skeleton-webpack-plugin");
module.exports = {
   configureWebpack: {
      plugins: [
       new SkeletonWebpackPlugin({
        // 实例化插件对象
        webpackConfig: {
          entry: {
            app: path.join(__dirname, './src/skeleton.js') // 引入骨架屏入口文件
          }
        },
        minimize: true, // SPA 下是否需要压缩注入 HTML 的 JS 代码
        quiet: true, // 在服务端渲染时是否需要输出信息到控制台
        router: {
          mode: 'hash', // 路由模式
          routes: [
            // 不同页面可以配置不同骨架屏
            // 对应路径所需要的骨架屏组件id,id的定义在入口文件内
            { path: /^\/home(?:\/)?/i, skeletonId: 'homeSkeleton' },
            { path: /^\/detail(?:\/)?/i, skeletonId: 'detailSkeleton' }
          ]
        }
      })        
      ]
   }
}

③新建 skeleton.js 入口文件

// skeleton.js
import Vue from "vue";
// 引入对应的骨架屏页面
import homeSkeleton from "./views/homeSkeleton";
import detailSkeleton from "./views/detailSkeleton";

export default new Vue({
    components: {
        homeSkeleton,
        detailSkeleton,
    },
    template: `
    <div>
      <homeSkeleton id="homeSkeleton" style="display:none;" />
      <detailSkeleton id="detailSkeleton" style="display:none;" />
    </div>
  `,
});

以上这些就是SPA项目的优化手段,像其他优化的方式还有很多,但是我们应该在项目的开发阶段就考虑这样的方案,不然会导致后续维护和优化的成本变高。所以如有必要,我们应该尽量在早期的时候就开始干涉项目的优化进度和性能水平,这样才能持续输出有质量和易维护的产品。

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

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

相关文章

互联网医院开发|线上问诊系统开发|互联网医院功能开发

互联网医院在智慧医疗版块可以算的上是“核心成员”&#xff0c;无论是出色的实战能力还是在管理功能模块上&#xff0c;都为行业带来了切实的便利&#xff0c;就例如平时的工作安排&#xff0c;省时省力&#xff0c;也让患者有更方便的就医条件&#xff0c;互联网医院系统源码…

必须掌握的重写,重载,equals,==

生活是晨起暮落&#xff0c;日子是柴米油盐&#xff0c;时光匆匆&#xff0c;我们终将释怀。 重写与重载的区别 重写(Override) 1.发生在父类与子类之间 2.方法名&#xff0c;参数列表&#xff0c;返回类型必须相同 3.访问修饰符的限制一定要大于被重写方法的访问修饰符,如果…

【sunny land】利用Animation编辑器实现近战敌人判定

昨晚研究了一晚Boss近战判定&#xff0c;也找了一些方法&#xff0c;但始终找不到合适的 今天终于让我找到了[泪目] 让我们先看演示 这个效果是我们的Boss挥刀时不造成伤害&#xff0c;当火焰冒出来时再对主角造成伤害。 这个我讲详细点吧 步骤&#xff1a; 首先&#xff…

矿井水行业氟超标的解决方法

高矿化度的废水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

三星弃Google用Bing?谷歌赶工新AI搜索Magi

“三星考虑将手机端的默认搜索引擎由Google换成Bing”&#xff0c;《纽约时报》上的这则消息披露次日&#xff0c;微软股价上涨2%&#xff0c;谷歌母公司Alphabet股价下跌3%。 过去20年里&#xff0c;谷歌一直是在线搜索领域无人能敌的霸主&#xff0c;微软旗下的Bing只在3%-5…

录屏文件太大怎么办?您可以这样做!

案例&#xff1a;录制的录屏文件体积比较大怎么办&#xff1f; 【我发现我录制的电脑录屏文件体积比较大&#xff0c;不好保存&#xff0c;会占用电脑的内存。我想知道怎样才可以录制体积较小的录屏&#xff1f;有没有小伙伴有解决的办法&#xff1f;】 录屏是我们经常需要用…

ATTCK v12版本战术介绍——防御规避(四)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第19-24种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…

IO流复习

IO流 程序到文件&#xff0c;文件到程序分为输出流和输入流流分为字节流&#xff0c;字符流 字节流可以操作所有类型文件&#xff0c;字符流只能操作文本文件&#xff08;可以用windows记事本打开并且能正常读懂的文件&#xff09; 流的结构图&#xff1a;只有下面接口的实现…

如何利用Trimble RealWorks三维激光扫描仪进行外业测量和内业处理?

文章目录 0.引言1.Trimble RealWorks介绍2.外业测量3.内业处理 0.引言 笔者所在资源与环境工程学院实验室采购有一台Trimble RealWorks三维激光扫描仪&#xff08;仪器名&#xff1a;Trimble TX8&#xff09;&#xff0c;因项目需要&#xff0c;在学校实验场地进行实地测量训练…

MIT教授Tegmark:GPT-4敲响警钟,百年后人类何去何从丨智源大会嘉宾风采

导读 一封呼吁暂停大模型研究6个月的公开信让一家名为未来生命研究所&#xff08;Future of Life Institute 简称&#xff1a;FLI&#xff09;站上了风口浪尖。这家研究所的联合创始人Max Tegmark是来自麻省理工学院的物理学家和人工智能研究员&#xff0c;《生命3.0在人工智能…

Unity TextMeshPro文本描边outline存在黑底问题研究

在使用TextMeshPro的时候遇到了字体黑底的问题&#xff0c;类似下图这样 当字体较大的时候表现正常&#xff0c;当缩小到一定程度就会出现黑底。这个情况让人第一时间就是怀疑SDF计算缩放的时候存在问题。在我们重新导出字体&#xff0c;调整图集字体大小以及Padding后&#xf…

【深度学习】点云PointNet从0到1

文章目录 前言1 PointNet1.1 点云的数据集1.2 点云的挑战1.1 网络结构 前言 直接处理点云数据的深度学习技术PointNet End To end Learning for scattered&#xff0c; unordered point data Unified franework for various tasks Point-Based Methods 分为 PointNet 和 Poin…

万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 1

生物数据的规模不断扩大和固有复杂性促使越来越多的人在生物学中使用机器学习来构建相关生物过程的信息和预测模型。所有机器学习技术都是把数据拟合到模型&#xff0c;然而&#xff0c;具体方法千差万别&#xff0c;乍一看似乎令人困惑。在这篇综述中&#xff0c;我们旨在向读…

好用免费,国内手机人人都能玩的GPT!

用了这个长时间的chatgpt真的是觉得离不开它&#xff0c;太好用的&#xff01;又是是写作&#xff0c;编程&#xff0c;日常的一些咨询搜索的事情全部交给它了&#xff01;但是很少有人在手机上能玩GPT! 对于大多数普通选手来说&#xff0c;想在手机上玩GPT&#xff0c;始终离不…

王一茗: “大数据能力提升项目”与我的成长之路 | 提升之路系列(三)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

8种不同类型的防火墙

什么是防火墙&#xff1f; 防火墙是一种监视网络流量并检测潜在威胁的安全设备或程序&#xff0c;作为一道保护屏障&#xff0c;它只允许非威胁性流量进入&#xff0c;阻止危险流量进入。 防火墙是client-server模型中网络安全的基础之一&#xff0c;但它们容易受到以下方面的…

R语言 | 处理矩阵与更高维数据

目录 一、矩阵 1.1 建立矩阵 ​1.2 认识矩阵的属性 1.3 将向量组成矩阵 二、取得矩阵元素的值 2.1 矩阵元素的取得 2.2 使用负索引取得矩阵元素 三、修改矩阵的元素值 四、降低矩阵的维度 五、矩阵的行名和列名 5.1 取得和修改矩阵对象的行名和列名 5.2 dimnames()函数…

【MySQL自学之路】第4天——模式、表、视图、索引(数据定义详细版)

目录 前言 数据库 数据库的建立 数据库的使用 数据库的查看 数据库的删除 模式 查看所有的模式 模式和数据库之间的关系 ​编辑建立模式 删除模式 表 数据类型 查看一个数据库下面的所有表(必须进入要查看的数据库) 创建基本表 查看表结构&#xff08;查看表建…

EU GMP附录一与关键区域空气微生物取样方案及相关法规标准解读

2022版EU GMP附录一与关键区域空气微生物取样方案疑问解答 3月30日2022版EU GMP附录一与关键区域空气微生物取样方案网络研讨会期间&#xff0c;我们收集到了部分参会听众针对该主题所提出的常见问题。根据以下这些问题&#xff0c;lighthouse微生物应用专家将来为您答疑解惑。…

多功能自动化智能运维平台,提升集群的全自动运维效率

一、开源项目简介 致力于打造一个集主机管理、配置部署、监控报警、异常诊断、安全审计等一系列功能的自动化运维平台。 探索创新的sysAK、ossre诊断工具及高效的LCC&#xff08;Libbpf Compiler Collection&#xff09;开发编译平台和netinfo网络抖动问题监控系统等&#xff…