You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React NX Monorepo中创建并使用共享组件库

如何在React NX Monorepo中创建并使用共享组件库

兄弟,先给你纠正个小误区:你完全不用创建名为libs的应用!NX在初始化monorepo的时候,默认就会在根目录生成libs文件夹(除非你选了特别的初始化配置),这个文件夹就是专门用来放可复用库代码的,把库做成app是完全搞错方向啦~ 下面我一步步给你说正确的操作:

1. 创建共享组件库

用NX的官方生成器命令来创建React组件库,这是最标准的方式,会自动帮你配置好路径别名、构建脚本、导出规则这些麻烦事:

# 创建一个叫ui-shared的React组件库,放在shared目录下,用css样式(可换成scss/less)
npx nx g @nrwl/react:lib ui-shared --directory=shared --style=css
  • ui-shared是库的名字,你也可以叫shared-components,怎么好记怎么来
  • --directory=shared会把库代码放在libs/shared/ui-shared下面,方便你后续按功能分类管理多个库
  • --style=css指定样式方案,根据你的项目需求换就行

执行完命令,去libs目录看看,对应的文件夹已经生成好了,里面有默认的组件模板,还有个index.ts专门用来导出公共API,方便其他应用导入。

2. 在库中添加你需要的共享组件

进入组件库的源码目录,比如libs/shared/ui-shared/src/lib,创建Tabs.tsx、Search.tsx这些你需要的组件。举个简单的Search组件例子:

// libs/shared/ui-shared/src/lib/search/Search.tsx
import React from 'react';

// 定义组件的props类型
export interface SearchProps {
  placeholder?: string;
  onSearch: (value: string) => void;
}

export const Search = ({ placeholder = "请输入关键词", onSearch }: SearchProps) => {
  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    onSearch(e.target.value);
  };

  return (
    <input
      type="text"
      placeholder={placeholder}
      onChange={handleInputChange}
      style={{ padding: '8px 12px', border: '1px solid #eee', borderRadius: '4px' }}
    />
  );
};

组件写好后,一定要在库的index.ts里导出,这样其他应用才能找到它:

// libs/shared/ui-shared/src/index.ts
// 把你创建的所有共享组件都导出
export * from './lib/search/Search';
export * from './lib/tabs/Tabs';

3. 在应用中导入并使用共享组件

现在就可以在你的todo-list或者admin应用里用这些组件啦!NX已经帮你配置好了路径别名,直接用工作区名称+库的路径导入就行:
比如在todo-list的主组件里用:

// apps/todo-list/src/app/app.tsx
import React from 'react';
// 这里的your-workspace-name是你初始化NX时填的工作区名称,去nx.json里就能找到
import { Search, Tabs } from '@your-workspace-name/shared/ui-shared';

export function App() {
  const handleSearch = (value: string) => {
    console.log('用户搜索的内容:', value);
  };

  return (
    <div style={{ padding: '20px' }}>
      <Search placeholder="搜索待办事项" onSearch={handleSearch} />
      <br /><br />
      <Tabs tabs={[
        { label: '待办任务', key: 'pending' },
        { label: '已完成', key: 'completed' }
      ]} />
    </div>
  );
}

export default App;

找不到工作区名称?打开根目录的nx.json,里面的name字段就是啦!

4. 验证一下效果

运行你的应用,看看共享组件能不能正常工作:

npx nx serve todo-list

如果一切顺利,你就能在页面上看到共享的Search和Tabs组件啦!

最后再啰嗦一句:之前你创建的那个叫libs的应用,直接删掉就行,它完全不是NX约定的可复用库的形式,用上面的方法生成的库才是能被多个应用轻松复用的正确打开方式~

备注:内容来源于stack exchange,提问作者SnailCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:18:14