ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Webpack之prefetch和preload

2019-08-29 13:40:56  阅读:314  来源: 互联网

标签:preload chunk js Webpack prefetch click 加载


文章目录

引入

所有新技术的出现都是为了解决现有的问题或者是旧技术没法解决的问题。prefetch和preload也是如此。

现在有两个问题:

  • 首先,代码的懒加载固然能是首页加载的速度变快,可是相应的,待到用户与页面交互再加载交互相关代码会使得用户首次交互的体验不佳(长时间没有对操作进行响应)。
  • 其次,在SplitChunksPlugin的默认配置中,chunks字段默认是为async的。也就是说,Webpack官方是希望我们使用异步的方式来进行模块的加载的。

这就导出了一个新的问题,异步加载模块是Webpack官方所希望开发者实现的,而且异步加载也能提升首页加载速度,但是又会导致异步加载的那部分代码逻辑迟迟不能执行,可能导致用户的交互长时间没有响应。

这个时候就需要prefetchpreload了。

例子

新创建一个click.js

export default () => {
    const ele = document.createElement('div');
    ele.innerText = 'Meskjei';
    document.body.appendChild(ele);
}

然后在index.js中:

document.addEventListener('click', async (e)=>{
    const { default: func } = await import('./click');
    func();
});

这其实其实才是Webpack官方希望我们写的代码,这样在首页加载的时候不必加载click.js
在这里插入图片描述

可以看出,页面在加载的时候仅加载了main.js而没有加载click.js。(打包后为0.js

而点击页面之后,click.js便进行了加载。

在这里插入图片描述

前面提到过,这样做是可能会让用户的交互长时间没有响应的。原因就是待到交互时才进行模块的加载,可能时间会比较长。由此,我们引入prefetch,即预取。

所谓预取,就是提前获取将来可能会用到的资源prefetch chunk会在父chunk加载完成之后进行加载。

那么该怎么做呢?我们要通过一种称作Magic Comment(魔法注释)的方式,让Webpack输出"resource hint(资源提示)",来告知浏览器。

在这个例子中就是:

然后在index.js中:

document.addEventListener('click', async (e)=>{
    const { default: func } = await import(/* webpackPrefetch: true */'./click');
    func();
});

这样写完之后,重新打包刷新页面,可以看到在index.js加载完成之后,浏览器又会去自动加载click.js(0.js)

在这里插入图片描述

实际上这样做,Webpack替我们在head内添加了这样一行:

<link rel="prefetch" as="script" href="0.js">

preload和prefetch在用法上相差不大,效果上的差别如下(引自官方文档):

  • preload chunk 会在父 chunk 加载时,以并行方式开始加载。prefetch chunk 会在父 chunk 加载结束后开始加载。
  • preload chunk 具有中等优先级,并立即下载。prefetch chunk 在浏览器闲置时下载。
  • preload chunk 会在父 chunk 中立即请求,用于当下时刻。prefetch chunk 会用于未来的某个时刻。
  • 浏览器支持程度不同。

标签:preload,chunk,js,Webpack,prefetch,click,加载
来源: https://blog.csdn.net/hjc256/article/details/100135886

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有