react项目打包优化

本文分享react项目的打包优化,
项目使用create-react-app创建。不做任何优化时打包体积过大,首页渲染十分缓慢。
使用webpack-bundle-analyzer查看打包chunck的内容,使用方式如下:

yarn add webpack-bundle-analyzer
yarn add cross-env

在package.json配置命令

"scripts": {
    "start": "node scripts/start.js",
    "build": "node scripts/build.js",
    "report":"cross-env npm_config_report=true node scripts/build.js",  //新增,查看打包文件内容
    "test": "node scripts/test.js"
  },

通过分析,打包文件体积过大的原因主要有2点
1、react路由未按需加载
2、打包antd的icon时打包了所有icon文件

可从如下几方面进行优化
1、react路由实现按需加载
2、antd按需加载
3、分割icon文件,不全部导入

首先实现antd按需加载。查看antd官网配置

yarn add babel-plugin-import

在package.json配置

"plugins": [
      [
        "import",
        {
          "libraryName": "antd",
          "style": "css"
        }
      ]
    ]

路由按需加载

//使用高阶组件对路由组件进行包裹
import React, { Component } from 'react'

export default function asyncComponent(importComponent) {
  class AsyncComponent extends Component {
    constructor(props) {
      super(props)

      this.state = {
        component: null
      }
    }

    async componentDidMount() {
      const { default: component } = await importComponent()

      this.setState({
        component
      })
    }

    render() {
      const C = this.state.component

      return C
        ? <C {...this.props} />
        : null
    }
  }

  return AsyncComponent
}

使用方式

import asyncComponent from '../components/Boundle/Boundle'

export default {
  path: '/userManage',
  component: asyncComponent(() => import('@/views/userManage/userManage.js')),
  exact: true,
  children: [

  ]
}

路由按需加载实现完成。
icon文件按需导入
主要是利用webpack的alias
在webpack.config.js的alias进行如下配置
alias:{
‘@ant-design/icons/lib/dist$’: path.resolve(__dirname, ‘…/src/icons.js’)
}
在src目录下创建icons.js文件
该文件主要是导入使用到的icon。这样就不会把所有的icon文件引入了。

// export what you need
export {
  default as SmileOutline
} from '@ant-design/icons/lib/outline/SmileOutline'
export {
  default as MehOutline
} from '@ant-design/icons/lib/outline/MehOutline'

// export what antd other components need
export {
  default as CloseOutline
} from '@ant-design/icons/lib/outline/CloseOutline'
export {
  default as CheckOutline
} from '@ant-design/icons/lib/outline/CheckOutline'
export {
  default as LoadingOutline
} from '@ant-design/icons/lib/outline/LoadingOutline'
export {
  default as CheckCircleOutline
} from '@ant-design/icons/lib/outline/CheckCircleOutline'
export {
  default as InfoCircleOutline
} from '@ant-design/icons/lib/outline/InfoCircleOutline'
export {
  default as CloseCircleOutline
} from '@ant-design/icons/lib/outline/CloseCircleOutline'
export {
  default as ExclamationCircleOutline
} from '@ant-design/icons/lib/outline/ExclamationCircleOutline'
export {
  default as CheckCircleFill
} from '@ant-design/icons/lib/fill/CheckCircleFill'
export {
  default as InfoCircleFill
} from '@ant-design/icons/lib/fill/InfoCircleFill'
export {
  default as CloseCircleFill
} from '@ant-design/icons/lib/fill/CloseCircleFill'
export {
  default as ExclamationCircleFill
} from '@ant-design/icons/lib/fill/ExclamationCircleFill'
export { default as UpOutline } from '@ant-design/icons/lib/outline/UpOutline'
export {
  default as DownOutline
} from '@ant-design/icons/lib/outline/DownOutline'
export {
  default as LeftOutline
} from '@ant-design/icons/lib/outline/LeftOutline'
export {
  default as RightOutline
} from '@ant-design/icons/lib/outline/RightOutline'
export {
  default as RedoOutline
} from '@ant-design/icons/lib/outline/RedoOutline'
export {
  default as CalendarOutline
} from '@ant-design/icons/lib/outline/CalendarOutline'
export {
  default as SearchOutline
} from '@ant-design/icons/lib/outline/SearchOutline'
export {
  default as BarsOutline
} from '@ant-design/icons/lib/outline/BarsOutline'
export {
  default as StarFill
} from '@ant-design/icons/lib/fill/StarFill'
export {
  default as FilterOutline
} from '@ant-design/icons/lib/outline/FilterOutline'
export {
  default as CaretUpOutline
} from '@ant-design/icons/lib/outline/CaretUpOutline'
export {
  default as CaretDownOutline
} from '@ant-design/icons/lib/outline/CaretDownOutline'
export {
  default as PlusOutline
} from '@ant-design/icons/lib/outline/PlusOutline'
export {
  default as FileOutline
} from '@ant-design/icons/lib/outline/FileOutline'
export {
  default as FolderOpenOutline
} from '@ant-design/icons/lib/outline/FolderOpenOutline'
export {
  default as FolderOutline
} from '@ant-design/icons/lib/outline/FolderOutline'
export {
  default as PaperClipOutline
} from '@ant-design/icons/lib/outline/PaperClipOutline'
export {
  default as PictureOutline
} from '@ant-design/icons/lib/outline/PictureOutline'
export {
  default as EyeOutline
} from '@ant-design/icons/lib/outline/EyeOutline'
export {
  default as DeleteOutline
} from '@ant-design/icons/lib/outline/DeleteOutline'
export {
  default as StockOutline
} from '@ant-design/icons/lib/outline/StockOutline'
export {
  default as BookOutline
} from '@ant-design/icons/lib/outline/BookOutline'
export {
  default as TeamOutline
} from '@ant-design/icons/lib/outline/TeamOutline'
export {
  default as OrderedListOutline
} from '@ant-design/icons/lib/outline/OrderedListOutline'

至此基本优化介绍完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值