前端性能优化总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端性能优化总结相关的知识,希望对你有一定的参考价值。
参考技术A gzip压缩gzip压缩效率很高,可以达到70%的压缩率
//npm i -D compression-webpack-plugin 安装插件依赖
configureWebpack: config =>
const CompressionPlugin = require('compression-webpack-plugin')
config.plugins.push(new CompressionPlugin())
去掉console.log
生产环境中,不需要打印日志。通过对webpack进行配置,打包时自动去掉console.log
//npm i -D terser-webpack-plugin
configureWebpack:config =>
const TerserPlugin = require('terser-webpack-pulugin')
config.optimzation.minimizer.push(
new TerserPlugin(
extractComments:false,
terserOptions:compress:drop_console:true //插件配置项 移除console
)
)
去除SourceMap
代码压缩后进行调bug定位将非常困难,于是引入sourcemap记录压缩前后的位置信息记录,当产生错误时直接定位到未压缩前的位置,将大大的方便我们调试。
sourcemap附带了很多信息,如果build需要生成sourcemap,将会大大降低build的速度,还会增加包的体积。
//vue 中
module.exports =
productionSourceMap: false,
//react中
//打开webpack.config.prod.js
const shouldUseSourceMap = false
CDN
内容分发网络,它能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。所以可以通过将资源部署在CDN上来提高响应速度,提高用户体验
预渲染
简单来说,就是将浏览器解析javascript动态渲染的工作,在打包阶段完成了(只构建了静态数据)。换个说法,在构建过程中,webpack通过使用prerender-spa-plugin插件生成静态结构的html
// 1、安装prerender-spa-plugin
npm install prerender-spa-plugin --save-dev
// 2、安装vue-meta-info
npm install vue-meta-info --save-dev
// 3、相关配置
// 预渲染配置:在webpack.prod.conf文件中加入
const PrerenderSPAPlugin = require('prerender-spa-plugin')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
// 在 plugins 中加入
new PrerenderSPAPlugin(
// 生成文件的路径,也可以与webpakc打包的一致。
// 下面这句话非常重要!!!
// 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。
staticDir: path.join(__dirname, '../dist'),
// 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。
routes: ['/', '/first', '/second', '/third', '/fourth', '/userCenter/userFirst','/userCenter/userSecond','/userCenter/userThird'],
// 这个很重要,如果没有配置这段,也不会进行预编译
renderer: new Renderer(
inject:
foo: 'bar'
,
// headless: false,
renderAfterDocumentEvent: 'render-event', // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
args: ['--no-sandbox', '--disable-setuid-sandbox']
)
)
// 4、在main.js中
import MetaInfo from 'vue-meta-info'
new Vue(
el: '#app',
router,
components: App ,
template: '',
// 添加mounted,不然不会执行预编译
mounted ()
document.dispatchEvent(new Event('render-event'))
)
注意:路由模式必须为 history ,如果不设置 history 模式,也能运行和生成文件,每个 index.html 文件的内容都会是一样的
Service Worker
ServiceWorker 是运行在浏览器后台进程里的一段 JS,它可以做许多事情,比如拦截客户端的请求、向客户端发送消息、向服务器发起请求等等,其中最重要的作用之一就是离线资源缓存。
ServiceWorker 拥有对缓存流程丰富灵活的控制能力,当页面请求到 ServiceWorker 时,ServiceWorker 同时请求缓存和网络,把缓存的内容直接给用户,而后覆盖缓存
注意:需要HTTPS才能使用ServiceWorker
HTTP缓存
HTTP缓存一般分为两类:强缓存(本地缓存)、协商缓存(304缓存)
普通刷新会启用协商缓存
在地址栏输入网址、通过链接引入资源等情况下,浏览器才启用强缓存
强缓存(200)。本地缓存是最快速的一种缓存方式,只要资源还在缓存有效期内,浏览器就会直接在本地读取,不会请求服务端。在chrome控制台的Network选项中可以看到该请求返回200的状态码,并且Size显示from disk cache或from memory cache。强缓存可以通过设置两种 HTTP Header 实现:Expires 和 Cache-Control。
协商缓存(304)。协商缓存,顾名思义是经过浏览器与服务器之间协商过之后,在决定是否读取本地缓存,如果服务器通知浏览器可以读取本地缓存,会返回304状态码,并且协商过程很简单,只会发送头信息,不会发送响应体。
协商缓存可以通过设置两种 HTTP Header 实现:Last-Modified 和 ETag
首先在精确度上,Etag要优于Last-Modified
第二在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值
第三在优先级上,服务器校验优先考虑Etag
缓存优先级:Service Worker -> Memory Cache(内存缓存) -> Disk Cache(硬盘缓存) -> Push Cache(推送缓存)
Push Cache 只在会话(session)中存在,会话结束就被释放,而且缓存时间很短
HTTP2
HTTP2 四个新特性:
多路复用,无需多个TCP连接,因为其允许在单一的HTTP2连接上发起多重请求,因此可以不用依赖建立多个TCP连接。
二进制分帧,将所有要传输的消息采用二进制编码,并且会将信息分割为更小的消息块。
头部压缩,用HPACK技术压缩头部,减小报文大小
服务端推送,服务端可以在客户端发起请求前发送数据,换句话说,服务端可以对客户端的一个请求发送多个相应,并且资源可以正常缓存。
。。。。。。。。。。。。。
作者:MonkeySoft
篇幅有限更多请见扩展链接:http://www.mark-to-win.com/tutorial/50671.html
前端知识总结--性能优化
前端性能优化方案大体分为网络传输优化和页面内容优化,
网络方面
1、减少http请求
- 合并js文件
- 合并css文件
- 雪碧图的使用(css sprite)
- 使用base64表示简单的图片
2、减小资源体积
- gzip压缩
- js混淆
- css压缩
- 图片压缩
3、使用缓存
- DNS缓存
- CDN部署与缓存
- http缓存
页面方面
1、优化网页渲染
- css的文件放在头部,js文件放在尾部或者异步
- 尽量避免內联样式
2、DOM操作优化
- 避免在document上直接进行频繁的DOM操作
- 使用classname代替大量的内联样式修改
- 对于复杂的UI元素,设置position为absolute或fixed
- 尽量使用css动画
- 使用requestAnimationFrame代替setInterval操作
- 适当使用canvas
- 尽量减少css表达式的使用
- 使用事件代理
3、操作细节
- 避免图片或者frame使用空src
- 在css属性为0时,去掉单位
- 禁止图像缩放
- 正确的css前缀的使用
- 移除空的css规则
- 对于css中可继承的属性,如font-size,尽量使用继承,少一点设置
- 缩短css选择器,多使用伪元素等帮助定位
以上是关于前端性能优化总结的主要内容,如果未能解决你的问题,请参考以下文章