前端组件库 ——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/

相关文章
|
Go 芯片 异构计算
Vivado初体验LED工程 3
Vivado初体验LED工程
531 0
|
7月前
|
边缘计算 运维 前端开发
阿里云 ESA “函数和Pages”全面开放|打通开发者“最后一公里”!
随着云计算技术的不断下沉,从中心云到边缘云的演进已成为不可逆转的趋势。为了满足开发者对更低延迟、更灵活部署以及更低运维成本的极致追求,阿里云 ESA 正式推出了备受期待的「函数和Pages」功能。这一发布标志着阿里云迈出了关键一步——让计算触手可及,让部署快如闪电。
阿里云 ESA “函数和Pages”全面开放|打通开发者“最后一公里”!
|
11月前
|
数据采集 存储 前端开发
如何开发门店业绩上报管理系统中的销售日报板块?(附架构图+流程图+代码参考)
门店业绩上报管理系统中的销售日报板块是零售企业管理运营的核心工具。通过汇总当日销售数据,系统帮助管理者实时掌握门店经营状况,提升决策效率和市场竞争力。本文详解销售日报模块的功能设计、业务流程、开发技巧及实现效果,涵盖数据库设计、前端展示、数据采集与分析等内容,助力企业打造高效精准的销售日报系统,实现数据驱动的精细化管理。(239字)
|
JavaScript 前端开发 开发者
flat、flatmap与map的用法区别
本文介绍了 JavaScript 数组方法 `flat()`、`flatMap()` 和 `map()` 的用法及区别。`flat()` 可按指定深度递归展平数组,参数为深度,默认一层;`flatMap()` 结合了 `map()` 和 `flat()` 功能,返回一维数组,长度可能不同于原数组;而 `map()` 返回与原数组长度一致的新数组。通过多个代码示例展示了三者的功能和差异,帮助开发者更好地理解和使用这些方法。
1644 0
|
机器学习/深度学习 人工智能 编解码
《AI “造脸术”:生成对抗网络打造超真实虚拟人脸》
生成对抗网络(GANs)通过生成器和判别器的对抗训练,从随机噪声中生成高度真实感的虚拟人脸。生成器逐步优化图像生成,判别器不断提升辨别能力,最终生成逼真的人脸图像。GANs在影视、游戏和虚拟现实等领域广泛应用,为虚拟角色塑造和个性化定制提供了强大支持。未来,随着技术进步,GANs有望进一步提升生成质量与多样性,推动虚拟人脸技术迈向新高度。
791 13
|
Web App开发 JSON JavaScript
vue学习:chrome 中 vuetools 开发插件 的下载、安装
这篇文章介绍了如何在Chrome浏览器中下载、安装并测试Vue.js开发插件——vue-devtools。
4799 0
vue学习:chrome 中 vuetools 开发插件 的下载、安装
|
Prometheus 监控 数据可视化
面试分享:Airflow工作流调度系统架构与使用指南
【4月更文挑战第10天】Apache Airflow是关键的工作流调度系统,本文结合面试经验,深入探讨其核心架构和使用技巧。重点包括:1) Airflow的Scheduler、Web Server、Worker和Metadata Database组件;2) DAG、Task和Operator的概念;3) DAG编写、调度及错误处理策略;4) 监控与扩展性,如自定义Operator和最佳实践。通过学习,助你在面试中应对Airflow相关问题,并提升实际工作中的数据工程能力。
1205 5
|
缓存 监控 数据处理
【编程底层原理】从播放音乐的网页中提取mp3音频文件的两种方式及背后的技术思考【短连接和长连接】
本文介绍了两种从网页提取音乐文件的方法:一是通过IE临时缓存获取,二是利用开发者模式捕捉网络流量并下载音频URL。同时探讨了网页播放音乐的技术实现,包括短连接和长连接的区别及其适用场景,以及数据传输中的阻塞概念。
5176 0
|
Linux 文件存储 数据安全/隐私保护
Linux用户组管理实战:创建、管理与删除的全面指南
在 Linux 系统中,用户组管理是实现权限控制和资源共享的关键。本文档详细介绍如何创建用户组、管理用户组成员及查看与删除用户组。首先,通过 `groupadd` 命令创建新用户组,并在 `/etc/group` 文件中记录。接着,利用 `usermod` 和 `gpasswd` 命令来添加或删除用户组成员,其中 `gpasswd` 提供更灵活的管理方式。最后,使用 `getent` 或直接读取 `/etc/group` 查看用户组信息,并通过 `groupdel` 删除空用户组。这些操作有助于高效管理和保护系统资源。
1005 4
|
小程序 开发工具 开发者
入职必会-开发环境搭建31-微信开发者工具下载和安装
微信开发者工具是一款由微信官方推出的开发工具,旨在帮助开发者更高效地进行微信小程序和微信公众号的开发与调试。该工具集成了代码编辑、代码上传、实时预览、调试等功能,能够提供便捷的开发环境和调试工具,帮助开发者快速定位和解决问题。
5090 0