vue 一个页面有点请求需要同时发送_前端性能优化,这些你都需要知道

537e30945b7861d41ac430205ab12199.png来源: 海洋里的魔鬼鱼

前言

最近花了一些时间在项目的性能优化上,背后做了很多工作,但是最后依然没有达到自己想要的结果,有些失望,但是还是记录下自己的执着。

性能优化总结:减少请求次数、减小资源大小、提高响应和加载速度、优化资源加载时机、优化加载方式。

性能分类

对前端工程性能的优化,我觉得可以分为两类:

  • 站在用户视角的主观的可感知的性能。
  • 站在开发者视角的可客观度量的性能。

感知性能

对于用户来说,用户的感知性能才是最重要的,简单讲,就是让用户感觉你的网站访问很快,并且感知性能没有衡量标准。

不过,凡事总有例外,如果一个页面的加载时间就会很长,我们也可以通过一些方式让用户觉得没有那么慢。

总之一句话,你的页面可以做的不快,但是你可以让你的用户觉得你很快。

客观性能

对于开发者来说,性能指标是可以客观度量的,我们可以通过一些手段来优化 Web 性能,使这些度量指标达到开发者设定的标准。

客观性能是指,从用户输入url开始,到下载、解析和执行所有资源以及最终绘制的整个过程的时间度量。

性能指标是个很复杂的标准,后续我会单独整理出一篇文章介绍性能指标。

构建优化

由于我司使用的是  @vue/cli,所以许多webpack配置脚手架已经帮你完成了,我就不叙述了,这里只讲基于 @vue/cli 做的一些优化配置

gzip 压缩

gzip 压缩效率非常高,通常可以达到 70% 的压缩率,也就是说,如果你的网页有 30K,压缩之后就变成了 9K 左右。

//npm i -D compression-webpack-plugin
configureWebpack: config => {
  const CompressionPlugin = require('compression-webpack-plugin')
  config.plugins.push(new CompressionPlugin())
}

去除 console.log

线上项目自然不应该被看到控制台的打印日志,所以我们需要将 console.log 都去除掉。

//npm i -D terser-webpack-plugin 
 configureWebpack: config => {
   const TerserPlugin = require('terser-webpack-plugin')
   config.optimization.minimizer.push(
     new TerserPlugin({
       extractComments: false,
       terserOptions: { compress: { drop_console: true } },
     })
   )
 }

去除 SourceMap

由于打包后的文件经过了压缩、合并、混淆、babel编译后的代码不利于定位分析bug。

module.exports = {
  productionSourceMap: false,
}

CDN减少打包体积

使用 cdn 文件来减少工程到打包体积,也可以按需加载。

在 /public/index.html 中引入需要的js和css文件

29ba243d0e127064e188a7647a075438.png

去掉 package.json 中对于 vue、element-ui 等相关资源的依赖

src/main.js ,去掉 vue、element-ui 等相关资源的 import 和 vue.use 这些语句

fe9ef2c1a2881147c5b4fd067bd68cd7.png

配置externals。由于使用 Vue Cli 3 默认配置,新建出来的项目没有了 build 目录,首先得在项目根目录下,新建 vue.config.js 文件,里面添加以下代码:

module.exports = {
    configureWebpack:{
        externals:{
            'Vue': 'Vue',
            'element-ui': 'element-ui',
            'clipboard':'VueClipboard'
        }
    }
}

预渲染

渲染方式分为三种,客户端渲染,服务端渲染,预渲染。

我们默认的开发方式是通过客户端渲染,但是客户端渲染页面内容,关键链路较长,首屏渲染会有一定延迟,并且对 SEO 非常不友好,对于C端的产品来说,是不可行的。

所以很多公司都会通过服务端渲染(SSR)或是 预渲染的方式来解决这两点问题,由于公司技术栈原因,我们采用预渲染的方式来做优化。

什么是预渲染?

简单说,就是将浏览器解析 javascript  动态渲染页面的这部分工作,在打包阶段就完成了,(只构建了静态数据)换个说法在构建过程中,webpack 通过使用 prerender-spa-plugin 插件生成静态结构的 html

// npm i -D prerender-spa-plugin
 configureWebpack: config => {
   const path = require('path')
   const PrerenderSPAPlugin = require('prerender-spa-plugin')
   config.plugins.push(
     new PrerenderSPAPlugin({
       staticDir: path.join(__dirname, 'dist'),
       routes: ['/'],
       minify: {
         collapseBooleanAttributes: true,
         collapseWhitespace: true,
         keepClosingSlash: true,
         decodeEntities: true,
         sortAttributes: true,
       },
       renderer: new PrerenderSPAPlugin.PuppeteerRenderer({
         renderAfterDocumentEvent: 'render-event',
         renderAfterTime: 5000,
         // headless: false,
       }),
     })
   )
 }

注意:路由模式必须为 history ,如果不设置 history 模式,也能运行和生成文件,每个 index.html 文件的内容都会是一样的。

网络资源优化

Service Worker

ServiceWorker 是运行在浏览器后台进程里的一段 JS,它可以做许多事情,比如拦截客户端的请求、向客户端发送消息、向服务器发起请求等等,其中最重要的作用之一就是离线资源缓存。

ServiceWorker  拥有对缓存流程丰富灵活的控制能力,当页面请求到 ServiceWorker 时,ServiceWorker 同时请求缓存和网络,把缓存的内容直接给用户,而后覆盖缓存,我司已经使用了 ServiceWorker 替换 HTTP缓存策略

8057c46980e4ab7e1205e337b9e62eca.png

注意:需要HTTPS才可以使用 ServiceWorker

http缓存

HTTP 缓存一般分为两类:强缓存(也称本地缓存) 和 协商缓存(也称304缓存)

普通刷新会启用 协商缓存,忽略 强缓存。只有在地址栏或收藏夹输入网址、通过链接引用资源等情况下,浏览器才会启用 强缓存

强缓存(200)

本地缓存是最快速的一种缓存方式,只要资源还在缓存有效期内,浏览器就会直接在本地读取,不会请求服务端。

8a53afd1653d20643e9f620b05c85633.png

协商缓存(304)

协商缓存,顾名思义是经过浏览器与服务器之间协商过之后,在决定是否读取本地缓存,如果服务器通知浏览器可以读取本地缓存,会返回304状态码,并且协商过程很简单,只会发送头信息,不会发送响应体。

b3c6ea53bbfeb5c674aabdd68dbf1630.png

缓存位置

缓存位置一般分为:Memory Cache(内存缓存)和 Disk Cache(硬盘缓存)

内存缓存:读取快、持续时间短、容量小

硬盘缓存:读取慢、持续时间长、容量大

缓存优先级

Service Worker -> Memory Cache -> Disk Cache -> Push Cache

HTTP2

HTTP2 四个新特性:

  • 多路复用,无需多个TCP连接,因为其允许在单一的HTTP2连接上发起多重请求,因此可以不用依赖建立多个TCP连接。
  • 二进制分帧,将所有要传输的消息采用二进制编码,并且会将信息分割为更小的消息块。
  • 头部压缩,用HPACK技术压缩头部,减小报文大小
  • 服务端推送,服务端可以在客户端发起请求前发送数据,换句话说,服务端可以对客户端的一个请求发送多个相应,并且资源可以正常缓存。
server {
    listen 443 ssl http2;
}

注意:使用 http2 的前提是必须是 https。

资源预加载

简单说,提前加载资源,当用户需要查看时可直接从本地缓存中渲染。

总结:对当前页面需要的资源,使用 preload 进行预加载,对其它页面需要的资源进行 prefetch 预加载。

preload

preload 页面加载的过程中,在浏览器开始主体渲染之前加载。




prefetch

prefetch 页面加载完成后,利用空闲时间提前加载。




注意:vue-cli 默认开启 prefetch ,可在 vue.config.js 中全局禁用 prefetch ,再针对指定模块开启。

chainWebpack: config => {
  config.plugins.delete('prefetch')
}

dns-prefetch

页面加载完成后,利用空闲时间提前加载。

"dns-prefetch" href="//example.com">

异步无阻塞加载JS

异步加载 js 文件,并且不会阻塞页面的渲染。

先来看一个普通的 script 标签解析过程。

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

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

相关文章

男人能有什么错呢?

1 这上菜方式厉害了!2 谁上学的时候还没转过笔了!3 和朋友的塑料友情 图自别叫我P图仔4 非洲最致命的猫!传说能撂倒长颈鹿!大家估量一下!5 狗子:你放开我好吗??6 这位小姐姐真的很酷…

LDAP启动cacao提示Invalid file permission

问题处理步骤: 1、LDAP实例停止 2、DSCC控制台启动,提示cacao已停止…… 3、启动caocaorootrusky bin]# ./cacaoadm startInvalid file permission: [/home/ldap/dsee6/cacao_2/etc/opt/sun/cacao/instances/default/security] [rwxrwxr-x]. Problem val…

[019] C#基础:理解装箱与拆箱

.NET大牛之路 • 王亮精致码农 • 2021.08.27前面我们讲到 .NET 平台支持的两大数据类型:值类型和引用类型。值类型比引用类型更高效,因为它没有指针引用,不用分配在托管堆中,也不用被 GC 回收。但有时候你可能偶尔需要将一种类型…

H3C 5510 交换机DHCP设置

DHCP不能发现网络上非DHCP客户机已经在使用的IP地址;当网络上存在多个DHCP服务器时,一个DHCP服务器不能查出已被其它服务器租出去的IP地址;DHCP服务器不能跨路由器与客户机通信,除非路由器允许BOOTP转发。PC发出的广播包&#xff…

opentrace在mysql中使用_采用OpenReplicator解析MySQL binlog

Open Replicator是一个用Java编写的MySQL binlog分析程序。Open Replicator 首先连接到MySQL(就像一个普通的MySQL Slave一样),然后接收和分析binlog,最终将分析得出的binlog events以回调的方式通知应用。Open Replicator可以被应用到MySQL数据变化的实…

雷军:有人说我写的代码像诗一样优雅~

全世界只有3.14 % 的人关注了爆炸吧知识整合整理:程序员的那些事(id:iProgrammer)雷军的代码像诗一样优雅↓↓↓有些网友在评论中质疑,说雷军代码不会是「屎」一样优雅吧。说这话的网友,也许是开玩笑的&…

国外网站评出对程序员最具影响的书籍清单

国外知名网站 stackoverflow 上有一个问题调查: 哪本书是对程序员最有影响、每个程序员都该阅读的书?这个调查已历时两年,目前为止吸引了153,432 人访问,读者共推荐出了 478 本书(还在增加),其中最火的一本书《Code Co…

python大于小于_在Python中大于/小于Pandas DataFrames / Series之间的比较

如何在DataFrame和Series之间进行比较?我想掩盖DataFrame / Series中比其他DataFrame / Series中的元素更大/更小的元素. 例如,以下内容不会替换大于均值的元素 与nans虽然我期待它: >>> x pd.DataFrame(data{a: [1, 2], b: [3, 4]}) >>…

NodeJS学习笔记

通过js创建个简单的web服务器 var httprequire(http); http.createServer(function(req,res){ res.writeHead(200,{Content-Type:text/html}); res.end("server is up!"); }).listen(8000); console.log(listened on 8000); 推荐学习:Node入门 转载于:https://www.cn…

mysql分析日志_MYSQL 索引(三)--- SQL日志分析

慢查询日志Mysql 的慢查询日志是 Myql 提供的一种日志记录,用来记录在 Myql 中响应时间查过阈值的语句,具体指运行时间超过 long_query_time 值的 SQL,则会被记录在日志中。long_query_time 默认为 10,单位为秒。默认情况下&#…

【转】SMIL基础教程(1)

最近公司项目需要使用到smil相关知识,因而专门学习了一下。在网上找到了几篇基础教程,转载以方便查看。一、 简介随着流技术的成熟和广泛的应用,其优点我们有了深深的体会。但是,其不足之处也逐渐体现出来。问题的出现&#xff0c…

C#多线程开发-任务并行库

你好,我是阿辉。正文共2090字,预计阅读时间:6min。之前学习了线程池,知道了它有很多好处。使用线程池可以使我们在减少并行度花销时节省操作系统资源。可认为线程池是一个抽象层,其向程序员隐藏了使用线程的细节&#…

.cue 文件格式

cue文件格式(基础版) PERFORMER "陈小春" TITLE "抱一抱" FILE "陈小春.-.[抱一抱].专辑.(ape).ape" WAVE TRACK 01 AUDIO TITLE "抱一抱" INDEX 01 00:00:00 TRACK 02 AUDIO TITLE "我爱的人…

python切片原理_深度解析Python切片

详解Python 切片语法 Python的切片是特别常用的功能,主要用于对列表的元素取值。使用切片也会让你的代码显得特别Pythonic。 切片的主要声明如下,假设现在有一个list,命名为alist: alist [0,1,2,3,4] 切片语法的基本形式为&#…

为什么数学不好,和语文有关系?

▲ 点击查看苏步青教授在担任复旦大学校长时曾经说过:“如果允许复旦大学单独招生考试,我的意见是第一堂课就考语文,考后就批卷子。不合格的,以下的功课就不要考了。语文你都不行,别的是学不通的。”苏步青作为享誉世界的数学家&a…

Docker 博客

Docker 常用命令:首先推荐:http://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html Docker 网络桥接:http://blog.tankywoo.com/2014/12/22/docker-bridge-network.html docker 大牛的博客:http://blog.csdn.net/smal…

python string length_如何使用python获取字符串长度?哪些方法?

掌握多种python技巧,对于我们更好的灵活应用python是非常重要的,比如接下来给大家介绍的获取字节长度,那大家脑海里就该有印象了,有几种方法呢?一起来看下吧~1、使用len()函数这是最直接的方法。 在这里,我…

二进制、八进制、十进制、十六进制之间转换

一、 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上…

【招聘(北京成都)】北森 招聘.NET 架构师工程师

.net后端架构师 25k-38k14薪工作职责:1.根据业务框架要求,提供技术实现方案;2.负责技术架构选型、并主导功能模块设计、数据结构设计、对外接口设计;3.负责核心技术攻关、系统调优,使系统架构、代码结构不断演进优化;4…

android 网络开发

反复研究了 Android Market,总结一下,之前发在新浪微博上,但不够详细,主要是提高用户体验。 1.网络异常处理,重试机制。 上wifi常常网络断开,那就看运用程序是否健壮。可以用Android 提供的 frameworks/bas…