zoukankan      html  css  js  c++  java
  • webpack 中,webpackPrefetch、webpackPreload 和 webpackChunkName 的区别是什么?

    Webpack 有非常多的概念,很多名词长得都差不多。我把这些分散在文档和教程里的内容总结起来,写了一份 webpack 中的易混淆知识点,目前看是全网独一份,大家可以加个收藏,方便以后检索和学习。

    全集链接 ➡️ webpack 易混淆知识点

    这几个名词其实都是 webpack 魔法注释(magic comments)里的,文档中说了 6 个配置,配置都可以组合起来用。我们说说最常用的三个配置。

    3.1 webpackChunkName

    前面举了个异步加载 lodash 的例子,我们最后把 output.chunkFilename 写死成 bundle.js。在我们的业务代码中,不可能只异步加载一个文件,所以写死肯定是不行的,但是写成 [name].bundle.js 时,打包的文件又是意义不明、辨识度不高的 chunk id

    {
        entry: {
            index: "../src/index.js"
        },
        output: {
            filename: "[name].min.js",  // index.min.js
            chunkFilename: '[name].bundle.js', // 1.bundle.js,chunk id 为 1,辨识度不高
        }
    }
    

    这时候 webpackChunkName 就可以派上用场了。我们可以在 import 文件时,在 import 里以注释的形式为 chunk 文件取别名:

    async function getAsyncComponent() {
        var element = document.createElement('div');
      
        // 在 import 的括号里 加注释 /* webpackChunkName: "lodash" */ ,为引入的文件取别名
        const { default: _ } = await import(/* webpackChunkName: "lodash" */ 'lodash');
    
        element.innerHTML = _.join(['Hello!', 'dynamic', 'imports', 'async'], ' ');
    
        return element;
    }
    

    这时候打包生成的文件是这样的:

    现在问题来了,lodash 是我们取的名字,按道理来说应该生成 lodash.bundle.js 啊,前面的 vendors~ 是什么玩意?

    其实 webpack 懒加载是用内置的一个插件 SplitChunksPlugin 实现的,这个插件里面有些默认配置项,比如说 automaticNameDelimiter,默认的分割符就是 ~,所以最后的文件名才会出现这个符号,这块儿内容我就不引申了,感兴趣的同学可以自己研究一下。

    3.2 webpackPrefetch 和 webpackPreload

    这两个配置一个叫预拉取(Preload),一个叫预加载(Prefetch),两者有些细微的不同,我们先说说 webpackPreload

    在上面的懒加载代码里,我们是点击按钮时,才会触发异步加载 lodash 的动作,这时候会动态的生成一个 script 标签,加载到 head 头里:

    如果我们 import 的时候添加 webpackPrefetch

    ...
    
    const { default: _ } = await import(/* webpackChunkName: "lodash" */ /* webpackPrefetch: true */ 'lodash');
    
    ...
    

    就会以 <link rel="prefetch" as="script"> 的形式预拉取 lodash 代码:

    这个异步加载的代码不需要手动点击 button 触发,webpack 会在父 chunk 完成加载后,闲时加载 lodash 文件。

    webpackPreload 是预加载当前导航下可能需要资源,他和 webpackPrefetch 的主要区别是:

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

    3.3 一句话总结:

    webpackChunkName 是为预加载的文件取别名,webpackPrefetch 会在浏览器闲置下载文件,webpackPreload 会在父 chunk 加载时并行下载文件。




    最后推荐一下我的个人公众号:「卤蛋实验室」,平时会分享一些前端技术和数据分析的内容,大家感兴趣的话可以关注一波:

  • 相关阅读:
    转:CTE(公共表表达式)——WITH子句
    排名函数——ROW_NUMBER()、RANK()、DENSE_RANK()和NTILE(n)
    深层拷贝和浅层拷贝
    Jmeter如何连接数据库Mysql
    java执行cmd命令并获取输出结果
    Java 读取Excel2007 jar包冲突的问题(org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException)
    读写文件
    eclipse报jvm terminated.exitcode=2异常解决办法
    Appium常用的API函数
    自动化生成html报告
  • 原文地址:https://www.cnblogs.com/skychx/p/webpack-webpackChunkName-webpackPreload-webpackPreload.html
Copyright © 2011-2022 走看看