javascript资源预加载性能优化需知~前端事务所

本文主要介绍前端性能优化中的资源预加载,不仅会介绍常规的一些预加载手段;还会介绍工程实践中的应用。

涉及内容:

前言

1.常规做法

1)async/defer:无阻塞加载

defer:DOMContentLoaded事件触发前执行;在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行,因此最好只包含一个延迟脚本;

async:加载完立即执行,无法控制执行时机和执行顺序。适用于无依赖的外部独立资源。

不足:仅限于脚本资源;执行时机不可控或存在执行顺序问题,用于非关键资源。

2)使用ajax加载资源:可以实现预加载。

不足:优先级较低,无法对首屏资源提前加载。

原始解析做法:

采用预解析(扫描)器:

不足:

-仅限解析HTML中收集到的外链资源,对JS异步加载的资源无法提前收集。

-未暴露类似于Preload的onload事件。

资源推送:

特点:多页面共享pushcache(动态数据json除外)

适用场景:如果不推送这个资源,浏览器就会请求这个资源。

需要注意:要确保没有发起不必要的推送,浪费流量。可以使用preload标签代替,或者在HTTP头中加nopush属性。

Tips:如果服务器或者浏览器不支持HTTP/2,那么浏览器就会按照preload来处理这个头信息,预加载指定的资源文件。

-Edge和Safari的支持不好,慎用;

-如果浏览器不从pushcache中获取资源,推送反而不利于网页性能;

-只能推送不带请求体的GET和HEAD请求;

-pushcache中的资源只能使用一次;

-不考虑客户端的缓存,始终推送:

-只对第一次访问的用户开启服务器推送;

-保守起见,推送原本内联的资源,这样即使多推,也比内联效果好点;

-将资源文件的缓存状态更新至客户端的Cookie。

-仅能推送同源资源;

-pushcache:只在会话中存在,一旦会话结束就会被释放;

-无load/error事件

【问题】

1)动态资源的提前推送,注意参数需固定,不带随机变量的;

2)服务端渲染(直出同构)

比如node层模板渲染时,将同步接口中拉取的数据同步数据先缓存起来,如挂载在window._data,使用时直接从全局变量上读取。

好了,上面介绍了一些常用的预加载方法,下面主角登场~

preload和prefetch

概念

preload

prefetch

首次渲染时不需要,之后可能需要。优先级较低,在浏览器空闲时才会下载。使用场景:比如当前页可能跳转的页面,或者条件加载的资源。

特点

-preload的资源存储在内存缓存中(没有设置资源的缓存策略时);

-下载但不执行;

-异步加载,不影响当前页面的渲染;

-提前加载资源,在真正使用时,直接从从缓存中读取;

-使用场景

-当分析当前页面用户高频点击的链接,分析提取跳转页上的资源,使用prefetch预加载。

-font字体文件的预加载由于字体文件必须等到CSSOM构建完成并且作用到页面元素了才会开始加载,会导致页面字体样式闪动。而浏览器为了避免FOUT,会尽量等待字体加载完成后,再显示应用了该字体的内容,会导致加载完成前显示空白。

检测prelaod和prefetch的支持情况

let{relList}=document.createElement('link');returnrelList&&relList.supports&&relList.supports('preload');如何使用

不同值表明资源类型,对应的优先级不同:style,script,image,media,document,font。(问题:官方说法:不带“as”属性的preload的优先级将会等同于异步请求。测试后发现不写as并没有发请求。)

注意事项

-造成二次下载

-同一资源分别使用as='style'和as='script'预加载,会造成二次下载;

-prefetch和preload同时对同一资源使用,会造成二次下载;

-实际是script脚本,但使用as='style'会造成二次下载;

-preload字体时不带crossOrigin(默认指定anonymous匿名,不带认证信息),同样会造成二次下载preload字体时即使同域也需要带crossOrigin,否则同样会造成二次下载;Requestswithoutcredentialsuseaseparateconnection。

-没有使用preload资源,Chrome会在onload事件3s后做出警示,避免无效的优化,浪费流量。

-浏览器对同一域名有并行加载数限制,因此考虑域名拆分等优化。

实践

背景知识

//若支持preload,异步下载完不会立即执行//下载完立即应用到DOM树//异步下载,只有打印的时候才会应用,不符合则不会应用,因此不会阻塞渲染polyfill实现思路

参见loadCSS,提供了css的preload的polyfill实现(只展示关键代码):

适用于对于首页无关的样式:

由于preload能够异步加载样式,因此可以避免在加载首页无关样式时阻塞初始渲染。

对于首页初始渲染中重要的样式:

1)内联(注意,会将静态资源的缓存策略与页面的缓存策略捆绑)

2)HTTP/2的serverPush

“知道了preload和prefetch的用途,那如何结合项目实践呢?由于webpack目前基本是项目必备,所以首先介绍结合webpack的使用;然后对quiklink进行简单介绍。”

结合webpack的实践

1.使用插件:PreloadWebpackPlugin

常用的配置如下:

newPreloadWebpackPlugin({//preloadorprefetch方式rel:'',/**即中的as,表明资源类型,不同的类型决定了不同的执行优先级*比如:script的优先级大于style*/as:'',//排除的html页面集合,即只关联要配置的页面excludeHtmlNames:[],//所关联页面需要使用preload或prefetch的资源include:[]})其中include的两种使用:

1)根据chunk类型进行处理:

include:'asyncChunks'|'initial'|'allChunks'asyncChunks:import()动态导入的模块,可以使用prefetch方式异步加载模块;

initial:初始化需要的模块;

allChunks:处理所有模块(asyncChunks&initial)。

2)对已知命名的chunk,可以更精确的使用数组的方式配置需要使用的chunk

include:['vendor','index']注意事项

1)需要结合HtmlWebpackPlugin插件使用

2)必须放到HtmlWebpackPlugin后面,因为PreloadWebpackPlugin需要使用其提供的hook钩子将构造的插入html中:

plugins:[newHtmlWebpackPlugin(),newPreloadWebpackPlugin()]使用效果

对某个页面中include的资源,最终会在对应页面head中插入link标签:

2.结合import()

好处:拆分chunk,减少首屏js体积。

如果工程没有使用HtmlWebpackPlugin,可以对动态导入的资源做如下处理:

import(/*webpackPrefetch:true*/)import(/\*webpackPreload:true\*/)【版本限制】需webpackv4.6.0+才支持预取和预加载。本地测试后,发现prefetch可用,preload无效。

quiklink

旨在成为根据用户viewport中的链接预取内容的简易解决方案。

工作原理

1)IntersectionObserver(交叉观察器):检测当前视口的links

lettarget=document.getElementById('a');io=newIntersectionObserver(entries=>{},{threshold:[1]//交叉区域为1时会触发callback});io.observe(target);【备注】常规的主要是通过getBoundingClientRect()获取元素在视口中的详细位置,来实现滚动加载以及吸附等功能。

2)requestIdleCallback:等到浏览器空闲时;

注意其和requestAnimationFrame的区别.

3)检查当前的网络环境:

navigator.connection.effectiveType//4G、2G...;

4)提供了多种方式预取链接

工作流程:

1)浏览器空闲时,获取页面所有a标签的链接links;

2)使用IntersectionObserver对link进行监听;

3)在视口区的link,使用prefetch下载;

4)判断当前网络状况,若使用的是2G或者开启了省流模式(data-saver),则不做处理。

data-saver:Theusermayenablesuchpreference,ifmadeavailablebytheuseragent,duetohighdatatransfercosts,slowconnectionspeeds,orotherreasons.

题外话:prefetch有点偷流量的意思,用户想看什么才消耗对应资源产生的流量,而prefetch则会擅自做主,偷偷下载很多可能并不需要的资源(在早前流量特贵的时候这么做,估计会被骂...)

使用说明

总结

综合来看,PreloadWebpackPlugin更适合对chunk而非html文件的处理;而quikLink更适合博客类的网站,或者服务端渲染的页面,这样才能实现"秒开"的预期效果。

THE END
1.外贸网络推广服务是指什么?环球资源的好处是什么?环球资源的好处是什么? 外贸网络推广服务的出现使企业可以通过互联网进行海外营销活动,实现产品销售。这种方式不仅可以节省大量的人力物力,而且还可以提高企业的竞争力。接下来我们就来看一下外贸网络推广服务是指什么吧! 外贸网络推广服务是指什么? 外贸网络推广服务是指为企业提供国际市场营销策划、网络广告设计制作、https://www.supplier-globalsources.com/syp/zh/news/details_91910/
2.互联网发展的优劣势分别是什么,关系我们的生活必须了解中国网络综上所述,中国互联网发展在规模、综合实力、基础设施等方面具有显著的优势,但也面临着网络安全、内容审核、国际竞争和创新能力等方面的挑战。未来,中国互联网需要进一步加强技术研发和创新能力,提高网络安全和内容审核能力,以应对这些挑战并保持持续发展的态势。https://www.163.com/dy/article/J2J8PRH305378UQL.html
3.浅谈教育技术资源论文(通用8篇)浅谈教育技术资源论文 篇1 【摘要】 随着科学技术的飞速发展,教育技术资源发展令世人惊叹,在现代教育中它们的优越性表现得越来越突出。本文从阐述了硬件资源、潜件资源、软件资源、网络资源、课件资源、积件资源、数据通信在教学中的应用以及这些教育技术资源之间的相互关系。 https://www.unjs.com/lunwen/jiaoyu/20181219044054_1811165.html
4.护苗网络安全主题班会(精选8篇)1、使学生明白沉溺网络的危害性,让学生通过参与,从思想上彻底认识到远离网络游戏和不健康网站等不良内容的必要性。 2、使学生认识到,作为一名合格大学生,处在当今的网络时代,我们应该利用网络资源,促进我们的学习,提高自身素质。 3、使学生注意到我们应该如何遵守网络道德,做文明上网的现代人。 https://www.ruiwen.com/word/humiaowangluoanquanzhutibanhui.html
5.有关网络的英语作文6篇(全文)一、句容教育网络资源库资源上传、下载 1.登陆“句容教育”网 句容教育——教育资源——浙大网络资源库——登陆(点击黄色的脸谱),需要选择单位,填写用户名及密码——资源中心(左上角)——选择“我的上传资源”——点击“新建资源”,进入上传对话框,开始进行具体操作。 https://www.99xueshu.com/w/file1r72ugt7.html
6.资源共享的好处爱问知识人让更多的人能够使用到这些资源,从而达到节约资源、提高效率的目的。资源共享的好处是非常多的,下面我们https://iask.sina.com.cn/b/new2DJyDXPtROl.html
7.什么是网络安全网格,它如何增强网络安全?拥有网络安全网格可为企业带来诸多好处。 1.处理IAM请求 如前所述,IAM是CSMA的关键组件,特别是在分布式身份结构层。简而言之,IAM是指用于管理和保护网络资源和数据访问的流程和技术。 部署网络安全网格后,可以简化和自动化许多IAM任务,例如用户配置和取消配置。这可以帮助企业更高效地管理和保护对网络资源和数据的访问https://www.51cto.com/article/786421.html
8.(未排版)华为网络大赛云数据中心与虚拟化而云数据中心是按照分钟提供资源,他能够很好的将那些不用的资源共享给新的业务使用。资源的利用率高达60%以上。换言之,就是云数据中心可以实现企业级的资源共享,资源共享的好处就是把那些闲置的被浪费的,资源利用率低的重复利用起来。 【可扩展性方面】: https://www.jianshu.com/p/69059e064c1d
9.线上教学平台运行总结(通用15篇)认真钻研教材,把握重难点,搜集优秀网络授课资源、微课、PPT课件,线上推送网站“新世纪小学数学”、“国家中小学网络云课堂”,结合教材在授课前一天推送微课等学习资料,加强了学生预习的针对性。 3.精心研磨,开展多样化教学 实施“停课不停学”,跟学生在校学习有着根本的不同,缺少了与学生面对面地交流互动,教师难以随https://m.oh100.com/kaoshi/jiaoxuezongjie/646722.html
10.分布式对象存储——原理架构及Go语言实现分布式存储的好处 传统的高端服务器性能强劲、成本高昂,以前只有大公司用来搭建自己的私有存储。互联网生态下的云存储则用数量弥补质量,以大量低成本的普通PC服务器组成网络集群来提供服务。相比传统的高端服务器来说,同样价格下分布式存储提供的服务更好、性价比更高,且新节点的扩展以及坏旧节点的替换更为方便。 https://www.epubit.com/bookDetails?id=N35229
11.ActiveDirectory与域服务,介绍,安装腾讯云开发者社区轻型目录服务(Lightweight Directory Service,简称LDS)是一项MicrosoftWindows Server技术,用于管理网络资源和用户帐户。 它可以被视为一个附加组件,扩展了Active Directory Domain Services(AD DS)的功能。LDS提供了一个独立的目录服务,可以提供LDAP(轻型目录访问协议)基础结构,以便使用者能够查询和编辑共享目录。 https://cloud.tencent.com/developer/article/2345042
12.网络新闻的特点(精选十篇)传统纸媒由于版面、技术原因的限制, 只能提供正文本身的信息, 相对比较枯燥单一。而网络媒体则不同, 它不仅能提供正文的信息, 而且也能融合不同的资源, 比如视频等;网络媒体还能包含新闻所属的类别, 并提供对应的链接, 便于读者浏览;另外, 复合型的标题可以提供新闻更多相关的信息, 提供更为深度的阅读。 https://www.360wenmi.com/f/cnkeyd1yuekq.html
13.农村学前教育论文(通用11篇)(3)自考助学机构在教学上缺少科研与合作,专职教师几乎不做科研,没有仔细研究自学考试教学规律,缺少对教育教学改革的思考,有些问题仅采用传统的面授形式无法在短期内解决,且经济投入较大。自考学前教育专业网络资源库的建设,学生可以随时分散学习,弥补以上不足,帮助学生在课外更深入地自行学习。 https://www.fwsir.com/jy/html/jy_20140804111236_272430.html
14.多媒体教学心得体会(通用20篇)总之,在今后的工作中,我一定会更加努力,将所学到的知识充分应用于教育教学的实践中,不断探索,不断实践,为学校现代教育技术水平的提高,为在多媒体环境下的教学设计与资源应用的进一步发展,作出自己的贡献。 多媒体教学心得体会 2 对于教师来说,“公开课”和“示范课”都已经耳熟能详了,而且已经开始走向网络教育教学http://mip.yuwenmi.com/fanwen/xinde/3870221.html
15.04教学设计(中医内科护理)感冒中内护教学运行与管理辨证施护部分,高热患者使用温水擦浴时,通过对分易网络平台分享相关学习资源给学生。课后查看学习资料。对分易网络平台分享温水擦浴方法学习资源给学生,使学生领会操作过程。在讲解解表药时,播放微课视频。观看视频,记录用药护理的重要知识点。微课视频通过网络信息资源,使学生较为直观地掌握解表药的用药护理。 三、巩固https://www.gxtcmu.edu.cn/hlxy/jysjs/zyhljys/jxyhygl1/znh/content_38764