前端组件库 ——Arco Design React 知识点大全(四)

简介: 教程来源 https://www.wkmsa.cn/ Arco Design性能优化指南:涵盖按需引入(组件/图标)、路由懒加载、虚拟滚动表格、Tree Shaking、React.memo及useMemo/useCallback缓存、Profiler性能监控等8大核心策略,显著减小包体积、提升渲染与加载性能。

六、性能优化

6.1 按需引入详解
按需引入是 Arco Design 性能优化的核心手段,可以从打包体积中移除未使用的组件代码。

通过 babel-plugin-import 实现自动按需引入

npm install babel-plugin-import -D
// babel.config.js
module.exports = {
  plugins: [
    ['import', {
      libraryName: '@arco-design/web-react',
      libraryDirectory: 'es',
      camel2DashComponentName: false,
      style: true,   // 自动加载样式
    }],
  ],
};

配置完成后,编写代码时只需:

import { Button, Input, Table } from '@arco-design/web-react';
// 插件会自动转换为:
// import Button from '@arco-design/web-react/es/button';
// import '@arco-design/web-react/es/button/style';
// import Input from '@arco-design/web-react/es/input';
// ...

从实际项目中验证优化效果
image.png
手动按需引入

如果不使用 babel 插件,也可以手动按需引入:

// ✅ 手动按需引入
import Button from '@arco-design/web-react/es/button';
import '@arco-design/web-react/es/button/style';

import Input from '@arco-design/web-react/es/input';
import '@arco-design/web-react/es/input/style';

6.2 图标按需引入优化
Arco Design 提供了独立的图标包 @arco-design/web-react/icon,包含超过 2000 个图标。全量引入图标库会显著增加打包体积。

// ❌ 错误:会引入所有图标
import * as Icons from '@arco-design/web-react/icon';

// ✅ 正确:只引入需要的图标
import { IconHome, IconUser, IconSettings } from '@arco-design/web-react/icon';

图标按需引入的打包效果对比:
image.png
使用动态图标的场景优化

当图标名称是动态的时,可以使用图标映射表:

// 预定义图标映射表
const iconMap = {
  home: IconHome,
  user: IconUser,
  settings: IconSettings,
  delete: IconDelete,
};

// 动态获取图标组件
const getIcon = (iconName) => {
  return iconMap[iconName] || IconDefault;
};

// 使用
const DynamicIcon = getIcon('home');
<DynamicIcon />

6.3 路由懒加载与代码分割
结合 React Router 可以实现组件级别的懒加载:

import { lazy, Suspense } from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { Spin } from '@arco-design/web-react';

// 懒加载页面组件
const Dashboard = lazy(() => import('./pages/Dashboard'));
const UserList = lazy(() => import('./pages/UserList'));
const OrderList = lazy(() => import('./pages/OrderList'));
const Settings = lazy(() => import('./pages/Settings'));

function App() {
  return (
    <BrowserRouter>
      <Suspense fallback={<Spin tip="加载中..." style={
  { marginTop: 100 }} />}>
        <Routes>
          <Route path="/" element={<Dashboard />} />
          <Route path="/users" element={<UserList />} />
          <Route path="/orders" element={<OrderList />} />
          <Route path="/settings" element={<Settings />} />
        </Routes>
      </Suspense>
    </BrowserRouter>
  );
}

使用 Webpack 魔法注释自定义 chunk 名称:

const Dashboard = lazy(() => import(/* webpackChunkName: "dashboard" */ './pages/Dashboard'));
const UserList = lazy(() => import(/* webpackChunkName: "users" */ './pages/UserList'));

6.4 表格组件性能优化
对于大数据量表格,Arco Design 的 Table 组件提供了虚拟滚动(Virtual Scroll)功能,可以显著提升渲染性能。

import { Table } from '@arco-design/web-react';

// 生成大量测试数据
const generateLargeData = () => {
  const data = [];
  for (let i = 0; i < 10000; i++) {
    data.push({
      key: i,
      name: `用户 ${i}`,
      age: 20 + (i % 50),
      address: `地址 ${i}`,
      email: `user${i}@example.com`,
    });
  }
  return data;
};

const columns = [
  { title: '姓名', dataIndex: 'name', width: 120, fixed: 'left' },
  { title: '年龄', dataIndex: 'age', width: 80 },
  { title: '地址', dataIndex: 'address', width: 200 },
  { title: '邮箱', dataIndex: 'email', width: 200, fixed: 'right' },
];

const VirtualTableDemo = () => {
  const data = generateLargeData();

  return (
    <Table
      columns={columns}
      data={data}
      virtualized
      scroll={
  { y: 500, x: 800 }}
      pagination={false}
      border
    />
  );
};

虚拟滚动的性能优势:
image.png
6.5 Tree Shaking 优化原理
Arco Design 使用 ES Modules 格式导出,支持 Webpack、Rollup、Vite 等构建工具的 Tree Shaking。确保以下几点以获得最佳优化效果:
使用 ES Module 引入方式:

// ✅ 好的做法
import { Button } from '@arco-design/web-react';

// ❌ 不好的做法(会阻止 Tree Shaking)
import Arco from '@arco-design/web-react';
const { Button } = Arco;

确保 sideEffects 配置正确:

// package.json 中确保 sideEffects 配置包含样式文件
{
  "sideEffects": [
    "*.css",
    "*.less"
  ]
}

使用 Webpack Bundle Analyzer 分析打包结果:

npm install webpack-bundle-analyzer -D
// webpack.config.js
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
  plugins: [
    new BundleAnalyzerPlugin(),
  ],
};

6.6 使用 React.memo 减少不必要的重渲染
对于频繁渲染的组件,使用 React.memo 可以避免不必要的重渲染:

import { memo } from 'react';
import { Card, Button } from '@arco-design/web-react';

const UserCard = memo(({ user, onEdit }) => {
  console.log('UserCard rendered:', user.id);
  return (
    <Card>
      <div>姓名:{user.name}</div>
      <div>年龄:{user.age}</div>
      <Button onClick={() => onEdit(user.id)}>编辑</Button>
    </Card>
  );
});

6.7 使用 useMemo / useCallback 缓存计算结果

import { useMemo, useCallback, useState } from 'react';
import { Table, Input } from '@arco-design/web-react';

function UserList({ users }) {
  const [keyword, setKeyword] = useState('');

  // 缓存过滤后的用户列表
  const filteredUsers = useMemo(() => {
    if (!keyword) return users;
    return users.filter(user => 
      user.name.includes(keyword) || user.email.includes(keyword)
    );
  }, [users, keyword]);

  // 缓存事件处理函数
  const handleSearch = useCallback((value) => {
    setKeyword(value);
  }, []);

  return (
    <>
      <Input.Search onSearch={handleSearch} placeholder="搜索用户" />
      <Table data={filteredUsers} columns={columns} />
    </>
  );
}

6.8 性能监控与调试
在 React 18+ 中,使用 React DevTools 的 Profiler 可以分析组件渲染性能:

import { Profiler } from 'react';

function onRenderCallback(
  id,           // 这次提交的 Profiler 树的 id
  phase,        // "mount" 或 "update"
  actualDuration, // 本次更新渲染耗时
) {
  console.log(`${id} 渲染耗时: ${actualDuration}ms`);
}

function App() {
  return (
    <Profiler id="UserList" onRender={onRenderCallback}>
      <UserList />
    </Profiler>
  );
}

来源:
https://wkmsa.cn/

相关文章
|
存储 缓存 并行计算
CPU组成元素:运算器+控制器(一)
CPU组成元素:运算器+控制器
5454 0
|
存储 JSON 固态存储
【离线】esrally实践总结
1.真正的离线安装esrally 2.术语介绍,官方数据集、track介绍 3.官方数据集下载 4.离线使用esrally测试现有ES测试集群 5.对比两次race(测试)的结果 6.测试时间太长怎么办? 7.报告分析
4295 2
【离线】esrally实践总结
|
9月前
|
边缘计算 运维 前端开发
阿里云 ESA “函数和Pages”全面开放|打通开发者“最后一公里”!
随着云计算技术的不断下沉,从中心云到边缘云的演进已成为不可逆转的趋势。为了满足开发者对更低延迟、更灵活部署以及更低运维成本的极致追求,阿里云 ESA 正式推出了备受期待的「函数和Pages」功能。这一发布标志着阿里云迈出了关键一步——让计算触手可及,让部署快如闪电。
阿里云 ESA “函数和Pages”全面开放|打通开发者“最后一公里”!
|
3月前
|
域名解析 数据采集 运维
Vsping在线Ping:网络链路稳定性监测与深度故障运维排查方案
Vsping在线Ping是一款云端多节点网络诊断工具,突破传统本地Ping局限,支持电信/联通/移动全网覆盖及跨境探测。一键检测延迟、丢包、连通性,可视化呈现结果,零门槛操作,精准定位故障归属,适用于个人自查与企业运维全场景。(239字)
496 0
|
JavaScript 前端开发 开发者
flat、flatmap与map的用法区别
本文介绍了 JavaScript 数组方法 `flat()`、`flatMap()` 和 `map()` 的用法及区别。`flat()` 可按指定深度递归展平数组,参数为深度,默认一层;`flatMap()` 结合了 `map()` 和 `flat()` 功能,返回一维数组,长度可能不同于原数组;而 `map()` 返回与原数组长度一致的新数组。通过多个代码示例展示了三者的功能和差异,帮助开发者更好地理解和使用这些方法。
1733 0
|
Web App开发 JSON JavaScript
vue学习:chrome 中 vuetools 开发插件 的下载、安装
这篇文章介绍了如何在Chrome浏览器中下载、安装并测试Vue.js开发插件——vue-devtools。
4925 0
vue学习:chrome 中 vuetools 开发插件 的下载、安装
|
存储 Java 数据建模
Java零基础-三维数组详解!
【10月更文挑战第21天】Java零基础教学篇,手把手实践教学!
912 4
|
安全 物联网 量子技术
量子加密技术
量子加密技术
1530 1
|
Prometheus 监控 数据可视化
面试分享:Airflow工作流调度系统架构与使用指南
【4月更文挑战第10天】Apache Airflow是关键的工作流调度系统,本文结合面试经验,深入探讨其核心架构和使用技巧。重点包括:1) Airflow的Scheduler、Web Server、Worker和Metadata Database组件;2) DAG、Task和Operator的概念;3) DAG编写、调度及错误处理策略;4) 监控与扩展性,如自定义Operator和最佳实践。通过学习,助你在面试中应对Airflow相关问题,并提升实际工作中的数据工程能力。
1301 5
|
缓存 监控 数据处理
【编程底层原理】从播放音乐的网页中提取mp3音频文件的两种方式及背后的技术思考【短连接和长连接】
本文介绍了两种从网页提取音乐文件的方法:一是通过IE临时缓存获取,二是利用开发者模式捕捉网络流量并下载音频URL。同时探讨了网页播放音乐的技术实现,包括短连接和长连接的区别及其适用场景,以及数据传输中的阻塞概念。
5651 0

热门文章

最新文章