Webpack 打包后 React 组件体积太大怎么办?
我用 Webpack 打包了一个 React 项目,发现首页加载特别慢。看了下 bundle 分析,发现一个简单的组件居然占了快 200KB,感觉哪里不对劲。
我试过开启 production 模式和 TerserPlugin,但效果不明显。是不是代码分割没配好?下面是我组件的写法:
import React from 'react';
import { Button, Modal, DatePicker } from 'antd';
const HomePage = () => {
return (
<div>
<Button type="primary">点击</Button>
<Modal title="提示" open={false} />
<DatePicker />
</div>
);
};
export default HomePage;
是不是应该对 antd 做按需加载?现在整个库都被打包进来了……
说解决方案之前,先提醒一点:生产环境记得把 sourceMap 关掉或者设成 hidden-source-map,不然等于把源码裸奔给别人看,这个坑我之前踩过。
回到正题,antd 按需加载有几种方式。
第一种是配置 babel-plugin-import,这是官方推荐的老方案。在 babel 配置里加上:
配置完之后,你写
import { Button } from 'antd',编译后会自动转成import Button from 'antd/es/button',只打包用到的组件。第二种方式更直接,手动按需引入:
这种方式不用额外配置,但写起来麻烦,团队协作容易有人忘记。
另外 antd v4 之后支持 Tree Shaking,只要你用 ES Module 方式导入,Webpack 配好 optimization.usedExports,理论上是能自动摇掉的。但实际情况是 antd 内部依赖比较复杂,摇得没那么干净,还是建议用 babel-plugin-import 保底。
再就是路由级代码分割,配合 React.lazy:
这样首页不用的组件就不会阻塞首屏加载。
最后补充一点安全相关的:antd 这种大库,版本号要锁死在 package.json 里,别用 ^ 或者 ~,定期更新看有没有安全漏洞。大厂库还好,但之前有些 UI 库爆过 XSS 问题,保持警惕没坏处。