# @datadog/openfeature-browser 中文文档

规范地址：https://npmcn.com/package/%40datadog/openfeature-browser/

版本：2\.3\.0
npm 元数据更新时间：2026-10-29T18:49:56.258Z
中文译文更新时间：2026-11-11T13:27:19.981Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40datadog/openfeature-browser
原文对照：https://npmcn.com/package/%40datadog/openfeature-browser/?lang=original
项目主页：https://github.com/DataDog/openfeature-js-client#readme
源码仓库：https://github.com/DataDog/openfeature-js-client

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：1.3 MB，301 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：3 个
- peer 依赖：@openfeature/core ^1\.9\.2，@openfeature/web-sdk ^1\.5\.0
- 首次发布：2025-07-01T14:12:14.098Z
- 最新版本发布：2026-10-29T18:49:55.887Z
- 近 30 天下载量：915102（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：47（近 12 个月 21 个）

## 中文简介

OpenFeature 的浏览器特定绑定( raps @ datadog/ openfeature- core)

## 安装

```sh
npm install @datadog/openfeature-browser
```

也可以使用：`pnpm add @datadog/openfeature-browser`、`yarn add @datadog/openfeature-browser`、`bun add @datadog/openfeature-browser`

## README

# 数据犬 OpenFeature 浏览器

## 安装

```bash
npm install @datadog/openfeature-browser
```

## 快速启动

主要的切入点是 `DatadogProvider`,它是提供 [OpenFeature 网络 SDK](https://openfeature.dev/docs/reference/technologies/client/web/)。 。 。 .

```javascript
import { DatadogProvider } from '@datadog/openfeature-browser'
import { OpenFeature } from '@openfeature/web-sdk'

// Initialize the provider
const provider = new DatadogProvider({
  applicationId: 'your-datadog-application-id',
  clientToken: 'your-datadog-client-token',
  trackExposures: true,
  enableFlagEvaluationTracking: true,
  site: 'datadoghq.com',
})

// Set the provider
await OpenFeature.setProviderAndWait(provider)

// Get a client and evaluate flags
const client = OpenFeature.getClient()
const flagValue = await client.getBooleanValue('my-flag', false)
```

## 配置

```javascript
const provider = new DatadogProvider({
  // Required
  clientToken: 'pub_...', // Your Datadog client token
  site: 'datadoghq.com', // Datadog site (datadoghq.com, datadoghq.eu, etc.)
  env: 'production', // Environment

  // Optional Datadog configuration
  service: 'my-service', // Service name
  version: '1.0.0', // Application version
  applicationId: 'app-id', // Your application ID for RUM attribution

  // Enable exposure logging to Datadog (default: true)
  trackExposures: true,

  // Enable flag evaluation tracking
  enableFlagEvaluationTracking: true,

  // Optional Fetch-compatible implementation for flag configuration requests
  flagConfigurationFetch: globalThis.fetch,
})
```

自定义抓取执行仅适用于旗帜配置请求 。 接触和旗帜评估摄入量 请求使用其现有的运输工具。 它接收提供者生成的 `RequestInit`,包括数据犬 认证和任何已配置的自定义信头,并可根据需要传送或转换请求.

### 为 npm 消费者请求超时和检索

Npm 包为添加超时和重试提供了相容的抓取包. CDN 捆绑没有曝光 这些帮手。 包装机保存了提供者的取消信号,可以由:

```javascript
import { DatadogProvider, withRetry, withTimeout } from '@datadog/openfeature-browser'

const customFetch = withRetry(withTimeout(globalThis.fetch, 5_000), 1)

const provider = new DatadogProvider({
  clientToken: 'pub_...',
  env: 'production',
  flagConfigurationFetch: customFetch,
})
```

这里,每次尝试都有5秒钟的暂停时间 `1` 允许在初始请求后重试一次。 超时包括 响应-身体下载。 包装可以缓冲响应体,并用于旗帜配置响应. A 类 超时 `0` 禁用计时器。 有效超时值结束于 `2_147_483_647`重试计数范围 `0` 改为 `10`。 。 。 . `withRetry` 使用随机化的指数备份获取 `TypeError` 失败、 超时、 HTTP 408 和 HTTP 5xx回应. 在 HTTP 503 上, 一个有效的 `Retry-After` 最大值为 30 秒, 作为最小的延迟值处理, 然后再抖动 添加后退; 请求更长时间延迟的答复不重审。 它不重试 HTTP 429. 浏览器报告 网络、CORS和CSP故障 `TypeError`,所以包装纸不能 分离这些原因。 仅限超时,通过 `withTimeout(globalThis.fetch, 5_000)` 直接为 `flagConfigurationFetch`。 。 。 .

### 旗帜选择

使用 `flagSelection` 只装入匹配一组标记或密钥图案的旗帜 :

```javascript
const provider = new DatadogProvider({
  clientToken: 'pub_...',
  env: 'production',
  flagSelection: {
    tags: ['team:checkout'],
    keyPatterns: ['checkout-*'],
  },
})
```

标记精确匹配且对大小写有敏感认识,如果有标记,则有标记匹配。 密钥模式是整键 仅存在于其中的阴影 `*` 这是特殊的。 如果一个旗帜匹配任何请求的标记或任何密钥模式( 或列表) , 则选中它 . 每个列表在去dupe后最多接受31个值;每个标记和密钥模式在三进制后最多接受200个UTF-8字节. 引导和跟踪 Unicode 白空间从每个值被修剪,空值被丢弃,重复为 已删除。 超过限制的选项被丢弃并装入完整配置 。 非常大的选择可能被忽略 服务器( e)`too_many_values`)),在这种情况下,全配置负载。 当服务器应用选择时, 旗子在外 它没有被装入,评估会以 `FLAG_NOT_FOUND`。旧服务器或已禁用的选择门 可能无需警告就返回完整的配置。 调用 `initialFlagsConfiguration` 未过滤 当地.

## 用法实例

### 旗帜评价

```javascript
const client = OpenFeature.getClient()

// Boolean flags
const showFeature = await client.getBooleanValue('show-new-feature', false)

// String flags
const theme = await client.getStringValue('app-theme', 'light')

// Number flags
const timeout = await client.getNumberValue('request-timeout', 5000)

// Object flags
const config = await client.getObjectValue('feature-config', {})
```

### 使用评价背景

在进行旗下评价之前,必须在全球范围内确定背景,并影响随后的所有评价:

```javascript
// Set global context (async operation)
await OpenFeature.setContext({
  targetingKey: 'user-123',
  userId: 'user-123',
  userEmail: 'user@example.com',
})

// Now evaluate flags with the context
const result = await client.getBooleanDetails('premium-feature', false)
console.log(result.value) // Flag value
console.log(result.reason) // Evaluation reason
```

### 在自己的数据库中曝光

使用 `ExposureHook` 以 SDK 使用的同样分解决定接收每一份完成的评价 发送曝光到 Datadog, 这样您就可以在自己的数据库中记录曝光:

```javascript
import { ExposureHook } from '@datadog/openfeature-browser'
import { OpenFeature } from '@openfeature/web-sdk'

OpenFeature.addHooks(
  new ExposureHook((evaluation) => {
    if (!evaluation.shouldSend()) return
    yourWarehouse.record({
      flag: evaluation.flagKey,
      variant: evaluation.variant,
      allocation: evaluation.allocation,
      targetingKey: evaluation.targetingKey,
      features: evaluation.getFeatures(), // split features, e.g. holdout.key
    })
  })
)
```

-   `isExposure()` 当评价成功并选择了记录曝光、重复的配置时是真实的 包含.
-   `isCacheHit()` 当此主题已经暴露于同一旗帜、分配、变体和序列ID时,则属实.
-   `shouldSend()` 对新曝光或已改变的曝光是真实的: SDK 发送给 Datadog 的正是它.
-   `getFeatures()` 返回只读 `HOOK` 选定拆分的特性,例如 `holdout.key` 财务报告和审定财务报表 `holdout.assignment_group`,当旗帜是阻力的一部分.

回调在评价线索上运行;将数据交给背景队列,而不是在回调中做一/O. 调用时的例外绝不影响评价( 第一次失败记录了警告, 稍后在调试时记录) 页:1.

SDK的曝光缓存在页面负荷上持续. 重新评价同一任务的页面重载是一个缓存 击中,所以 `shouldSend()` 数据犬不会再次登录曝光.

设定 `trackExposures: false` 停止只向Datadog发送曝光事件。 钩子仍然得到每一个 评价, `shouldSend()` 保留结果 缓存会不断记录. `enableExposureLogging` 已贬值 改为: `trackExposures`当二者被确定的时候, `trackExposures` 赢了.

接触要求直接在 OpenFeature 注册或包裹在其中的数据犬提供者 `DatadogDevtools`。 。 。 . 由 OpenFeature 等提供者组成 `MultiProvider` 不支持:他们的子钩在 应用程序的钩可以拒绝结果。 在一个编组的提供者下,SDK不会向Datadog发送任何曝光信息,不会 更新曝光缓存而不调用 `ExposureHook` 调用,并记录一个警告。 旗帜评价不是 受到影响.

#### 基于规则的模式和 `DatadogCoreProvider`

`DatadogProvider` 自动接线 在基于规则的模式下,应用程序自行构成跟踪 钩子,所以它必须与提供商共享曝光控制器的缓存,以便判决被盖上:

```javascript
import {
  composeDatadogTrackingHooks,
  createDatadogExposureLoggingHook,
  DatadogCoreProvider,
} from '@datadog/openfeature-browser/rules-based'
import { ExposureHook } from '@datadog/openfeature-browser'
import { OpenFeature } from '@openfeature/web-sdk'

// One exposure controller owns the one exposure cache; pass it to the provider.
const exposureTracking = createDatadogExposureLoggingHook({
  clientToken: 'client-token',
  applicationId: 'application-id',
  site: 'datadoghq.com',
  trackExposures: false, // record-only: no exposures go to Datadog
})
const tracking = composeDatadogTrackingHooks(exposureTracking)
await tracking.initialize()

const provider = new DatadogCoreProvider({ exposureCache: tracking.exposureCache })
provider.setConfiguration(rulesConfiguration)

await OpenFeature.setProviderAndWait('datadog-core', provider, context)
const client = OpenFeature.getClient('datadog-core')
client.addHooks(...tracking.hooks)

OpenFeature.addHooks(
  new ExposureHook((evaluation) => {
    if (!evaluation.shouldSend()) return
    yourWarehouse.record({
      flag: evaluation.flagKey,
      variant: evaluation.variant,
      allocation: evaluation.allocation,
      targetingKey: evaluation.targetingKey,
      features: evaluation.getFeatures(),
    })
  })
)
```

提供者和数据狗发送路径共享一个缓存,所以 `shouldSend()` 和SDK自身的分解 总是同意. `DatadogCoreProvider.initialize()` 等待共享缓存装入, 因此在 `setProviderAndWait` ưμ㼯a `tracking.initialize()` 在评价录音之前 钩活活. 没有 `exposureCache` 选项,评价没有风险判断和跟踪 钩子的行为和以前一样.

### 试验选择退出

在构建提供者时选择选择退出模式。 您的应用程序拥有并存储了对象的首选时间戳 .

```typescript
import { DatadogProvider, ExperimentationOptOutMode } from '@datadog/openfeature-browser'
import { OpenFeature } from '@openfeature/web-sdk'

const provider = new DatadogProvider({
  clientToken: '<CLIENT_TOKEN>',
  env: 'production',
  experimentationOptOutMode: ExperimentationOptOutMode.Immediate,
})

await OpenFeature.setProviderAndWait(provider, {
  targetingKey: user.id,
  ...(user.experimentationOptOutAt && {
    dd_experimentation_opt_out_at: user.experimentationOptOutAt,
  }),
})
const enabled = OpenFeature.getClient().getBooleanValue('new-route-planner', false)
```

| 模式 | 主题时间戳出现时的行为 |
| --- | --- |
| `Disabled` (默认) | 忽略属性 . |
| `Immediate` | 跳过记录实验暴露的每一个分配. |
| `FutureExperimentsOnly` | 严格在时间戳前保持接触量分配激活。 跳过缺少激活元数据 . |

使用 `ExperimentationOptOutMode.FutureExperimentsOnly` 在选择第二种策略的示例中. 为符合条件的科目输出属性. 对于被选出的主题,在支持的RFC3339子集中提供一个时间戳: `YYYY-MM-DDTHH:mm:ss` 可选小数分数,然后 `Z` 或数字 `+HH:mm` 或者说 `-HH:mm` 页:1. 小写 `t` 财务报告和审定财务报表 `z` 现予接受。 微分数位数超过纳米秒时会被切换而无需四舍五入. 譬如说, `2026-10-19T12:00:00Z`, (中文(简体) ), `2026-10-19T12:00:00.123456789Z`,或 `2026-10-19T08:00:00-04:00`。 。 。 . 使用有效的日历日期和秒 `00–59`。书面日期及其协调世界时的瞬间都必须有年份 `0000–9999`。 。 。 . 白空,命名的时区,Unicode标志,和跳跃秒被拒绝. 贾森 `randomizationActivatedAt` 值使用相同的格式,并在收到配置时验证。 制片人应与 `Z`。 。 。 . 无效的激活元数据返回 `PARSE_ERROR` 只在选择退出的标的物使用时 `FutureExperimentsOnly`。 。 。 . 无效启用的时间戳返回应用程序默认值 `INVALID_CONTEXT` 不发出转让请求. 单位 `Immediate` 模式,任何有效的时间戳,包括未来的时间戳,现在将该主体排除在曝光-博客分配之外. 单位 `FutureExperimentsOnly` 模式,SDK现在应用了截断:它使曝光-日志分配在时间戳前启动,并跳过在时间戳上或之后启动的,或缺少激活元数据. 因此,未来的截断使实验对象有资格在现在之后但在该截断之前开始试验。 比较保留了纳秒精度. 未来模式使用分配活性,而不是先入后出. 较老的拨款仍可首次分配一个科目. 坚持使用同样的政策。 删除属性后,可以再次进行实验.

被排除在外的主体跳过记录实验暴露的分配. 评价继续按现有顺序通过普通特征分配进行. 如果没有匹配,则应用程序收到其默认值. 跳过的分配不记录曝光 . 此选项不抑制评价遥测. 立即退出可以改变一个注册主体的经验;在实验分析中对此进行说明.

`DatadogCoreProvider` 接受同样的选项。 它在当地对基于规则的配置适用排除. 对于便携式预计算配置,将同一选项传递至 `fetchPrecomputedConfiguration` 和提供者:

```typescript
const optOut = { experimentationOptOutMode: ExperimentationOptOutMode.Immediate }
const provider = new DatadogCoreProvider(optOut)
provider.setConfiguration(
  await fetchPrecomputedConfiguration({
    ...optOut,
    clientToken: '<CLIENT_TOKEN>',
    env: 'production',
    context,
  })
)
```

预算交付需要后端支持. 退出请求发送 `evaluation_options.experimentation_opt_out_mode`。 。 。 . 立即答复确认 `experimentation_opt_out=true`未来的答复确认命名模式和准确的时间戳. 提供者拒绝来自不同主体、模式或选择退出时间戳的不支持的响应和缓存任务. 使用任一启用模式, `DatadogProvider` 拒绝为不同上下文获取的任务,包括 没有选择退出时间戳的主体。 在可用任务到达之前,评价返回应用程序默认值 与 `PROVIDER_NOT_READY`,包括在刷新失败后。 错误的退出时间戳返回 `INVALID_CONTEXT`。 。 。 . 与 `Disabled`,在上下文变化时仍可提供以前的任务. 对于可移植配置,应用程序仍然负责当上下文变化时取取取替换任务.

### 专题评价 遥测选择退出

创建提供者时启用控件 。 您的应用程序提供了它在评价背景中被打出布林的决定 .

```typescript
import { DatadogProvider } from '@datadog/openfeature-browser'
import { OpenFeature } from '@openfeature/web-sdk'

const provider = new DatadogProvider({
  clientToken: 'your-client-token',
  env: 'production',
  enableEvaluationTelemetryOptOutParameter: true,
})

await OpenFeature.setProviderAndWait(provider, {
  targetingKey: 'user-123',
  dd_evaluation_telemetry_opt_out: true,
})

const client = OpenFeature.getClient()
const enabled = client.getBooleanValue('new-feature', false)
```

只有布尔 `true` 压制新的评价活动,评价计数,以及自动的RUM旗下说明. 失踪、弄虚作假、无效和其他类型保持遥测。 没有明确的活化,属性不会抑制遥测.

使用 `OpenFeature.setContext()` 以更新决定。 保护主题及其其他属性:

```typescript
await OpenFeature.setContext({
  ...OpenFeature.getContext(),
  dd_evaluation_telemetry_opt_out: false,
})
```

其属性仍存在于评价的背景、任务要求和暴露属性中。 你可以用它来设定目标 改变它遵循正常上下文刷新路径,并且可以根据现有的分解规则产生另一种曝光.

遥测控制不凌驾于旗帜结果之上,不将实验对象排除在外,也不抑制接触。 使用此属性的目标规则可以改变任务. 客户钩和无关的应用遥测仍然不变。 控件不删除已队列的事件或已有的 RUM 注释 。 这不是一个普遍同意的制度。 接触和分配请求仍然可以包含主题数据.

对于便携式配置, 使用 `new DatadogCoreProvider({ enableEvaluationTelemetryOptOutParameter: true })`. 单独组成的Datadog评价和RUM跟踪钩符合供应商的政策。 接触钩仍然启用。 规则评价得到完整的背景。 在单独获取预计算配置时, 将相同的上下文, 包括此属性, 传递给 `fetchPrecomputedConfiguration` 和 OpenFeature 组合.

### RUM 用户上下文

当启用 RUM 集成( 默认) 时, 提供者包括平面原始属性 `DD_RUM.getUser()` 在OpenFeature评价背景下。 使用 RUM 用户ID 作为目标密钥, 而字段 明确设置通过 `OpenFeature.setContext()` 优先发言.

在注册提供者前初始化 RUM 用户 :

```javascript
DD_RUM.setUser({
  id: 'user-123',
  email: 'user@example.com',
  company_name: 'Example, Inc.',
})

await OpenFeature.setProviderAndWait(new DatadogProvider(configuration))
```

如果 RUM 用户在提供者初始化后更改, 请打电话 `await OpenFeature.setContext(OpenFeature.getContext())` 以调和提供者和最新用户,同时 保留明确配置的 OpenFeature 属性。 Nested RUM 用户属性不包含在 评估背景.

## 旗键模糊

请求 Datadog 预计算端点自动发送 `X-DD-FEATURE-FLAGS-CAPABILITIES: assignment-encoding-flag-key-256-v1`。 。 。 . 声明支持 `flag-key-sha256-v1` 响应编码. 数据犬控制它的服务器推出. 通过请求 `flaggingProxy` 不默认发送此信头。 代理所有者 可以选择通过 `customHeaders`。代理必须转发标题,并且 在允许申请之前,应先在CORS回复中注明. 提供者接受简单易懂和含混不清的答复,而不 应用程序配置更改.

继续评价原旗下密钥. 共享核心把它和 反应的公开盐 在检查前。 旗帜值不变。 评价 细节,曝光事件,以及 RUM 说明保留了原始的旗下密钥. 可移植 配置和索引DB存储保留带有任务的说明符. 不支持或格式错误的编码被拒绝,而不是被解释为平正文字.

被编码的可移植快照使用有线2版,而老读者拒绝. 平面文字和只限规则的快照保留了第1版. 新读者接受两个版本. 这个版本适用于SDK序列化,而不适用于Precompute API响应.

新的索引DB对两种响应格式都使用单独的缓存取名空间. 旧的 SDK 无法读取新命名空间中的任何条目, 包括平正文本 . 新建 SDK 可以读取遗留的纯文本 当新命名空间没有条目时。 纯文本推出回滚替换 新命名空间中编码的条目。 它不会更新一个更古老的SDK的缓存. 包含被编码的任务和规则的快照使用第2版. 年长的读者拒绝这整个快照, 包括其规则.

模糊去除可读的旗图密钥 。 这不是加密 授权, 或反应签名。 数值、变异名称、分配名称、遥测、, 而应用程序代码仍然可以揭示一个特征的目的. 别放敏感 包含 JSON 对象在内的客户端成像变量值中的信息.

## 便携式配置解析

默认切入点支持未包含的预计算配置 protobuf -ES的依赖。 基于规则的条目被忽略 :

```javascript
import { configurationFromString, DatadogProvider, getPrecomputedContext } from '@datadog/openfeature-browser'
import { OpenFeature } from '@openfeature/web-sdk'

const configuration = configurationFromString(wire)
const context = getPrecomputedContext(configuration)

const provider = new DatadogProvider({
  applicationId: 'app-id',
  clientToken: 'pub_...',
  site: 'datadoghq.com',
  env: 'production',
  initialFlagsConfiguration: configuration,
})

if (context !== undefined) {
  await OpenFeature.setProviderAndWait(provider, context)
} else {
  await OpenFeature.setProviderAndWait(provider)
}
```

基于规则的配置包含 SDK 本地评价的目标设定规则 对照OpenFeature评价语境,而不是预先计算一个语境的任务. 使用它们的应用程序可以选择进入全解析器及其Protobuf-ES依赖性 通过基于规则的切入点:

```javascript
import {
  configurationFromString,
  DatadogProvider,
  getPrecomputedContext,
} from '@datadog/openfeature-browser/rules-based'
```

### 使用可移植配置的 Datadog Core 提供器

`DatadogCoreProvider` 提供自己的旗帜配置的应用程序,例如SSR靴子或本地内载荷的最低限度只提供评价。 应用程序控制配置交付通过 `setConfiguration()`; 改变 OpenFeature 上下文不会获取或民意配置,提供者也不会安装跟踪钩或发送遥测.

对于静态初始化,特定上下文的预计算配置必须使用它所计算的OpenFeature上下文. 使用 `getPrecomputedContext()` 以通过支持的 API 访问解开的副本。 空上下文( N)`{}`)按字面处理,不选择嵌入上下文.

```javascript
import {
  configurationFromString,
  getPrecomputedContext,
  DatadogCoreProvider,
} from '@datadog/openfeature-browser/rules-based'
import { OpenFeature } from '@openfeature/web-sdk'

const configuration = configurationFromString('...flags configuration string...')
const provider = new DatadogCoreProvider()
provider.setConfiguration(configuration)
const context = getPrecomputedContext(configuration)

if (context === undefined) {
  await OpenFeature.setProviderAndWait(provider)
} else {
  await OpenFeature.setProviderAndWait(provider, context)
}

const client = OpenFeature.getClient()
const enabled = client.getBooleanValue('new-checkout', false)
```

对于动态上下文,请使用 `@datadog/openfeature-browser/rules-based` 入口和基于规则的配置线. 注册提供者后,使用 `OpenFeature.setContext()` 通常; 在本地评价上下文变化而不获取配置 .

发送相同的曝光、旗下评价和RUM跟踪事件与 `DatadogProvider`,将数据犬追踪钩子编成您需要的数据犬追踪钩子,并在 OpenFeature 中注册。 这只能使遥测运输——旗子配置仍然是应用程序管理。 只导入您的应用程序所使用的钩子工厂 .

```javascript
import {
  DatadogCoreProvider,
  createDatadogEvaluationLoggingHook,
  createDatadogExposureLoggingHook,
  createDatadogRumTrackingHook,
  composeDatadogTrackingHooks,
} from '@datadog/openfeature-browser/rules-based'

const trackingOptions = {
  clientToken: 'client-token',
  applicationId: 'application-id',
  site: 'datadoghq.com',
  service: 'storefront',
}

const tracking = composeDatadogTrackingHooks(
  createDatadogExposureLoggingHook(trackingOptions),
  createDatadogEvaluationLoggingHook(trackingOptions),
  createDatadogRumTrackingHook()
)

await tracking.initialize()

const provider = new DatadogCoreProvider()
provider.setConfiguration(configuration)

await OpenFeature.setProviderAndWait('datadog-core', provider, context)
const client = OpenFeature.getClient('datadog-core')
client.addHooks(...tracking.hooks)

// Later, when replacing the active flag configuration before another evaluation:
provider.setConfiguration(nextConfiguration)

// When this client no longer needs tracking:
client.clearHooks()
await tracking.shutdown()
```

`composeDatadogTrackingHooks()` 结合所提供的控制器的钩子和生命周期方法. 它不会自动初始化资源或用OpenFeature注册钩子. 构成结果(和每个接触控制器)将一个接触缓存暴露为 `exposureCache`传递给 `DatadogCoreProvider`是因为 `exposureCache` 选项,以基于规则的方式将曝光的分解裁决印出 [在自己的数据库中曝光](https://npmcn.com/package/%40datadog/openfeature-browser/#readme-exposures-in-your-own-data-store)。 。 。 .

接触控制器接受相同的 `trackExposures` 选项为 `DatadogProvider` (默认) `true`;被堕落者 `enableExposureLogging` 化名行为相同)。 与 `trackExposures: false` 它只运行记录: 没什么是 发送到 Datadog, 但共享缓存继续记录 `ExposureHook` 判决正确.

`tracking.initialize()` 装入曝光分解缓存并启动包含的钩子的传输器,定时器和订阅器. 曝光与评价钩子在初始化完成之前不收集事件;创建它们的控制器不会启动这些资源. 初始化是没有生命周期的钩子的禁入,如RUM跟踪.

`tracking.shutdown()` 冲出待曝光/评价事件,并停止定时和订阅。 已经交给浏览器传输的请求仍然可能完成或重试 。 两种生命周期方法都具有一能性,在关闭后开始再次跟踪,而不清理,暴露的分解性持续存在。 个人接触和评价控制器也暴露出这些方法。 使用寿命周期失败不会中断旗下评价.

应用程序拥有手动注册的钩子: 清除客户端钩子或去除 `DatadogCoreProvider` 没有关闭他们的资源。 取消注册,打电话 `tracking.shutdown()` 当它们不再需要的时候。 经常预算 `DatadogProvider` 通过OpenFeature的提供商生命周期关闭自己的跟踪资源.

预先计算的任务保留了现有的曝光-重置行为,用于平白文字和模糊的反应. 在新鲜的, `DatadogProvider` 清除先前装入时的曝光分解 `createdAt` 变化. 没有初始配置, 无法在第一个获取中清晰 . `DatadogCoreProvider` 包括暴露分解中的配置身份。 替换配置, 包括已更改的 `createdAt` 或者弄脏了盐 允许再次接触. 重新应用同一种配置会保留去除. 在应用程序评估出一面旗帜之前,供应商都无法透露曝光信息. `createdAt` 是一个配置时间戳,不是实验修改。 这种行为并不取决于每个请求的变化.

曝光缓存每个范围保留了多达5万个条目,与节点提供者的极限相匹配. 曝光检查使用有界限的内存缓存. 背景 索引 DB 交易合并新记录的曝光 和存储的条目一起,所以共享一个范围的实例可以保存对方的写作,而不重放所装的快照. 内存去除最近使用最少的条目;持续到极限时会去除最古老的书面条目. 被删除的条目可以产生另一种暴露. 清理范围存储一个空缓存并加注无效计数器 。 其他驳回或再审的案件 写一个更古老的柜台。 在他们的下个写入时,它们会丢弃已失效的内存和待取的条目,再装入当前缓存. 这会造成重复暴露。 其他标签的内存缓存没有立即更新,并行的标签仍然可以日志 同样的暴露。 缓存可以减少重复;它不能保证在标签之间精确地进行记录. 如果索引DB不可用或存储操作失败,则评价和内质分解仍在继续. 突然的页出可以丢失一个未完成的写入并允许在重新装入后重复曝光.

对于基于规则的配置, `DatadogCoreProvider` 还包括规则配置身份. 被修改的规则允许新的曝光,而无需清除应用程序管理的钩子状态. 检索元数据`fetchedAt` 财务报告和审定财务报表 `etag`)和服务器的 `createdAt` 构建时间戳不会改变这种身份。 这些字段仍然可用在配置及其便携式电线说明上.

独立的暴露钩和 `DatadogProvider` 通过遥测站点、客户代号、代理 URL、环境、应用程序、服务和源源,范围持续曝光缓存。 范围值被散列入存储名片空间;原始符号不存储在缓存密钥中. 重造出一个具有相同范围的钩子保留了分解,而另一个目的地可以释放出自己的暴露. 已存在的本地Storage和Chrome存储条目不迁移或删除,因此升级可以产生重复曝光. 函数值的遥测代号使用只存储器的分解,因为其去向无法从回调器的身份中可靠地推断出.

为了排除其中的一种整合,将钩子工厂从进口清单和进口清单中删去 `composeDatadogTrackingHooks()` 电话.

## 最终用户许可证协议

[https://www.datadoghq.com/legal/eula 互联网档案馆的存檔,存档日期2013-12-02](https://www.datadoghq.com/legal/eula)

## 常见问题

### @datadog/openfeature-browser 是什么？

OpenFeature 的浏览器特定绑定\( raps @ datadog/ openfeature- core\)

### 如何安装 @datadog/openfeature-browser？

在项目目录运行 npm install @datadog/openfeature-browser，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@openfeature/core（^1\.9\.2）、@openfeature/web-sdk（^1\.5\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @datadog/openfeature-browser 支持 TypeScript 吗？

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

### @datadog/openfeature-browser 支持 ESM 还是 CommonJS？

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

### @datadog/openfeature-browser 可以商用吗？

@datadog/openfeature-browser 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @datadog/openfeature-browser 的下载量有多少？

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

### @datadog/openfeature-browser 还在维护吗？

最新版本 2\.3\.0 发布于 2026/10/30（12 天前）；至今共发布 47 个版本，其中过去 12 个月发布了 21 个；首次发布于 2025/07/01。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

