react项目打包优化

it2022-07-03  127

本文分享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'

至此基本优化介绍完毕。


最新回复(0)