国家住房城乡建设部网站,南京市企业展厅设计公司,网站里添加聊天框怎么做,知乎 网站建设一、什么是首屏加载
首屏时间#xff08;First Contentful Paint#xff09;#xff0c;指的是浏览器从响应用户输入网址地址#xff0c;到首屏内容渲染完成的时间#xff0c;此时整个网页不一定要全部渲染完成#xff0c;但需要展示当前视窗需要的内容
首屏加载可以说…
一、什么是首屏加载
首屏时间First Contentful Paint指的是浏览器从响应用户输入网址地址到首屏内容渲染完成的时间此时整个网页不一定要全部渲染完成但需要展示当前视窗需要的内容
首屏加载可以说是用户体验中最重要的环节
关于计算首屏时间
利用performance.timing提供的数据 通过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首屏优化方式
减小入口文件积静态资源本地缓存UI框架按需加载图片资源的压缩组件重复打包开启GZip压缩使用SSR
减小入口文件体积
常用的手段是路由懒加载把不同路由对应的组件分割成不同的代码块待路由被请求的时候会单独打包路由使得入口文件变小加载速度大大增加 在vue-router配置路由的时候采用动态加载路由的形式
routes:[ path: Blogs,name: ShowBlogs,component: () import(./components/ShowBlogs.vue)
]以函数的形式加载路由这样就可以把各自的路由文件分别打包只有在解析给定的路由时才会加载路由组件
静态资源本地缓存
后端返回资源问题 采用HTTP缓存设置Cache-ControlLast-ModifiedEtag等响应头 采用Service Worker离线缓存
前端合理利用localStorage
UI框架按需加载
在日常使用UI框架例如element-UI、或者antd我们经常性直接引用整个UI库
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文件这就造成了重复下载
解决方案在webpack的config文件中修改CommonsChunkPlugin的配置
minChunks: 3minChunks为3表示会把使用3次及以上的包抽离出来放进公共依赖文件避免了重复加载组件
图片资源的压缩
图片资源虽然不在编码过程中但它却是对页面性能影响最大的因素
对于所有的图片资源我们可以进行适当的压缩
对页面上使用到的icon可以使用在线字体图标或者雪碧图将众多小图标合并到同一张图上用以减轻http请求压力。
开启GZip压缩
拆完包之后我们再用gzip做一下压缩 安装compression-webpack-plugin
cnmp i compression-webpack-plugin -D在vue.congig.js中引入并修改webpack配置
const CompressionPlugin require(compression-webpack-plugin)configureWebpack: (config) {if (process.env.NODE_ENV production) {// 为生产环境修改配置...config.mode productionreturn {plugins: [new CompressionPlugin({test: /\.js$|\.html$|\.css/, //匹配文件名threshold: 10240, //对超过10k的数据进行压缩deleteOriginalAssets: false //是否删除原文件})]}}在服务器我们也要做相应的配置 如果发送请求的浏览器支持gzip就发送给它gzip格式的文件 我的服务器是用express框架搭建的 只要安装一下compression就能使用
const compression require(compression)
app.use(compression()) // 在其他中间件使用之前调用使用SSR
SSRServer side 也就是服务端渲染组件或页面通过服务器生成html字符串再发送到浏览器
从头搭建一个服务端渲染是很复杂的vue应用建议使用Nuxt.js实现服务端渲染
小结
减少首屏渲染时间的方法有很多总的来讲可以分成两大部分 资源加载优化 和 页面渲染优化
下图是更为全面的首屏优化的方案 大家可以根据自己项目的情况选择各种方式进行首屏渲染的优化
参考文献
https://zhuanlan.zhihu.com/p/88639980?utm_sourcewechat_sessionhttps://www.chengrang.com/how-browsers-work.htmlhttps://juejin.cn/post/6844904185264095246https://vue3js.cn/docs/zh