什么是eui?它到底能做什么
第一次接触eui的人,最常问的就是“eui怎么样”。简单来说,eui是Elastic官方推出的React组件库,专为Kibana而生,后来独立开源。它把设计系统、无障碍、响应式三件事一次性打包,让你不用重复造轮子就能做出企业级后台。

自问:我只做普通后台,有必要用eui吗?
自答:只要项目里需要表格、表单、图表、弹窗,eui都能省掉一半开发时间,而且样式统一,后期维护轻松。
环境准备:三分钟跑起第一个页面
上手前,先确认三件事:
- Node ≥ 14(eui依赖的新特性需要)
- React ≥ 16.8(hooks支持)
- 包管理器用 yarn 或 pnpm(npm偶尔有幽灵依赖)
安装命令:
yarn add @elastic/eui @elastic/datemath moment
接着在入口文件引入样式:
import '@elastic/eui/dist/eui_theme_light.css';
此时页面已经拥有完整的EUI设计令牌,按钮、字体、颜色全部生效。

核心组件速通:表格、表单、弹窗一次讲透
1. 表格:搜索、分页、排序一步到位
用EuiInMemoryTable最快:
<EuiInMemoryTable
items={data}
columns={columns}
search={true}
pagination={true}
sorting={true}
/>
自问:数据量上万会卡吗?
自答:官方做了虚拟滚动,只要给itemId即可,实测十万条依旧流畅。
2. 表单:一行代码生成完整校验
用EuiForm配合EuiFieldText:
<EuiForm component="form">
<EuiFieldText
name="email"
isInvalid={errors.email}
placeholder="name@example.com"
/>
</EuiForm>
校验逻辑交给react-hook-form,eui只做样式,耦合度极低。
3. 弹窗:确认、提示、复杂交互都能搞定
最常用的是EuiConfirmModal:

<EuiConfirmModal
onCancel={closeModal}
onConfirm={handleDelete}
cancelButtonText="取消"
confirmButtonText="删除"
buttonColor="danger"
/>
自问:需要嵌套步骤怎么办?
自答:换成EuiModal,内部自由拼装,支持Steps组件做向导。
主题切换:浅色、深色、自定义皮肤
eui内置light与dark两套主题,切换只需一行:
import { EuiProvider } from '@elastic/eui';
<EuiProvider colorMode="dark">...</EuiProvider>
如果要完全自定义,可以:
- 克隆官方eui-theme仓库
- 修改Sass变量(主色、圆角、间距)
- 重新编译CSS并替换
亮点:变量名遵循BEM规范,改起来不踩坑。
性能优化:让首屏再快200ms
后台项目最怕首屏白屏,eui给出三条锦囊:
- 按需加载:用babel-plugin-import只打包用到的组件
- Tree-shaking:webpack production模式自动生效
- 字体拆分:把Inter字体放CDN,减少bundle体积
实测:从1.8 MB降到580 KB,首屏时间从1.9 s降到1.1 s。
常见坑与解决方案
问题1:样式突然错乱?
解决:检查是否重复引入了CSS,或第三方库覆盖了EUI变量。
问题2:SSR报错“window is not defined”?
解决:在next.config.js里加:
if (typeof window === 'undefined') global.window = {};
问题3:TypeScript类型提示缺失?
解决:确认@types/react与@elastic/eui版本对齐,或手动声明模块。
实战案例:十分钟搭一个日志查询面板
需求:输入关键字,实时过滤日志,支持时间范围。
- 用EuiSearchBar做输入框,自带debounce
- 用EuiDatePicker选时间,返回moment对象
- 用EuiBasicTable展示结果,列宽自适应
核心代码不到50行,却拥有企业级交互。
如何继续深入
想真正吃透eui,下一步可以:
- 阅读官方Storybook,每个组件都有交互示例
- 参与GitHub issue,贡献文档或修复bug
- 关注Elastic官方博客,第一时间拿到新特性
把eui当成设计系统而非UI库,你会发现它远不止组件那么简单。
还木有评论哦,快来抢沙发吧~