解决使用Antd打包时icons文件全部引入问题

8,245 阅读2分钟

发现问题

今天像往常一样打包更新完文件后准备更新我的博客时,发现打完包之后的首页文件特别大,仔细想想首页也没用到多少模块,肯定是有些不应该打包的东西也打进去了。于是用了 webpack-bundle-analyzer 插件查看打包后的文件的详细情况。

于是发现

文件把整个 @ant-design/icons/lib 都打包进去了, 让文件无缘无故多了500多kb,就算开启gzip后也要145kb。

原来我项目中用到了Antd中的Icon组件,在Icon组件文件中看到

把整个 @ant-design/icons/lib都引入了组件,所以打包时也都Antd所有字体也就打包进了文件。

如何解决

解决办法一

只引入我们需要的Antd中要的Icon文件。

创建antdIcons.js,从@ant-design中导出只是你想要的Icon文件

在安装Antd时,@ant-design/icons 已经作为依赖安装过了,所以不用重新安装。

// antdIcons.js

export {default as MenuOutline} from '@ant-design/icons/lib/outline/MenuOutline';

然后配置webpack的resolve.alias

让解析引入包的地址时,变成解析成你配置的地址

// webpack配置中

resolve: {
    alias:{
        ’@ant-design/icons/lib/dist$': path.resolve(__dirname, 'utils/antdIcon.js')
    }
}

配置之后我们在看打包后 webpack-bundle-analyzer 插件的输出

现在只是引入我们需要的icon,现在只占了文件非常小的一部分

解决办法二

不使用Antd的Icon组件,使用阿里iconfont 挑选自己想要的文件在项目中引入iconfont文件。

注意事项

  • 配合官方的组件按需加载使用:Antd 按需加载
  • 配置webpack的resolve.alias时路径不要写错了
  • antdIcons.js引入icon的引入写法不能这么写
// antdIcons.js

export { MenuOutline } from '@ant-design/icons';

这种写法会使webpack4解析时不能进行tree-shaking,最后也会把整个@ant-design/icons打包进去

  • 注意Antd的icon有fill和outline的区别,引入时注意检查
  • 如果用到了Antd组件中也使用到了Icon组件,需要把这些组件需要用的Icon也一并导出。

官方关于这个问题的issues

antd#12011