@exodus/dependency-preprocessors

中文文档
6.3.4发布于 2026/10/09MITTypeScriptES Module近 30 天下载 1.1万

Dependency preprocessors to enable declarative augmenting of dependency definitions before passing them to @exodus/dependency-injection

原始使用文档
文档目录10 节
  1. Usage
  2. Preprocessors
  3. logify
  4. config
  5. alias
  6. namespaceStorage
  7. readOnlyAtoms
  8. optional
  9. devModeAtoms
  10. performanceMonitor

@exodus/dependency-preprocessors

IOC preprocessor functions

Usage

Run built-in and custom preprocessors as follows:

import createIocContainer from '@exodus/dependency-injection'
import preprocess from '@exodus/dependency-preprocessors'
import { logify, config, alias, namespaceStorage } from '@exodus/dependency-preprocessors'

const createLogger =
  (namespace) =>
  (...args) =>
    console.log(namespace, ...args)

const ioc = createIocContainer({ logger: createLogger('exodus:ioc') })

const customPreprocessor = ({ definition, ...extras }) => ({ definition, ...extras })
const deps = preprocess({
  dependencies: createDependencies({ adapters, config }),
  preprocessors: [
    //
    logify({ createLogger }),
    config(),
    alias(),
    namespaceStorage(),
    customPreprocessor,
  ],
})

ioc.registerMultiple(deps)
ioc.resolve()

Preprocessors

logify

Pass a namespaced logger instance

import createIocContainer from '@exodus/dependency-injection'
import preprocess from '@exodus/dependency-preprocessors'

const createLogger =
  (namespace) =>
  (...args) =>
    console.log(namespace, ...args)

const ioc = createIocContainer({ logger: createLogger('exodus:ioc') })

const deps = preprocess({
  dependencies: [
    {
      definition: {
        id: 'myModule',
        factory: ({ logger }) => logger.warn('sync finished'), // Logs will be prefixed with [myModule:warn]
      },
    },
  ],
  preprocessors: [logify({ createLogger })],
})

ioc.registerMultiple(deps)
ioc.resolve()

config

Performs global config auto-binding given module id, or injection from a node if it has "config" defined on it.

import createIocContainer from '@exodus/dependency-injection'
import preprocess from '@exodus/dependency-preprocessors'
import { config } from '@exodus/dependency-preprocessors'

const createLogger =
  (namespace) =>
  (...args) =>
    console.log(namespace, ...args)

const ioc = createIocContainer({ logger: createLogger('exodus:ioc') })

const deps = preprocess({
  dependencies: [
    {
      definition: {
        id: 'config',
        factory: () => ({ myModule: { apiUrl: 'https://exodus.com' } }),
      },
    },
    {
      definition: {
        id: 'myModule',
        factory: ({ config }) => config.apiUrl,
        dependencies: ['config'],
      },
    },
    {
      definition: {
        id: 'nodeInjected',
        factory: ({ config }) => config.potter.spells, // [lumos]
        dependencies: ['config'],
      },
      config: {
        potter: {
          spells: ['lumos'],
        },
      },
    },
  ],
  preprocessors: [config()],
})

ioc.registerMultiple(deps)
ioc.resolve()

alias

Alias injected dependencies, e.g. so you can inject a global dependency myMobileImplementationOfSomething as a locally named option something to a module.

See example.

namespaceStorage

Namespaces the storage injected to your dependency.

See example.

readOnlyAtoms

Makes all atoms readonly unless configured to be writeable

import { readOnlyAtoms } from '@exodus/dependency-preprocessors'

const deps = preprocess({
  dependencies: [
    {
      definition: {
        id: 'balances',
        factory: () => ({ myModule: { apiUrl: 'https://exodus.com' } }),
        dependencies: ['currencyAtom', 'balancesAtom'],
      },
    },
  ],
  preprocessors: [readOnlyAtoms()],
})

To warn instead of throw, set the warn flag to true and inject a logger instace:

import { readOnlyAtoms } from '@exodus/dependency-preprocessors'

const deps = preprocess({
  // ...
  preprocessors: [readOnlyAtoms({ warn: true, logger: createLogger('readOnlyAtoms') })],
})

optional

Allows conditionally adding dependencies using the if property:

import { optional } from '@exodus/dependency-preprocessors'

const deps = preprocess({
  dependencies: [
    {
      if: ENABLE_OPTIMISTIC_ACTIVITY,
      definition: {
        id: 'optmisticBalances',
        factory: () => ({ myModule: { apiUrl: 'https://exodus.com' } }),
        dependencies: ['balancesAtom'],
      },
    },
  ],
  preprocessors: [optional()],
})

devModeAtoms

Helps detect various well-known issues with atoms

import { devModeAtoms } from '@exodus/dependency-preprocessors'

const deps = preprocess({
  dependencies,
  preprocessors: [
    devModeAtoms({
      logger,
      // throw when observers seem to hang
      timeoutObservers: {
        delay: 1000,
      },
      // warn is set() is called with the same value as the current value
      warnOnSameValueSet: true,
      // warn when observers throw/reject instead of crashing set()
      swallowObserverErrors: true,
    }),
  ],
})

performanceMonitor

Wraps method calls to IOC nodes in a proxy that notifies about the execution time of methods which exceed a configures threshold.

import { performanceMonitor } from '@exodus/dependency-preprocessors'

const deps = preprocess({
  dependencies,
  preprocessors: [
    performanceMonitor({
      now: performance.now, // default
      onAboveThreshold: ({ id, method, duration }) => {
        console.log(`[exodus:${id}:perf]`, `${method} took ${duration}ms`)
      },
      config: {
        threshold: 50, // default, logs any method calls taking longer than 50ms
      },
    }),
  ],
})

版本与发布记录

@exodus/dependency-preprocessors 共发布 42 个版本,首次发布于 2023/01/25;过去 12 个月发布了 2 个版本。

版本发布日期距今
6.3.4latest2026/10/091 个月前
6.3.32026/04/176 个月前
6.3.22024/12/061.9 年前
6.3.12024/11/232 年前
6.3.02024/10/032 年前
6.2.02024/09/262 年前

关于 @exodus/dependency-preprocessors 的常见问题

@exodus/dependency-preprocessors 是什么?

Dependency preprocessors to enable declarative augmenting of dependency definitions before passing them to @exodus/dependency-injection

如何安装 @exodus/dependency-preprocessors?

在项目目录运行 npm install @exodus/dependency-preprocessors,或使用 pnpm add / yarn add / bun add。

@exodus/dependency-preprocessors 支持 TypeScript 吗?

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

@exodus/dependency-preprocessors 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@exodus/dependency-preprocessors 可以商用吗?

@exodus/dependency-preprocessors 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@exodus/dependency-preprocessors 的下载量有多少?

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

@exodus/dependency-preprocessors 还在维护吗?

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