webpack-代码分离

使用webpack打包项目时一方面我们要防止单个文件太大,另一方面要防止文件碎片化,即打包文件太多,导致网络请求过多。所以合理的配置应该是兼顾打包文件的数量以及打包文件的个数。


what-is-webpack.png

代码分离 打包优化

在 webpack4版本之前,我们可以使用 CommonsChunkPlugin进行配置,在webpack4版本之后我们可以通过配置splitChunks来实现。splitChunks的配置选项如下:

  • chunks: 表示显示块的范围,有三个可选值:initial(初始块)、async(按需加载块)、all(全部块);
  • minSize: 表示在压缩前的最小模块大小;
  • minChunks: 表示被引用次数;
  • maxAsyncRequests: 最大的按需(异步)加载个数;
  • maxInitialRequests: 最大的初始化加载个数;
  • name: 拆分出来块的名字(Chunk Names),默认由块名和hash值自动生成;
  • cacheGroups: 缓存组。

对于缓存组是一个对象,除了可以有上面的chunks、minSize、minChunks、maxAsyncRequests、maxInitialRequests、name外,还有其他的一些参数:

如果不在缓存组中重新赋值,缓存组默认继承上面的选项,但是还有一些参数是必须在缓存组进行配置的。

  • priority: 表示缓存的优先级;
  • test: 缓存组的规则,表示符合条件的的放入当前缓存组,值可以是function、boolean、string、RegExp,默认为空;
  • reuseExistingChunk: 表示可以使用已经存在的块,即如果满足条件的块已经存在就使用已有的,不再创建一个新的块。

这里对cacheGroups有些不了解,其实其是对代码拆分进行细化配置的,比如说我想将某个特定的库单独打包,我就需要配置cacheGroups,通过test过滤出要单独打包的模块。

将第三方库的代码单独打包

optimization: {
    splitChunks: {           
      cacheGroups: {
        vendors: {
          chunks: 'initial', 
          test: /[\\/]node_modules[\\/]/,          
        }
      }
    }
  }

以上代码既可以将第三方代码单独打包。

需求:如果我的代码中使用了jquery vue lodash等第三方库,我想将这三个库分别打包进不同的文件(实际项目中不推荐,此处只用于测试),该如何设置呢?

  optimization:{
    splitChunks: {
      cacheGroups: {
        module1:{ // 键值可以自定义
          chunks:'initial', //
          test: /[\\/]node_modules[\\/]jquery/,
          name:'jquery',
       },
      module2:{
        chunks:'initial',
        test:/[\\/]node_modules[\\/]vue/,
        name:'_vue',
      },
    module3:{
      chunks:'initial',
      test:/[\\/]node_modules[\\/]lodash/,
      name:'loadash',
    }
  }
}

如上配置打包后的输出如下所示:


1.png

可以看出vue文件并没有如我们所愿打包出来,而是跟业务代码一起打包进了index.bundle.js文件,这是为什么呢?我们知道最大的初始化文件加载个数maxInitialRequests的默认值为3,也就是这个的默认值限制了vue文件的单独打包。我们做如下修改:

  optimization:{
    splitChunks: {
      maxInitialRequests: 4,
      cacheGroups: {
        module1:{ // 键值可以自定义
          chunks:'initial', //
          test: /[\\/]node_modules[\\/]jquery/,
          name:'jquery',
       },
      module2:{
        chunks:'initial',
        test:/[\\/]node_modules[\\/]vue/,
        name:'_vue',
      },
    module3:{
      chunks:'initial',
      test:/[\\/]node_modules[\\/]lodash/,
      name:'loadash',
    }
  }
}

如上配置打包后的输出如下所示:

2.png

manifest

若要将manifest单独打包,需要配置runtimeChunk选项。
runtimeChunk: {
name: 'page/manifest'
}

总结

webpack配置千千万,挨个试试又怎样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 性本善良阅读 129评论 0 0
  • 酝酿了许久的雨滴终究是落下来了,这样的夜让我想起了曾经的自己,也是在这样的雨夜,时候要更晚一些,我趴在窗前...
    永清随笔阅读 477评论 2 10