前端常用的性能优化方案

news2024/11/24 4:07:40

目录

      • 性能分析工具
        • lighthouse
        • Webpack Bundle分析
      • 开发阶段
        • 按需引入
        • 路由懒加载
      • 打包阶段
        • 打包配置减少包体积
          • 配置压缩
          • 分包
        • 资源预加载/预请求
      • 部署阶段
        • 开启http2
        • 静态资源缓存
        • gzip压缩

性能优化主要在三个阶段进行:开发阶段、开发结束后的打包阶段、项目部署上线阶段

首先需要知道性能优化要达到的目的就是让页面加载更快,也就是需要让代码打包后的体积尽可能的小以及让资源请求时机分配更合理

在我独立开发的博客全栈项目也用到了性能优化,在项目开发结束后不进行优化直接部署上线后后台的lighthouse打分只有50多分,性能很差,白屏时间也长,经过一系列的优化后再次部署上线,前台lighthouse跑分100分,后台也有80多分,加载速度有了很大的提升。

前台lighthouse:

前台lighthouse.jpg

后台lighthouse:

后台lighthouse.jpg

性能分析工具

lighthouse

谷歌浏览器自带的开发者工具,在项目部署上线后可以f12找到lighthouse对项目进行跑分,lighthouse不仅能通过评分直观的看到项目的整体性能情况,还能提出项目的性能问题,可以依照提出的问题对项目进行优化

Webpack Bundle分析

webpack中提供了对打包的项目文件体积直观展示的插件webpack-bundle-analyzer,安装后在vue.config.js中配置,然后在执行了打包命令打包结束后就会自动打开浏览器展示打包的各文件体积,可以直观的看到哪些文件体积过大,也能看到哪些依赖包项目并没有用到却忘了移除,可以通过这个插件去优化项目的包体积

// vue.config.js配置
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
    configureWebpack: {
        plugins: [
            new BundleAnalyzerPlugin()
        ],
    },
}

效果图:

在这里插入图片描述

开发阶段

开发过程中按需引入、懒加载、请求合理化、代码精简等

按需引入

往往一个项目中需要用到很多的第三方依赖,而在开发中也许用不到依赖的所有方法和组件,这时候就需要对第三方依赖进行按需引入,只引入代码中需要用到的组件或方法,以减少打包时的包体积;比如项目中使用element组件库就尽量使用官网提供的按需引入的方法

路由懒加载

SPA中一个很重要的提速手段就是路由懒加载,当打开页面时才去加载对应文件,我们利用Vue的异步组件和webpack的代码分割(import())就可以轻松实现懒加载了。

但当路由过多时,请合理地用webpack的魔法注释对路由进行分组,太多的chunk会影响构建时的速度

    // 进入register页面时才会加载对应的路由组件
    {
        path: 'register',
        name: 'register',
        component: () => import(/* webpackChunkName: "user" */ '@/views/user/register'),
    }

在开发过程中也需要注意合理使用请求,网络请求也是性能优化的一方面,在项目开发过程中需要注意请求的时机,合理分配请求,去除无用请求等

打包阶段

打包配置减少包体积

webpack/vite打包阶段对代码进行压缩、图片压缩、分包、去除无用代码、资源预加载等操作让代码包体积减小以及合理分配资源请求,从而实现部署上线后缩短请求时间等

对webpack/vite进行配置也是性能优化中很重要的一环,通过合理的打包配置可以大幅减少项目包体积。

配置压缩

vue-cli配置图片压缩以及gzip压缩:

module.exports = {
  // 修改已有的plugins/loader时使用chainWebpack
  chainWebpack: config => {
    // 压缩图片
    // 需要 npm i -D image-webpack-loader
    config.module
      .rule("images")
      .use("image-webpack-loader")
      .loader("image-webpack-loader")
      .options({
        mozjpeg: { progressive: true, quality: 65 },
        optipng: { enabled: false },
        pngquant: { quality: [0.65, 0.9], speed: 4 },
        gifsicle: { interlaced: false },
        webp: { quality: 75 }
      });
  },
  
  // 添加新的plugins/loader以及webpack配置项时使用configureWebpack
  configureWebpack: config => {
    // 开启 gzip 压缩
    // 需要 npm i -D compression-webpack-plugin
    const plugins = [];
    if (IS_PROD) {
      plugins.push(
        new CompressionWebpackPlugin({
          filename: "[path].gz[query]",
          algorithm: "gzip",
          test: productionGzipExtensions,
          threshold: 10240,
          minRatio: 0.8
        })
      );
    }
    config.plugins = [...config.plugins, ...plugins];
  }
}

vite配置图片压缩、gzip压缩、移除console.log:

    import { defineConfig } from 'vite'
    import vue from '@vitejs/plugin-vue'
    //引入gzip压缩
    import viteCompression from 'vite-plugin-compression'
    //压缩图片
    import viteImagemin from 'vite-plugin-imagemin'
    
    // https://vitejs.dev/config/
    export default defineConfig({
      //配置打包公共根路径
      base: "./",
      plugins: [
        vue(),
        //gzip压缩
        viteCompression({
          verbose: true,
          disable: false,
          threshold: 10240,
          algorithm: 'gzip',
          ext: '.gz',
        }),
        //图片压缩
        viteImagemin({
          gifsicle: {
            optimizationLevel: 7,
            interlaced: false
          },
          optipng: {
            optimizationLevel: 7
          },
          mozjpeg: {
            quality: 20
          },
          pngquant: {
            quality: [0.8, 0.9],
            speed: 4
          },
          svgo: {
            plugins: [
              {
                name: 'removeViewBox'
              },
              {
                name: 'removeEmptyAttrs',
                active: false
              }
            ]
          }
        })
      ],
      //生产环境配置
      build: {
        //移除console.log
        minify: 'terser', // 默认为esbuild,需要安装terser -D
        terserOptions: {
          compress: {
            // drop_console: true, // 生产环境移除console
            // drop_debugger: true // 生产环境移除debugger
          }
        }
      }
    })
分包

vue-cli3的默认优化是将所有npm依赖都打进chunk-vendor,但这种做法在依赖多的情况下导致chunk-vendor过大,可以在vue.config.js中配置分包策略,将第三方依赖包单独打包,避免打包后单一文件过大导致请求加载缓慢。

    optimization: isProd ? {
      splitChunks: {
        chunks: 'all',
        maxInitialRequests: Infinity, // 默认为3,调整为允许无限入口资源
        minSize: 20000, // 20K以下的依赖不做拆分
        cacheGroups: {
          vendors: {
            // 拆分依赖,避免单文件过大拖慢页面展示
            // 得益于HTTP2多路复用,不用太担心资源请求太多的问题
            name(module) {
              // 拆包
              const packageName = module.context.match(/[\/]node_modules[\/](.*?)([\/]|$)/)[1]
              // 进一步将Ant组件拆分出来,请根据情况来
              // const packageName = module.context.match(/[\/]node_modules[\/](?:ant-design-vue[\/]es[\/])?(.*?)([\/]|$)/)[1]
              return `npm.${packageName.replace('@', '')}` // 部分服务器不允许URL带@
            },
            test: /[\/]node_modules[\/]/,
            priority: -10,
            chunks: 'initial'
          }
        }
      },
      runtimeChunk: { name: entrypoint => `runtime-${entrypoint.name}` }
    } : {}
  1. vue inspect > output.js --mode production 可以查看最终配置
  2. 分包这块需要根据实际情况做对应处理,才能取得比较好的效果,总之多看文档多试就对了
资源预加载/预请求
标签的rel属性的两个可选值。Prefetch,预请求,是为了提示浏览器,用户未来的浏览有可能需要加载目标资源,所以浏览器有可能通过事先获取和缓存对应资源,优化用户体验。Preload,预加载,表示用户十分有可能需要在当前浏览中加载目标资源,所以浏览器必须预先获取和缓存对应资源。

Prefetch、Preload在某些场景下可以有效优化用户体验。

Vue-Cli3默认会使用preload-webpack-plugin对chunk资源做preload、prefetch处理,入口文件preload,路由chunk则是prefetch。

一般来说不需要做特别处理,如果判断不需要或者需要调整在vue.config.js中配置即可

部署阶段

服务器部署项目用nginx开启http2、静态资源缓存、资源压缩等减少项目包的请求时间和次数等

项目部署阶段借助nginx也可以对项目性能进行优化。

开启http2

http2有着多路复用和头部信息压缩的特性,项目开启http2可以同时处理多个请求,加快请求时间,开启http2之前需要给项目开启https,具体怎么开启https以及http2可以看我这篇文章:网站使用nginx部署ssl证书开启https(开启http2)

静态资源缓存

nginx还可以配置静态资源缓存,对项目的静态资源配置缓存后在资源第一次请求后会将资源缓存下来,后续就可以直接使用缓存,在缓存到期之前都不会再次请求该静态资源,可以加快资源获取时间

#静态资源缓开启缓存
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
    {
        # 这里同样需要反向代理,不然请求路径会是haixtx.cn:82,会出现404
        proxy_pass http://114.55.75.3:8000;
        expires 30d;
    }
    location ~ .*.(js|css)?$
    {
        proxy_pass http://114.55.75.3:8000;
        expires 12h;
    }
gzip压缩

nginx也可以配置gzip压缩,HTTP协议中用头部字段Accept-EncodingContent-Encoding对「采用何种编码格式传输正文」进行了协定,请求头的Accept-Encoding会列出客户端支持的编码格式。当响应头的Content-Encoding指定了gzip时,浏览器则会进行对应解压

一般浏览器都支持gzip,所以Accept-Encoding也会自动带上gzip,所以我们需要让资源服务器在Content-Encoding指定gzip,并返回gzip文件

    #开启和关闭gzip模式
    gzip on;
    #gizp压缩起点,文件大于1k才进行压缩
    gzip_min_length 1k;
    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
    gzip_comp_level 6;
    # 进行压缩的文件类型。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript ;
    # nginx对于静态文件的处理模块,开启后会寻找以.gz结尾的文件,直接返回,不会占用cpu进行压缩,如果找不到则不进行压缩
    gzip_static on
    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;
    # 设置gzip压缩针对的HTTP协议版本
    gzip_http_version 1.1;

虽然上面配置后Nginx已经会在响应请求时进行压缩并返回Gzip了,但是压缩操作本身是会占用服务器的CPU和时间的,压缩等级越高开销越大,所以我们通常会一并上传gzip文件,让服务器直接返回压缩后文件,所以还需要在项目打包阶段配置gzip,具体配置上面已经讲过了

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

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

相关文章

动态规划例题

目录 A.小红组比赛 B.小红升装备 A.小红组比赛 思路 :经典的多重背包问题,这里将dp[ i ][ j ]定义为前 i 场比赛的难度 j 是否可能,所以dp只需用0 1 表示,然后遍历dp[ n ][ j ]即可。 代码: void solve() { cin&g…

TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(Transformer 在图像中的应用)翻译

摘要 虽然Transformer架构已成为自然语言处理任务的实际标准,但其在计算机视觉领域的应用仍然有限。在计算机视觉中,注意力机制要么与卷积网络结合使用,要么用于替换卷积网络的某些组件,同时保持其整体结构不变。我们证明了这种对…

抖音网红老阳:temu选品师好做吗?

抖音网红老阳近期分享了关于成为TEMU选品师的话题,引发了不少人的关注和讨论。那么,成为TEMU选品师究竟是一种怎样的体验?这项工作适合大多数人吗? 首先,TEMU选品师的工作内容主要集中在拼多多跨境电商平台上,这是一种新兴的电商…

VS Code 扩展之——私有扩展管理(Private Extension Manager)

为什么需要私有扩展的管理器? 和 Eclipse IDE的插件开发类似,VS Code(Visual Studio Code)也可以很容易的对VS Code编辑器进行创建和扩展新功能,这些扩展可以涵盖代码片段、主题、语言支持、调试器等多个方面。 VS Co…

昂科烧录器支持TI德州仪器的32位微控制器TMS320F28032

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中TI德州仪器的32位微控制器TMS320F28032已经被昂科的通用烧录平台AP8000所支持。 C2000™ 32位微控制器针对处理、感应和驱动进行了优化,可提高实时控制应用&#x…

IDEA全局搜索Jar包中内容

IDEA全局搜索Jar包中内容 【一】下载源码【二】搜索内容【1】按文件名搜索【2】全局关键字搜索【3】方法引用 【一】下载源码 想要搜索Jar中关键字,必须先把jar包源码下载下来,否则搜不到。 Preferences --> Maven --> Importing,根据…

类与对象的介绍

目录 一、类与实例的关系 二、快速入门-面向对象的方式解决养猫问题 三、类和对象的区别和联系 四、对象在内存中的存在形式 五、属性/成员变量 1、基本介绍 2、注意事项和细节说明 六、类的定义和使用 1、如何定义类 2、如何创建对象 3、如何访问属性 七、对象的传…

深⼊理解指针(4)

1. 回调函数是什么? 2. qsort使⽤举例 3. qsort函数的模拟实现 1. 回调函数是什么? 1. 回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数&#xff…

【Python】Numpy概述安装及使用

文章目录 Numpy概述Numpy开发环境搭建Numpy使用创建数组创建一维数组创建二维数组创建三维数组,array()函数ndmin参数的使用array()函数dtype参数的使用随机数创建 Numpy概述 Numpy是科学计算基础库,提供大量科学计算相关功能,比如数据统计&…

SpringMabatis学习笔记1

今日内容:搭建mybatis ORM 配置数据源 $#的区别 增删改 ORM (Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制&#xff0…

2024软考注意!!《系统规划与管理师》大概率要改版,新教材已出

系统规划与管理师考试是全国计算机技术与软件专业技术资格考试的高级水平考试之一,一年仅考一次,也是2024年下半年的4门高级考试中,最适合零基础考生的高级科目。近日在国家版本数据中心,查到系统规划与管理师已经有2024最新版的教…

Windows常用的运行命令

cmd - 命令提示符 cmdcalc - 打开计算器 calcservices.msc - 本地服务设置 services.msccontrol - 打开控制面板 controlwinver - 查看windows版本 winvermstsc - 连接远程电脑 mstsc ms t(terminial终端) s(service服务)c(client客户端) mstscmspaint - 打开画图 m…

特斯拉智驾方案演变过程

目录 一、概述二、特斯拉算法的发展历程2.1 特斯拉第一代算法:HydraNets2.2 特斯拉第二代算法:BEV + Transformer2.3. 特斯拉第三代算法:占据网络2.4. 特斯拉第四代算法:端到端方案三、智驾技术特点3.1 算法3.2 算力3.3 数据四、端到端挑战一、概述 在当今科技飞速发展的时…

智能家居沙盘系统-智慧家居沙盘系统

智能家居和物联网技术是当前科技领域的热门话题,随着各类智能家居产品的不断推出,智能家居市场也逐渐呈现出蓬勃发展的态势。智能家居快速发展,而物联网相关人才供应远远不足。高校开展智能家居工程及设计人才教育培养具有重大意义。 基本介绍…

一键登录,打造华为账号便捷新体验

作为鸿蒙世界的通行证,一个华为账号可以登录所有的HarmonyOS设备,为HarmonyOS设备无缝衔接和协同使用提供诸多便利。HarmonyOS SDK华为账号服务(Account Kit)提供简单、快速、安全的登录功能,让用户快捷地使用华为账号…

04:【stm32】LED编程和按键控制

LED编程和按键控制 1、LED编程1.1、点亮一课LED灯 2、按键控制2.1、通过一个按钮控制LED灯的亮灭 1、LED编程 1.1、点亮一课LED灯 首先,我们想象一下,让LED灯点亮,引脚应该是输出模式,那么应该是通用模式,还是复用模式…

视频如何生成二维码(自动生成二维码)完整教程

在企业中,产品视频二维码怎么制作,产品二维码怎么实现微信扫码便捷观看?上图文教程:视频二维码生成器/上传视频自动生成二维码完整教程。 目前市面上有很多工具,可以实现,比如草料二维码、酷播云二维码等等…

软考:软件设计师 — 10.面向对象技术

十. 面向对象技术 1. 面向对象基本概念 (1)对象与类相关概念 在面向对象的系统中,对象是基本的运行时的实体,它既包括数据(属性),也包括作用于数据的操作(行为)。一个…

计算机组成原理 —— 微操作控制器

计算机组成原理 —— 微操作控制器 指令,微操作,微指令和微程序之间的关系指令 (Instruction)微操作 (Micro-operation)微指令 (Microinstruction)微程序 (Microprogram)关系示例 微程序控制器的基本结构微程序控制器的基本结构工作流程 微指令的基本格式…

AI技巧---1个万能公式,让AI帮你快速写汇报、方案、总结

现阶段我们跟AI沟通,主要是通过提示词。提示词怎么写,其实就决定了AI输出内容的质量和效果,这是用AI给公文写作提效的基本技能。 但如果你已经尝试过用AI写公文,可能会有这样的感受,就是AI输出的内容很多都是正确的废…