prefetch 和preload_在webpack中使用prefetch/preload

prefetch 和preload_在webpack中使用prefetch/preload这是什么 什么是 prefetch 这种 资源提示 告诉浏览器这是一个在未来可能使用到的资源 浏览器通常会在空闲状态取得这些资源 在取得资源之后搁在 HTTP 缓存以便于实现将来的请求 如果有多个 预请求提示 则会在浏览器空闲时排队执行 当浏览器离开空闲状态时正好在 预请求 资源 那么浏览器会取消任何正在进行中的请求 同时会将部分响应数据放置在缓存中 而在 Header 中继续使用 Content Rang

这是什么?

什么是prefetch?

这种“资源提示” 告诉浏览器这是一个在未来可能使用到的资源。

浏览器通常会在空闲状态取得这些资源,在取得资源之后搁在HTTP缓存以便于实现将来的请求。如果有多个‘预请求提示’则会在浏览器空闲时排队执行。当浏览器离开空闲状态时正好在‘预请求’资源,那么浏览器会取消任何正在进行中的请求(同时会将部分响应数据放置在缓存中,而在Header中继续使用Content-Range字段 )并停止处理‘预请求’队列。

总之:在闲置时获取资源

什么是preload?

这种“资源提示” 告诉浏览器这是一种在这次导航中必须的资源,只是会在之后才会被使用, chrome甚至会在资源加载后3秒没有被使用时打印一个警告

浏览器通常以中等优先级(非布局阻塞)获取此资源。

总之:正常获取,及早发现

为什么Prefetch/Preload有用?

Preload用于更早地发现资源并避免发起类似瀑布一样的请求。 它可以将页面加载降低到2次往返(1. HTML,2。所有其他资源)。 使用它不会花费额外的带宽。

prefetch用于使用浏览器的空闲时间来加速将来的导航。 当用户未执行预期的未来导航时,使用它可能会花费额外的带宽。

代码分割

我们假设您使用webpack构建庞大的应用程序,并通过import()来使用按需加载仅加载用户当前所需的部分。

例如,我们有一个HomePage,其中包含一个LoginButton,这个按钮用于打开一个登录模态框(LoginModal)。 登录之后会跳转到DashboardPage——可能包含其他按钮,但这些按钮不太常见。

为了获得更好的用户体验,你在LoginButton那里使用import(“LoginModal”) 来保持主页的体积达到最小。与之类似的,LoginModal包含import(“DashboardPage”)

现在,这个示例程序被拆分为至少3块:home-chunk,login-chunk,dashboard-chunk。 在初始加载时,只需要加载home-chunk,这会产生很好的用户体验。 但是当用户单击LoginButton时,在LoginModal打开之前会有一段延迟,因为需要加载应用程序的这一部分。 DashboardPage与之类似。

在webpack中使用预请求

新的prefetch功能可以改善这个工作流程。 并且这非常容易。

在LoginButton处,把import(“LoginModal”) 改成 import(/ webpackPrefetch: true / “LoginModal”)

同样的把 import(“DashboardPage”) 改成import(/ webpackPrefetch: true / “DashboardPage”)

这将告诉webpack在父块完成加载时预取(在浏览器空闲时间内)这个按需加载的模块。 在这个例子中:当home-chunk完成加载时,将login-chunk添加到预取队列。 当login-chunk完成加载(实际加载,而不是预取)时,将dashboard-chunk添加到预取队列。

假设home-chunk是一个入口,那么它将会被添加到html文件里。 login-chunk是一个按需加载模块,因此一旦login-chunk加载完成,webpack运行时将负责注入。

用这种方式将会提升用户体验:

当用户访问HomePage时。 这时的用户体验和性能与以前一样。一旦HomePage完成加载,浏览器就会进入空闲状态并开始在后台获取login-chunk。而用户并不会注意到这一点。 假设用户需要一些时间来查找LoginButton,那么预请求将在用户单击按钮之前完成。 当用户单击该按钮时,login-chunk已经位于HTTP缓存中,浏览器仅会花费最少的时间来命中缓存中的数据,那么用户将立即看到LoginModal。 同时,webpack运行时将dashboard-chunk添加到预取队列,因此登录后加载dashboard-chunk也不需要额外的时间。

请注意,用户可能并不总是具有这种即时LoginModal体验。 对LoginButton来说,有许多因素会使chunk重新加载以至于延迟:慢速网络,用户快速点击,在带宽有限的设备上禁用预取,没有预取浏览器支持,块的执行速度非常慢,……

在webpack中使用preload

与import(/ webpackPrefetch:true /“…”)类似,也可以使用import(/ webpackPreload:true /“…”)。 与预取相比,这有很多不同之处:preload的块与父块并行加载。prefetch的块在父块完成之后开始加载。

preload的块具有中等优先级并立即下载。prefetch的块在浏览器空闲时间下载。

preload的块会被父块立即请求。 prefetch的块可能会在将来的任何时间请求

浏览器支持是不同的。

preload这种特性的用例很少见。 如果模块总是立即import()某些内容,则可以使用它。 如果一个组件依赖一个单独块中的大型库,那么这是有意义的。 示例:ChartComponent使用大的ChartingLibrary。 它在使用时显示一个LoadingIndicator并立即导入(/ webpackPreload:true /“ChartingLibrary”)。 当请求使用ChartComponent的页面时,也会通过请求图表库块。 假设页面块较小并且完成得更快,则将使用LoadingIndicator显示页面,直到已经请求的图表库块完成为止。 这将提供一点加载时间,因为它只需要一次往返而不是两次。 特别是在高延迟环境中。

如果使用webpackPreload不当实际上会损害性能,因此要小心使用它。

在考虑预加载与预请求时,您可能需要预请。 但是要注意:此声明与webpack import()有关。 在HTML页面中,您可能需要预加载。

多个prefetch的块

您可以将webpackPrefetch标志添加到任意数量的import(),但请注意所有prefetch的块都会争夺带宽。 它们实际上是排队的,当用户请求它时,真正使用的块可能不会被预取。

当所有块被请求的可能性相同时,这不是一个大问题。 但是当某些块比其他块被访问的可能性更大时,您可能想要控制prefetch的顺序。

幸运的是,我们可以让你满意。 (注意这是一个高级用例。)

您可以传递数字作为值,而不是使用webpackPrefetch:true。 webpack将按您指定的顺序预取块。比如:webpackPrefetch:42将在webpackPrefetch:1之前被预取,它将在webpackPrefetch:true之前被预取,它将在webpackPrefetch:-99999(如z-order)之前被预取。 实际上,true等价于为0。

webpackPreload与之类似,但我不认为您会需要它

常见问题

如果多个import()请求相同的块并且其中一些被预取/预加载怎么办? 预加载胜过预取。 在同一类别中,更高优先级获胜。

如果浏览器不支持预取/预加载怎么办? 它会被浏览器忽略。 webpack不会尝试做任何后备。 不管怎样这都是一个暗示,所以即使是支持它的浏览器也可能会忽略它,如果他们感觉如此。

Prefetch/preload在入口点中不起作用。 有什么问题? webpack运行时只负责按需加载的块的Prefetch/preload。 当在entry chunk中使用预取/预加载时,html会添加标记到HTML。 stats.json在entrypoints[].childAssets中提供了信息

为什么不在每个import()上使用prefetch / preload? 你浪费了很多带宽。 有选择地将它用于很可能被访问的import()也更有益。 不要浪费带宽。

我不需要/想要这个功能。 不使用它的成本是多少? 只有在您的一个按需加载的块中使用此功能时,才会添加运行时代码。 因此,当不使用它时,您不必支付任何开销。

我已经在import()上有一个comment了。 我可以添加多个吗? 是的,要么用单独的comment分开,要么在单独的评论中:import(  /* webpackChunkName: “test”, webpackPrefetch: true */  “LoginModal”)// orimport(  /* webpackChunkName: “test” */  /* webpackPrefetch: true */  “LoginModal”)// spacing optional

我使用rollup构建我的库,并使用import(), 我的库中使用webpack的用户可以从prefetch中获益吗?是的,您可以将webpack魔术注释添加到import()中,rollup将保留注释。 当使用webpack构建它的结果时,它将使用注释。 如果没有使用webpack构建,评论将被minimizers删除。

我不确定是否为特定import()添加预取可以提高性能。 我应该加吗? 最好的衡量标准。 A / B测试。 这里没有一般建议。 它取决于用户访问此应用程序路径的概率。

我已经有一个service worker,可以在加载时缓存整个应用程序。 使用预取对我有意义吗? 这取决于您的应用程序。 通常,这种service worker无顺序加载应用程序的所有资产,而预取允许指定顺序并依赖于用户在应用程序中的实际位置。 预取也可以提高带宽效率,并且只能在浏览器空闲时下载。 与第一次用户导航发生时相比,测量在低带宽环境中下载整个应用程序所需的时间。 在大型应用程序中,使用预取代替是有意义的。

我想将初始页面加载拆分为关键资源和非关键资源,并按此顺序加载它们。 预加载有帮助吗? 是的,您可以将关键资源放入入口点,将非关键资源放在import(/webpackPreload:true/)之后。 注意不要忘记为entry chunk 添加(在子标记之前)。

译文出处:https://www.zcfy.cc/article/link-rel-prefetch-preload-in-webpack

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222124.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:31
下一篇 2026年3月17日 下午4:31


相关推荐

  • AI技术解读:Openclaw(AI龙虾)是什么?及其端侧AI对存储要求的提升O

    AI技术解读:Openclaw(AI龙虾)是什么?及其端侧AI对存储要求的提升O

    2026年3月13日
    2
  • STM32CubeMX学习笔记(26)——SDIO接口使用(读写SD卡)

    STM32CubeMX学习笔记(26)——SDIO接口使用(读写SD卡)一、SDIO简介SD卡(SecureDigitalMemoryCard)在我们生活中已经非常普遍了,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI接口,另外一种就是SDIO接口。SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SDI/O卡都有SDIO接口。MMC卡可以说是SD卡的前身,现阶段已经用得很少。STM32F10x系列控制器有一个SDIO主机接口,它可以与MMC卡、SD卡、SDI/O卡以及CE-A

    2022年10月3日
    7
  • ubuntu安装 gcc 5.4.0

    ubuntu安装 gcc 5.4.0ubuntu安装gcc5.4版本Ubuntu高版本如何安装低版本GCC更改默认版本

    2022年7月24日
    23
  • 全源最短路 Johnson算法

    全源最短路 Johnson算法转载请说明出处

    2026年3月18日
    2
  • JAVA实现QQ登录、注册等功能

    JAVA实现QQ登录、注册等功能本文主要应用的技术有:GUI、JDBC、多线程实现的功能具体如下:1、登录功能2、注册功能3、是否隐藏密码的选择以及实现功能4、选择性别功能5、密码与确认密码功能6、登录页面实时展示当前的时间7、当登录时用户名与密码在数据库中没有相匹配的数据,则会跳转到注册页面上去。8、同样,注册完毕后,数据会运用JDBC将数据写入数据库中,然后跳转回登录页面。…

    2022年8月10日
    7
  • python怎么把字体调大_python修改字体

    python怎么把字体调大_python修改字体Pycharm4.5是一款非常强大的Python代码编辑器,其具备了易于上手、功能强大等特点,深受广大开发人员的青睐,而在使用的过程中,我们常常需要设置字体的大小以及背景颜色等参数,从而能够为用户带来更好的代码编辑效果,而部分刚入手的用户可能还不知到如何进行设置,小编这里为用户带来了Pycharm4.5设置字体大小与背景颜色的操作操作教程,有需要的用户赶紧来了解一下吧,想必能够为用户带来帮助!方法…

    2022年8月26日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号