zoukankan      html  css  js  c++  java
  • webpack动态加载打包chunk命名

    1 使用Webpack如何做按需加载

    大家都知道Webpack是现在流行的前端打包编译工具,通过模块之间的依赖关系,将代码打包组织到一起。Webpack目前已经到v4.x,不同版本版支持按需加载的方式不同,主要有两种:

    • webpack1.x 中提供了 require.ensure()
    • webpack2.x 中提供了 import()

    require.ensure()

    // 举例
    require.ensure([], function(require){
        require('b');
    });

    webpack 在编译时,会静态地解析代码中的 require.ensure(),同时将[模块b] 添加到一个分开的 chunk 当中。这个新的 chunk 会被 webpack 通过 jsonp 来按需加载。

    为什么说到是静态分析,我们可以看到下面的require.ensure语法,第二个参数callback就是一个回调函数。其中需要注意的是,这个回调函数有一个参数require,通过这个require就可以在回调函数内按需引入其他模块。值得注意的是,虽然这个require是回调函数的参数"module",理论上可以换其他名称,但是实际上是不能换的,否则webpack就无法静态分析的时候处理它。

    require.ensure(
        dependencies: String[],
        callback: function(require){
            require('module');
        },
        errorCallback: function(error){},
        chunkName: String
    )

    import()

    要注意的是import() 函数不同于import命令,import 是 ECMAScript 6 Module 的语法,import 是静态执行,这里不多说,可以去看import 命令。

    import(specifier)

    上面代码中,import函数的参数specifier,指定所要加载的模块的位置,而且specifier可以是一个方法,动态的生成模块路径。import命令能够接受什么参数,import()函数就能接受什么参数,两者区别主要是后者为动态加载。

    import()函数是 ECMAScript Stage 3 草案阶段的语法;用于完成动态加载即运行时加载,可以用在任何地方。import()函数 返回的是一个 Promise。类似于 Commonjs 的 require() ,区别主要是前者是异步加载,后者是同步加载。

    import的应用场景有以下三种 (参考自ECMAScript 6 入门):

    1. 按需加载。import()可以在需要的时候,再加载某个模块
    2. 条件加载。import()可以放在if代码块,根据不同的情况,加载不同的模块。
    3. 动态的模块路径。import()允许模块路径动态生成。

    用法大致如下:

    import('./myModule.js')
        .then(myModule => {
         console.log(myModule.default);
    });

    资源搜索网站大全 https://www.renrenfan.com.cn 广州VI设计公司https://www.houdianzi.com

    小结

    目前我们用的比较多的是import来做按需加载,模块路径可以动态生成,更适合现在的应用场景。

     

    filename和chunkFilename的区别

    能够打包之后,我们会发现打包出来的chunk的路径和命名是极其简单的1,2,3...这样子的数字,对于我们要定制路径和名字的话,就会涉及到filename和chunkFilename。

    • output.filename 决定了每个入口(entry) 输出 bundle 的名称。
    • output.chunkFilename 决定了非入口(non-entry) chunk 文件的名称。

    常用的Webpack配置如下

    module.exports = {
        //...
        output: {
            filename: '[name].[hash].bundle.js',
            chunkFilename: '[name].[hash].chunk.js',
        }
    };

    filename和chunkFilename对应的结果可以由以下参数拼接或者返回:

    模板描述
    [hash] 模块标识符(module identifier)的 hash
    [chunkhash] chunk 内容的 hash
    [name] 模块名称
    [id] 模块标识符(module identifier)
    [query] 模块的 query,例如,文件名 ? 后面的字符串
    [function] 方法,可以返回一个filename字符串

    不同的是chunkFilename我们不能想filename中的name那样,可以在entry中定义。也就是说对于chunkFilename,默认[id]和[name]是一样的,那么如何自定义name呢?

     

    如何命名chunk的名称

    只能说哪里有压迫,哪里就会有反抗,chunkFileName不能灵活自定义,这谁能忍,于是便有了/* webpackChunkName: "" */,号称是Magic Comments(魔术注释法)。

    Webpack通过增加内联注释来告诉运行时,该有怎样的行为。通过向import中添加注释,我们可以执行诸如命名chunk或选择不同模式之类的操作。

    这里着重讲一下webpackChunkName,它其实就是对chunkFilename定义时[name]值的改写,/* webpackChunkName: "hello" */,意味着[name]等于hello。

    于是上面的代码就会按照下面的方式来写,打包出来的chunk文件将会出现在plugins文件夹下,名字叫myModule.a2d1d5d8e7d5d4d4d4se.chunk.js。

    import(/* webpackChunkName: "plugins/myModule" */
        './myModule.js')
        .then(myModule => {
            console.log(myModule.default);
    });

    到此为止,我们已经可以将代码打包到多个文件,每个chunk可以独立命名,是的就是这样。

  • 相关阅读:
    一些命令
    DB-5:使用PowerDesigner连接数据库并生成ER图
    [原创]OpenEuler20.03安装配置PostgreSQL13.4详细图文版
    oss 视频转码
    java lambda groupby 的map顺序问题
    Springboot得到RabbitMQ队列消息的数量
    Rabbitmq 定时任务 (代码实现)
    Rabbitmq 定时任务
    Mac navicat 15
    Mac 重置 idea
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/14102034.html
Copyright © 2011-2022 走看看