We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
首屏时间(First Contentful Paint),指的是浏览器从响应用户输入网址地址,到首屏内容渲染完成的时间,此时整个网页不一定要全部渲染完成,但需要展示当前视窗需要的内容
首屏加载可以说是用户体验中最重要的环节
利用performance.timing提供的数据:
performance.timing
通过DOMContentLoad或者performance来计算出首屏时间
DOMContentLoad
performance
// 方案一: document.addEventListener('DOMContentLoaded', (event) => { console.log('first contentful painting'); }); // 方案二: performance.getEntriesByName("first-contentful-paint")[0].startTime // performance.getEntriesByName("first-contentful-paint")[0] // 会返回一个 PerformancePaintTiming的实例,结构如下: { name: "first-contentful-paint", entryType: "paint", startTime: 507.80000002123415, duration: 0, };
在页面渲染的过程,导致加载速度慢的因素可能如下:
常见的几种SPA首屏优化方式
常用的手段是路由懒加载,把不同路由对应的组件分割成不同的代码块,待路由被请求的时候会单独打包路由,使得入口文件变小,加载速度大大增加
在vue-router配置路由的时候,采用动态加载路由的形式
vue-router
routes:[ path: 'Blogs', name: 'ShowBlogs', component: () => import('./components/ShowBlogs.vue') ]
以函数的形式加载路由,这样就可以把各自的路由文件分别打包,只有在解析给定的路由时,才会加载路由组件
后端返回资源问题:
采用HTTP缓存,设置Cache-Control,Last-Modified,Etag等响应头
HTTP
Cache-Control
Last-Modified
Etag
采用Service Worker离线缓存
Service Worker
前端合理利用localStorage
localStorage
在日常使用UI框架,例如element-UI、或者antd,我们经常性直接引用整个UI库
UI
element-UI
antd
import ElementUI from 'element-ui' Vue.use(ElementUI)
但实际上我用到的组件只有按钮,分页,表格,输入与警告 所以我们要按需引用
import { Button, Input, Pagination, Table, TableColumn, MessageBox } from 'element-ui'; Vue.use(Button) Vue.use(Input) Vue.use(Pagination)
假设A.js文件是一个常用的库,现在有多个路由使用了A.js文件,这就造成了重复下载
A.js
解决方案:在webpack的config文件中,修改CommonsChunkPlugin的配置
webpack
config
CommonsChunkPlugin
minChunks: 3
minChunks为3表示会把使用3次及以上的包抽离出来,放进公共依赖文件,避免了重复加载组件
minChunks
图片资源虽然不在编码过程中,但它却是对页面性能影响最大的因素
对于所有的图片资源,我们可以进行适当的压缩
对页面上使用到的icon,可以使用在线字体图标,或者雪碧图,将众多小图标合并到同一张图上,用以减轻http请求压力。
icon
http
拆完包之后,我们再用gzip做一下压缩 安装compression-webpack-plugin
gzip
compression-webpack-plugin
cnmp i compression-webpack-plugin -D
在vue.congig.js中引入并修改webpack配置
vue.congig.js
const CompressionPlugin = require('compression-webpack-plugin') configureWebpack: (config) => { if (process.env.NODE_ENV === 'production') { // 为生产环境修改配置... config.mode = 'production' return { plugins: [new CompressionPlugin({ test: /\.js$|\.html$|\.css/, //匹配文件名 threshold: 10240, //对超过10k的数据进行压缩 deleteOriginalAssets: false //是否删除原文件 })] } }
在服务器我们也要做相应的配置 如果发送请求的浏览器支持gzip,就发送给它gzip格式的文件 我的服务器是用express框架搭建的 只要安装一下compression就能使用
express
compression
const compression = require('compression') app.use(compression()) // 在其他中间件使用之前调用
SSR(Server side ),也就是服务端渲染,组件或页面通过服务器生成html字符串,再发送到浏览器
从头搭建一个服务端渲染是很复杂的,vue应用建议使用Nuxt.js实现服务端渲染
vue
Nuxt.js
减少首屏渲染时间的方法有很多,总的来讲可以分成两大部分 :资源加载优化 和 页面渲染优化
下图是更为全面的首屏优化的方案
大家可以根据自己项目的情况选择各种方式进行首屏渲染的优化
The text was updated successfully, but these errors were encountered:
No branches or pull requests
面试官:SPA首屏加载速度慢的怎么解决?
一、什么是首屏加载
首屏时间(First Contentful Paint),指的是浏览器从响应用户输入网址地址,到首屏内容渲染完成的时间,此时整个网页不一定要全部渲染完成,但需要展示当前视窗需要的内容
首屏加载可以说是用户体验中最重要的环节
关于计算首屏时间
利用
performance.timing
提供的数据:通过
DOMContentLoad
或者performance
来计算出首屏时间二、加载慢的原因
在页面渲染的过程,导致加载速度慢的因素可能如下:
三、解决方案
常见的几种SPA首屏优化方式
减小入口文件体积
常用的手段是路由懒加载,把不同路由对应的组件分割成不同的代码块,待路由被请求的时候会单独打包路由,使得入口文件变小,加载速度大大增加
在
vue-router
配置路由的时候,采用动态加载路由的形式以函数的形式加载路由,这样就可以把各自的路由文件分别打包,只有在解析给定的路由时,才会加载路由组件
静态资源本地缓存
后端返回资源问题:
采用
HTTP
缓存,设置Cache-Control
,Last-Modified
,Etag
等响应头采用
Service Worker
离线缓存前端合理利用
localStorage
UI框架按需加载
在日常使用
UI
框架,例如element-UI
、或者antd
,我们经常性直接引用整个UI
库但实际上我用到的组件只有按钮,分页,表格,输入与警告 所以我们要按需引用
组件重复打包
假设
A.js
文件是一个常用的库,现在有多个路由使用了A.js
文件,这就造成了重复下载解决方案:在
webpack
的config
文件中,修改CommonsChunkPlugin
的配置minChunks: 3
minChunks
为3表示会把使用3次及以上的包抽离出来,放进公共依赖文件,避免了重复加载组件图片资源的压缩
图片资源虽然不在编码过程中,但它却是对页面性能影响最大的因素
对于所有的图片资源,我们可以进行适当的压缩
对页面上使用到的
icon
,可以使用在线字体图标,或者雪碧图,将众多小图标合并到同一张图上,用以减轻http
请求压力。开启GZip压缩
拆完包之后,我们再用
gzip
做一下压缩 安装compression-webpack-plugin
在
vue.congig.js
中引入并修改webpack
配置在服务器我们也要做相应的配置 如果发送请求的浏览器支持
gzip
,就发送给它gzip
格式的文件 我的服务器是用express
框架搭建的 只要安装一下compression
就能使用使用SSR
SSR(Server side ),也就是服务端渲染,组件或页面通过服务器生成html字符串,再发送到浏览器
从头搭建一个服务端渲染是很复杂的,
vue
应用建议使用Nuxt.js
实现服务端渲染小结:
减少首屏渲染时间的方法有很多,总的来讲可以分成两大部分 :资源加载优化 和 页面渲染优化
下图是更为全面的首屏优化的方案
大家可以根据自己项目的情况选择各种方式进行首屏渲染的优化
参考文献
The text was updated successfully, but these errors were encountered: