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

相关文章
|
10天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23441 10
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
14天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
4727 15
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
15天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
5675 13
|
1月前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
24800 65
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
3天前
|
前端开发 API 内存技术
对比claude code等编程cli工具与deepseek v4的适配情况
DeepSeek V4发布后,多家编程工具因未适配其强制要求的`reasoning_content`字段而报错。本文对比Claude Code、GitHub Copilot、Langcli、OpenCode及DeepSeek-TUI等主流工具的兼容性:Claude Code需按官方方式配置;Langcli表现最佳,开箱即用且无报错;Copilot与OpenCode暂未修复问题;DeepSeek-TUI尚处早期阶段。
745 2
对比claude code等编程cli工具与deepseek v4的适配情况