记一次 webpack code-splitting 失效问题

记一次调整项目 babel 配置后 webpack 的 code-splitting 失效问题

问题产生背景

  • 某天我们同事需要实现一个业务需求,引入了某个工具包 xxx

  • 然后在使用这个工具包的时候发现有点问题

  • 查阅文档说需要把项目中的 babel 的 modules 属性配置调整一下, 使用 commonjs 模式

  • 同事调整完之后发现这个库确实好使了,业务需求实现了,产品很满意

爆雷

  • 又是某个工作日的下午,我们老大发现我们的项目加载有点慢,打开控制台看了下发现我们的项目首页加载的 js 文件很大,压缩完的都有 十多兆 ,源文件直接好 几十兆...然后就找我们沟通情况、排查问题、尽快解决问题。

  • 然后我们小组几个铁子就立马开始排查问题产生的原因了...

问题排查

本地复现

  • 我先在本地执行 build 命令把项目构建成功之后

  • 发现 dist 里面的 js 文件夹里面只有下图这些 js 文件

  • app.10721af9.js 大小为 22MB...

  • vendors.10721af9 大小为 34MB...

  • 从上面的现象来看,很明显是 webpack 的 code-splitting 没生效导致的问题

  • 项目中是在路由层面通过 import() 和 webpackChunkName 来实现的 code-splitting

  • vue-router

js 复制代码
component: () => import(/* webpackChunkName: "wangzhihao" */ '@/package/wangzhihao/index.vue');

排查 webpack

在把有问题的项目中的 webpack 中 code-splitting 的相关使用方法和其他表现正常的项目对比下来,发现相关的 webpack 配置一模一样,所以关注点转移到 @babel/preset-env 的配置项 modules 上来。提出这个想法后,之前调整过 babel 配置的同事就立马反应过来了。

  • 他调整的 babel 配置如图

排查 babel

  • 我尝试把 babel 的 modules 属性还原为 false,然后重新 build 一下项目

  • 结果问题就解决了,构建出来的 js 文件夹按预期通过 webpackChunkName 实现了 code-splitting,按模块分好了 js 文件

问题复盘

为什么 babel 配置会影响 code-splitting ?

  • 我一问巨佬 chatgpt 它的回答就给我明确的线索!太吊了

本质原因

  • 同事把 babel 中 @babel/preset-env 的配置 modules 值从 false 改为 commonjs

  • modules 为 commonjs 时, @babel/preset-env 会将 es module 转换成 commonjs

  • 结果就是把项目中写的 import() 转换成了 require()

  • 然而 webpack 处理 require() 就是正常的模块打包加载,不会编译成动态加载的模块,进而导致 code-splitting 失效

babel modules 不同编译效果

modules 为 false

modules 为 commonjs

参考资料

babel issue

babel-preset-env modules

相关推荐
Csvn10 分钟前
构建工具
前端
FRing0340 分钟前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
kyriewen3 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒3 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫4 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus4 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude
孟陬5 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
Zhao-Jichao5 小时前
AI Prompting for Everyone 课程笔记 - P17 图像生成 Imaging Generation
前端
Highcharts.js6 小时前
智能数据分析组件Orbit 正式发布与快速上手体验教程
前端·人工智能·信息可视化·数据分析系统·highcharts·orbit·智能可视化
螺丝钉tina7 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript