zoukankan      html  css  js  c++  java
  • webpack4.splitChunks

    webpack中的三个概念module、chunk和bundle

    在研究splitChunks之前,我们必须先弄明白这三个名词是什么意思,主要是chunk的含义,要不然你就不知道splitChunks是在什么的基础上进行拆分。

      从官网上貌似没找太多的解释,去网上搜了搜基本上都在转述这位老哥的回答《what are module,chunk and bundle in webpack》,我根据自己的理解给出我个人的看法:

    • module:就是js的模块化webpack支持commonJS、ES6等模块化规范,简单来说就是你通过import语句引入的代码。
    • chunk: chunk是webpack根据功能拆分出来的,包含三种情况:

        1、你的项目入口(entry)

        2、通过import()动态引入的代码

        3、通过splitChunks拆分出来的代码

        chunk包含着module,可能是一对多也可能是一对一。

    • bundle:bundle是webpack打包之后的各个文件,一般就是和chunk是一对一的关系,bundle就是对chunk进行编译压缩打包等处理之后的产出。

    splitChunks

      下面进入正题讲解splitChunks,splitChunks就算你什么配置都不做它也是生效的,源于webpack有一个默认配置,这也符合webpack4的开箱即用的特性,它的默认配置如下:

    module.exports = {
      //...
      optimization: {
        splitChunks: {
          chunks: 'async',
          minSize: 30000,
          minChunks: 1,
          maxAsyncRequests: 5,
          maxInitialRequests: 3,
          automaticNameDelimiter: '~',
          name: true,
          cacheGroups: {
            vendors: {
              test: /[\/]node_modules[\/]/,
              priority: -10
            },
            default: {
              minChunks: 2,
              priority: -20,
              reuseExistingChunk: true
            }
          }
        }
      }
    };

    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是把重复代码打包,自己配置很详细的情况下,就应该禁用掉

    optimization.splitChunks({
                    chunks: 'async',
                    cacheGroups: {
                         libs: {
                             name: 'chunk-libs',
                             test: /[\/]node_modules[\/]/,
                             priority: 10,
                            chunks: 'initial' // only package third parties that are initially dependent
                         },
                        echarts: {
                            name: 'chunk-echarts', // split echarts into a single package
                            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                            test: /[\/]node_modules[\/]_?echarts(.*)/ // in order to adapt to cnpm
                        },
    }

    建议安装:  webpack-bundle-analyzer

    1、引入

    const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

    2、使用

     
    webpackConfig.plugins.push(new BundleAnalyzerPlugin({
    ...
    }))

    1、每次构建时自动打开

    构建完成之后,浏览器会自动打开localhost:8888,不用改动package.json

    webpackConfig.plugins.push(new BundleAnalyzerPlugin({
        analyzerMode: 'server',
        generateStatsFile: true,
        statsOptions: { source: false }
    }))

    配置参数记得补上,不然构建完不会自动打开~

    2、运行特定命令才打开

    (1)把analyzerMode设置为disabled

    webpackConfig.plugins.push(new BundleAnalyzerPlugin({
        analyzerMode: 'disabled',
        generateStatsFile: true,
        statsOptions: { source: false }
    }))

    (2)在package.json的scripts字段中加入

    "bundle-report": "webpack-bundle-analyzer --port 8123 dist/stats.json"

    其中stat.json文件的位置在打包后的文件夹中,通常是dist,具体情况根据实际情况来定。

    (3)命令行中键入命令
    npm run bundle-report

     

    参考:https://www.cnblogs.com/kwzm/p/10314438.html

  • 相关阅读:
    ios---图片缩放
    ios---清除缓存
    ReactNative---组件种类
    Linux 用户和用户组管理
    Linux 文件与目录管理
    linux文件的基本属性
    xshell 快速复制打开之前用过的ssh
    ll 和 ls -l的详解
    laravel rbac的用户 角色 权限的crud
    laravel 中的rbac自己简单的实现
  • 原文地址:https://www.cnblogs.com/hjsblogs/p/13527713.html
Copyright © 2011-2022 走看看