• Webpack4 splitChunks配置,代码分离逻辑


    博客不知道啥时候写的了,一直在草稿箱没写完,突然感觉今年过去大半了,又没怎么写博客。写写完,有始有终

         1.代码分离升级

          原来项目代码分离是通过下面的配置,基于bundle-loader插件,通过router.jsx的配置进行代码分离,js文件的名字根据[name].router.jsx生成。

            {
                test: /.router.jsx/,
                loader: [
                    'bundle-loader?lazy&name=[1]&regExp=([^\\\/]*)\.router\.jsx',
                    'babel-loader',
                ],
                exclude: /node_modules|assets/
            }

         升级方案采用react-loadable + import 方式,以组件为单位进行代码分离,需要打包在一起的话,webpackChunkName配置成同一个名字就行。

        component: Loadable({
            loader: () => import(/* webpackChunkName: "name" */ 'MODULES/component/index.jsx'),
            loading
        }),

      2.实际项目中,根据上面的配置还是会有一些问题,有些库包会比较大,如果一起打包的话会导致文件过大,所以应该利用浏览器的并发数,把大文件拆开来,webpack4主要使用的是splitChunks配置,下面是项目中的配置

    splitChunks: {
                maxAsyncRequests: 6,
                cacheGroups: {
                    brace: {
                        name: 'brace',
                        chunks: 'all',
                        priority: 10,
                        test: getTestFn(function(name) {
                            const reg = new RegExp(/brace/);
                            if (
                                name.indexOf('/components/ace/') !== -1 ||
                                name.indexOf('/components/sql-formatter/') !== -1 ||
                                name.indexOf('/node_modules/react-ace/') !== -1
                            ) {
                                return true;
                            }
                            return reg.test(name);
                        })
                    },
                    echarts: {
                        name: 'echarts',
                        chunks: 'all',
                        priority: 10,
                        test: /echarts|zrender/
                    },
                    libs: {
                        name: 'libs',
                        chunks: 'all',
                        priority: 9,
                        test: getTestFn(function(name) {
                            const reg = new RegExp(/babel-polyfill|/react/|react-dom|react-router-dom|mobx|lodash/);
                            return reg.test(name);
                        })
                    },
                    styles: {
                        name: 'styles',
                        test: /.(less|css|scss)$/,
                        chunks: 'async',
                        minChunks: 1,
                        reuseExistingChunk: true,
                        enforce: true,
                        priority: 8
                    },
                    async: {
                        name: 'async',
                        chunks: 'async',
                        minChunks: 2,
                        reuseExistingChunk: true,
                        priority: 7
                    },
                    default: false,
                    vendors: false
                }
            }

    里面有些字段需要说明下(可能有误差,欢迎指正)

    chunks:"initial" 初始化,我认为就是entry的配置

                  "async"异步,相当于import异步拆分打包的内容

                  "all": 所有

    priority: 优先级,数值越大,越先执行

    minChunks: 引用次数大于这个值进行打包

    打包优化思路,

      a.先把大的库单独打包,如代码编辑器ace,图标可视化echarts,这边我通过test设置为函数,把一些编辑器相关的也一同打包

      b.把一些不怎么会改,升级的基础库进行打包,libs配置

      c.把一些公共代码进行打包。async的配置。需要注意minChunks: 2,这个配置就是上面打包完成剩下的文件中,如果有超过2个地方引用的就会打包进async.js,这个配置minChunks到底填几就看实际场景了

          d.vendors和default是默认配置,下面就是相关的配置,vendors是把node_modules打包一起,default是把重复代码打包,自己配置很详细的情况下,就应该禁用掉

     vendors: {
         test: /[\/]node_modules[\/]/,
         priority: -10
     },
     default: {
         minChunks: 2,
         priority: -20,
         reuseExistingChunk: true
     }
  • 相关阅读:
    [bzoj5466] [loj#2955] [NOIP2018] 保卫王国
    [洛谷P4719] 动态DP模板
    [bzoj4869] [loj#2142] [Shoi2017] 相逢是问候
    《组合数学》学习笔记 之 二项式系数
    多项式模板合集
    THUWC2020 自闭记
    [bzoj5020] [THUWC 2017] 在美妙的数学王国中畅游
    [bzoj3676] [Apio2014] 回文串
    【模板整理】Tarjan
    考前一些东西
  • 原文地址:https://www.cnblogs.com/legu/p/10491315.html
Copyright © 2020-2023  润新知