React项目优化打包体积

项目初始体积

首先要优化打包体积,必须先分析初始项目的体积大小,这里项目使用create-react-app创建的,可以去官网找到source-map-explorer包进行分析,如图

使用npm run build进行打包,可以看到以下3个包,都是经过gzip压缩后的结果,大概压缩成原来的1/3

使用npm run analyze,看到各个模块的原始大小

可以看到大部分内容都打包进main.js文件中了。

打包体积优化

路由懒加载

路由懒加载主要是将暂时未用到的组件分包出去,等到需要用的时候在进行加载,减少了一开始加载的体积大小,路由懒加载可以根据自己的项目需求,我这里主要懒加载两个组件,因为这两个组件在一开始加载都并没有用到,将它们都抽离出去。

js 复制代码
const Edit = lazy(() => import(/* webpackChunkName: "editPage" */ '../pages/question/Edit'))
const Stat = lazy(() => import(/* webpackChunkName: "statPage" */ '../pages/question/Stat'))

webpackChunkName是给抽离后的文件命名,再次运行npm run build

可以看到main.js体积变小,而且也抽离出statPage,editPage这两个文件了,而且也可以看到css文件也抽离出去了

执行npm run analyze,可以看到main体积变成了70%

抽离第三方库

从上面中还可以看到antd和react-dom占绝大部分,而且变动也比较小,所以可以考虑将它们这些都抽离成一个个文件,然后利用缓存,从而提高加载速度。

抽离文件可以用webpack的splitChunks分包处理,react项目中要配置webpack,可以使用craco扩展

js 复制代码
module.exports = {
  webpack: {
    configure(webpackConfig) {
      if (webpackConfig.mode === 'production') {
        if (webpackConfig.optimization == null) {
          webpackConfig.optimization = {}
        }
        webpackConfig.optimization.splitChunks = {
          chunks: 'all',//同步或异步的模块都进行分包处理
          
          cacheGroups: {
            antd: {
              name: 'antd-chunk',
              test: /antd/,//匹配到antd的都抽离到一个单独的文件中,下面类似
              priority: 100,//优先级越高,较先匹配
            },
            reactDom: {
              name: 'reactDom-chunk',
              test: /react-dom/,
              priority: 99,
            },
            vendors: {
              name: 'vendors-chunk',
              test: /node_modules/,
              priority: 98,
            },
          },
        }
      }
      return webpackConfig
    },
  },
}

上面中antd和react-dom都是属于node_modules下面的第三方包,但给它们配置priority优先级,可以先让它们抽离到单独文件中,而其他node_modules下面的包抽离成vendors这个文件。

执行npm run build,再次查看打包情况

可以看到main.js体积已经减少了361.71kB,antd和react-dom,node_modules都抽离成单独的文件。

相关推荐
晴空雨1 小时前
React 合成事件原理:从事件委托到 React 17 的重大改进
前端·react.js
@大迁世界1 小时前
useCallback 的陷阱:当 React Hooks 反而拖了后腿
前端·javascript·react.js·前端框架·ecmascript
Fantastic_sj1 小时前
React 19 核心特性
前端·react.js·前端框架
小高0071 小时前
📌React 路由超详解(2025 版):从 0 到 1 再到 100,一篇彻底吃透
前端·javascript·react.js
wwy_frontend2 小时前
React性能优化实战:从卡顿到丝滑的8个技巧
前端·react.js
ikonan4 小时前
译:不要过度优化你的优化
前端·javascript·react.js
mit6.8246 小时前
[AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库
前端·人工智能·react.js
晓得迷路了7 小时前
栗子前端技术周刊第 94 期 - React Native 0.81、jQuery 4.0.0 RC1、Bun v1.2.20...
前端·javascript·react.js
江城开朗的豌豆7 小时前
React状态更新踩坑记:我是这样优雅修改参数的
前端·javascript·react.js
小遁哥1 天前
也是用上webworker了
react.js·性能优化