@bem-react/di

中文文档
6.1.1发布于 2026/08/18MPL-2.0TypeScriptESM + CJS零依赖近 30 天下载 2.9万

BEM 反应依赖注射

中文使用文档
文档目录5 节
  1. 安装
  2. 快开始
  3. 替换组件
  4. 扩展组件
  5. 储存其他

@bem-react/di## (英语) npm (scoped) npm bundle size (minified + gzip)

依赖性注射(DI) 允许您将 React 组件拆分成单独的版本,并在需要时在项目中可以舒适地切换,例如制作一个特定的捆绑.

DI软件包有助于以最小的努力解决类似的任务:

  • 复数 桌面 财务报告和审定财务报表 移动 组件的版本
  • 执行 实验 与共同组件并列的版本
  • 在单个地方存储组件及其辅助件(类似设置和功能)

安装

npm i -S @bem-react/di

快开始

记着! 此示例使用 @ bem- react/ classname 软件包。 。 。 .

例如,对于这样的结构:

Components/
  Header/
    [email protected]
    [email protected]
  Footer/
    [email protected]
    [email protected]
App.tsx

首先,创建两个文件,定义App的两个版本,并使用不同的组件集: [email protected] 财务报告和审定财务报表 [email protected]把它们放在附近 App.tsx。 。 。 .

在每个App版本中([email protected] 财务报告和审定财务报表 [email protected]我们应确定应使用哪些组成部分. 这样做的三个步骤:

  1. 创建一个有特定编号的登记册:
const registry = new Registry({ id: cnApp() })
  1. 在描述性密钥下登记所有所需组件版本(说明类似组件的钥匙,在所有版本中应相同):
registry.set('Header', Header)
registry.set('Footer', Footer)

或者说

registry.fill({
  Header,
  Footer,
})

或者说

registry.fill({
  'id-1': Header,
  'id-2': Footer,
})
  1. 导出 App 版本及其组件登记册 :
export const AppNewVersion = withRegistry(registry)(AppCommon)

文件应该是这样的:

1. 联合国. 单位 App.tsx

import { cn } from '@bem-react/classname'

export const cnApp = cn('App')
export const registryId = cnApp()

2. 联合国. 单位 [email protected]

import { Registry, withRegistry } from '@bem-react/di'
import { App as AppCommon, registryId } from './App'

import { Footer } from './Components/Footer/Footer@desktop'
import { Header } from './Components/Header/Header@desktop'

export const registry = new Registry({ id: registryId })

registry.set('Header', Header)
registry.set('Footer', Footer)

export const AppDesktop = withRegistry(registry)(AppCommon)

3个. 单位 [email protected]

import { Registry, withRegistry } from '@bem-react/di'
import { App as AppCommon, registryId } from './App'

import { Footer } from './Components/Footer/Footer@mobile'
import { Header } from './Components/Header/Header@mobile'

export const registry = new Registry({ id: registryId })

registry.set('Header', Header)
registry.set('Footer', Footer)

export const AppMobile = withRegistry(registry)(AppCommon)

是时候用这些版本 在你的应用动态!

如果输入 App.tsx 您的依赖关系以前是静止的

import React from 'react'
import { cn } from '@bem-react/classname'
import { Header } from './Components/Header/Header'
import { Footer } from './Components/Footer/Footer'

export const App = () => (
  <>
    <Header />
    <Footer />
  </>
)

现在可以根据当前使用的注册程序注入依赖性

与 RegistryConsumer

import React from 'react'
import { cn } from '@bem-react/classname'
import { RegistryConsumer } from '@bem-react/di'

// No Header or Footer imports

const cnApp = cn('App')

export const App = () => (
  <RegistryConsumer id={cnApp()}>
    {({ Header, Footer }) => (
      <>
        <Header />
        <Footer />
      </>
    )}
  </RegistryConsumer>
)

与 useRegistry (单位:千美元)需要反应版本 16.8.0+(中文(简体) )

import React from 'react'
import { cn } from '@bem-react/classname'
import { useRegistry } from '@bem-react/di'

// No Header or Footer imports

const cnApp = cn('App')

export const App = () => {
  const { Header, Footer } = useRegistry(cnApp())

  return (
    <>
      <Header />
      <Footer />
    </>
  )
}

这样您就可以使用您的应用程序的不同版本, 例如在您的服务器一侧有条件渲染或者创建单独的捆绑

import { AppDesktop } from './path-to/App@desktop'
import { AppMobile } from './path-to/App@mobile'

替换组件

登记册内的部件可以通过包装来取而代之(例如用于实验) withRegistry(...)(App) 与另一个登记册.

import { Registry, withRegistry } from '@bem-react/di'

import { AppDesktop, registryId } from './App@desktop'
import { HeaderExperimental } from './experiments/Components/Header/Header'

const expRegistry = new Registry({ id: registryId })

// replacing original Header with HeaderExperimental
expRegistry.set('Header', HeaderExperimental)

// AppDesktopExperimental will call App with HeaderExperimental as 'Header'
export const AppDesktopExperimental = withRegistry(expRegistry)(AppDesktop)

何时 App 从登记册提取组件 编 实际使用上面定义的所有登记册并合并。 默认情况下,更高定义的登记处将高于更低定义的登记处.

如果您想在某个时候创建注册, 而不是被覆盖, 请使用 overridable: false。 。 。 .

const boldRegistry = new Registry({ id: cnApp(), overridable: false })

扩展组件

使用方法扩展(例如用于实验)一个组件 extends(...) 登记被推翻.

import { Registry, withRegistry, withBase } from '@bem-react/di'
import { AppDesktop, registryId } from './App@desktop'

const expRegistry = new Registry({ id: registryId })

// extends original Header
expRegistry.extends('Header', (BaseHeader) => (props) => (
  <div>
    <BaseHeader height={200} color={red} />
  </div>
))

// AppDesktopExperimental will call App with extended 'Header'
export const AppDesktopExperimental = withRegistry(expRegistry)(AppDesktop)

编 将嵌入式登记册和普通组件合并。 因此,你总是可以得到一个参考 之前组件的执行.

储存其他

编 登记处不仅可以保留组件,而且还可以保留其设置和任何其他辅助工具(类似功能).

import { useRegistry } from '@bem-react/di'

const cnHeader = cn('Header')

export const Header = (props) => {
  const { theme, showNotification, prepareProps } = useRegistry(cnApp())

  // one function is used to fulfill props
  const { title, username } = prepareProps(props)

  useEffect(() => {
    // another function is used inside hook
    showNotification()
  })

  return (
    <header className={cnHeader({ theme })}>
      <h1>{title}</h1>
      <h2>Greetings ${username}</h2>
    </header>
  )
}

版本与发布记录

@bem-react/di 共发布 51 个版本,首次发布于 2018/08/29;过去 12 个月发布了 4 个版本。

版本发布日期距今
6.1.1latest2026/08/182 个月前
6.1.02026/02/278 个月前
6.0.1-dev.1next2026/02/258 个月前
6.0.02026/02/069 个月前
5.1.02025/06/151.4 年前
5.0.1-dev.62025/06/111.4 年前

关于 @bem-react/di 的常见问题

@bem-react/di 是什么?

BEM 反应依赖注射

如何安装 @bem-react/di?

在项目目录运行 npm install @bem-react/di,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^19.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@bem-react/di 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bem-react/di 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@bem-react/di 可以商用吗?

@bem-react/di 使用 MPL-2.0 许可。弱 Copyleft:可以商用,也可以和闭源代码一起使用;但如果分发时修改了 MPL 授权的文件,这些文件的修改需以 MPL 开源。以上为概括,不构成法律意见,请以许可原文为准。

@bem-react/di 的下载量有多少?

根据 npm 官方下载统计,@bem-react/di 在 2026/10/08 – 2026/11/06 这 30 天内被下载 28,642 次,日均约 955 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bem-react/di 还在维护吗?

最新版本 6.1.1 发布于 2026/08/18(2 个月前);至今共发布 51 个版本,其中过去 12 个月发布了 4 个;首次发布于 2018/08/29。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。