@contentful/optimization-node

中文文档
2.2.1发布于 2026/11/06MITTypeScriptESM + CJS近 30 天下载 3691

内容优化节点.js SDK

中文使用文档
文档目录10 节
  1. 优化节点 SDK
  2. 开始
  3. 何时使用此软件包
  4. 通用配置
  5. 核心工作流程
  6. 请求范围的活动
  7. 内容分辨率
  8. 缓存引导
  9. 利用发展
  10. 相关

Contentful Logo

内容个性化分析

优化节点 SDK

指南 • 妇女 参考文献 • 妇女 捐款

优化节点 SDK 在顶端执行无国籍服务器端优化行为 优化核心 SDK。用于服务器渲染、服务器 ,以及需要请求范围剖面评价或事件排放的节点服务.

如果您正在整合一个节点应用程序, 请从 开始,然后使用 将优化节点SDK整合到节点应用中 为分步流出. 此 README 保持软件包取向和常见设置选项的关闭 手动; 生成 参考文件 仍为 导出 API 签名的真伪来源 .

[大

从v1升级? 跟着 v1-v2 迁移指南 在更改软件包版本之前.

目录

开始

使用与国家预防机制兼容的软件包管理器安装,例如:

pnpm add @contentful/optimization-node

添加 contentful 当SDK会使用你的应用软件时 contentful.js 用于管理条目的客户端 取来.

导入优化类;支持CJS和无害环境管理模块系统,无害环境管理优先:

import ContentfulOptimization from '@contentful/optimization-node'

每个模块或进程创建一次SDK,然后在每个路由中绑定同意并请求上下文:

const optimization = new ContentfulOptimization({
  spaceId: 'your-space-id',
  environment: 'master',
  locale: 'en-US',
})

function appPolicyAllowsOptimizationEvent(req: { cookies?: Record<string, string> }): boolean {
  return req.cookies?.['app-personalization-consent'] === 'granted'
}

async function renderRequest(
  req: { cookies?: Record<string, string>; headers: { 'accept-language'?: string } },
  profileId: string,
) {
  const appLocale = getAppLocale(req)
  const requestOptimization = optimization.forRequest({
    consent: {
      events: appPolicyAllowsOptimizationEvent(req),
      persistence: appPolicyAllowsOptimizationEvent(req),
    },
    locale: appLocale,
    eventContext: { locale: appLocale },
    profileId,
  })

  const { accepted, data } = await requestOptimization.page()

  return accepted ? data : undefined
}

何时使用此软件包

使用 @contentful/optimization-node 用于服务器侧渲染、服务器功能和节点服务 需要无国籍人特征评估或事件排放。 使用Web 或 反应Web SDK并列 当浏览器侧面同意、匿名ID持续、自动交互跟踪或实时更新时 属于同一应用程序的一部分.

通用配置

节点SDK是无国籍的 它不维持同意、配置或浏览器持续状态 在请求之间。 关于跨 SDK 同意指南,见 优化SDK套件中的同意管理。 。 。 .

选项需要吗?默认说明
spaceId对不详用于体验和透视 API 请求的空间标识符
environment没有'master'用于经验与洞察 API 请求的内容环境标识符
api没有参见下面的 API 选项API 和 Insights API 端点选项
app没有undefined将事件上下文附加的应用程序元数据
contentful没有undefined注册 contentful.js 客户端、 默认查询和缓存
locale没有undefined默认 SDK API 和事件本地化经验
fetchOptions没有SDK 默认获取超时并重试行为
allowedEventTypes没有['identify', 'page']批准请求前允许的事件类型
eventBuilder没有节点 SDK 默认SDK级作者的事件元数据覆盖
logLevel没有'error'默认控制台槽的最低日志级别

常见 api 选项:

选项需要吗?默认说明
experienceBaseUrl没有'https://experience.ninetailed.co/'经验 API 的基础 URL
insightsBaseUrl没有'https://ingest.insights.ninetailed.co/'透视 API 的基础 URL
enabledFeatures没有['ip-enrichment', 'location']适用于每项请求的 API 特性
location没有API 倒计时单向可见体验 API 变异的默认位置

请求范围的经验选项包含在 experienceOptions 当创建请求绑定时 客户端 :

选项说明
ip经验 API 使用的 IP 地址覆盖
location请求更换完整的位置 api.location 默认
locale本地化经验的本地化查询参数
plainText发送性能关键体验 API 端点作为文本
preflight汇总新配置文件状态而不存储

配置共享默认值 api.location,然后以 experienceOptions.location数字 :

const optimization = new ContentfulOptimization({
  spaceId: 'your-space-id',
  api: { location: { countryCode: 'DE', city: 'Berlin' } },
})
const requestOptimization = optimization.forRequest({
  consent: true,
  experienceOptions: { location: { countryCode: 'FR', city: 'Paris' } },
})
await requestOptimization.page()

请求值取代整个默认对象;它不会合并字段. 过 experienceOptions: { location: {} } 将配置的默认值替换为正空 位置而不是 API 地理定位。 活动 context.location 优先于匹配 请求字段。 空位置无法清除现有的配置文件位置, 并请求位置 不将位置锁定在以后的请求中。 见 位置输入和简介更新。 。 。 .

请求范围透视选项属于 insightsOptions数字 :

选项说明
beacon如果需要, 序列式 Insights API 批次的最后发件人 .

使用请求范围顶层 locale 打开 forRequest() 作为促进本地化的路径 体验 API 响应和默认事件上下文 . experienceOptions.locale 现为 高级低层通过,当 locale 未提供。 如果两者均提供,则请求 locale 赢了.

常见 fetchOptions 为: fetchMethod, (中文(简体) ), requestTimeout, (中文(简体) ), retries, (中文(简体) ), intervalTimeout, (中文(简体) ), onFailedAttempt,以及 onRequestTimeout。默认重试仅对 HTTP 适用 503 回应.

在路由器中选择应用程序 Contentful locale, i18n 层, 或者请求策略 。 传过去 值直接输入内容 CDA 请求,并将相同值传递给 forRequest({ locale: appLocale }) aPI响应和事件背景应使用 同样的语言。 合并引用本地化配置字段的标签, 如 location.city 财务报告和审定财务报表 location.country 然后用符合所提供内容的语言解决。 见 优化 SDK 套件中的位置处理 为完整的地方模型.

对于每个选项,回调有效载荷和输出类型,使用生成的 节点 SDK 参考。 。 。 .

核心工作流程

请求范围的活动

从收到的请求中构建事件上下文,将应用程序拥有的同意状态与 forRequest(),然后调用 page(), (中文(简体) ), identify(), (中文(简体) ), screen(), (中文(简体) ), track(),或粘着 trackView() 打开 返回的请求对象 :

import type { Request } from 'express'

app.get('/products/:slug', async (req, res) => {
  const appLocale = getAppLocale(req)
  const requestOptimization = optimization.forRequest({
    consent: {
      events: appPolicyAllowsOptimizationEvent(req),
      persistence: appPolicyAllowsOptimizationEvent(req),
    },
    locale: appLocale,
    eventContext: {
      locale: appLocale,
    },
    profileId: req.cookies.profileId,
  })
  const { accepted, data: optimizationData } = await requestOptimization.page({
    properties: { path: req.path },
  })

  if (accepted && requestOptimization.canPersistProfile && optimizationData?.profile.id) {
    persistProfileId(res, optimizationData.profile.id)
  }

  res.render('product', { optimizationData })
})

对于不使最终用户同意的默认应用政策,替换 接受同意后的特定请求同意查询:

const requestOptimization = optimization.forRequest({
  consent: { events: true, persistence: true },
  locale: appLocale,
  eventContext: { locale: appLocale },
  profile,
})

节点 SDK事件调用失败, 除了默认的事先同意的许可列表, identify 财务报告和审定财务报表 page。允许列入清单的事件与 context.gdpr.isConsentGiven: false 请求时 不给予同意。 过 allowedEventTypes: [] 需要严格的选择进入 无国籍事件方法.

在无国籍的运行时间, 非粘滞 trackView, (中文(简体) ), trackClick, (中文(简体) ), trackHover,以及 trackFlagView 需要一个完整的 Profile 通过 forRequest({ profile }) 或由经验返回 调用同一请求客户端。 使用 profileId aPI的连续性.

对于提交前需要事件有效载荷的自定义集成,使用请求客户端的 eventBuilder它会暴露 buildIdentify, (中文(简体) ), buildPageView, (中文(简体) ), buildScreenView,以及 buildTrack 带有请求事件上下文和语言默认值。 在这个例子中, appConsent, (中文(简体) ), appLocale, (中文(简体) ), appUserAgent,以及 appUserId 来源于您的申请请求和身份处理:

const requestOptimization = optimization.forRequest({
  consent: appConsent,
  locale: appLocale,
  eventContext: { userAgent: appUserAgent },
})
const identifyEvent = requestOptimization.eventBuilder.buildIdentify({ userId: appUserId })

建筑不发送事件、检查请求同意、援引拦截器或更新 请求配置或选择。 新建活动使用共享构建器 context.gdpr.isConsentGiven, (中文(简体) ), 这是 false 在节点SDK中,即使请求得到同意。 发送 identifyEvent 通过a 低级API不自动应用请求同意或SDK提交处理. 为了正常 提交, 使用请求 identify(), (中文(简体) ), page(), (中文(简体) ), screen(),或 track()单子 optimization.eventBuilder 任何要求都不受约束.

内容分辨率

当a contentful.js 客户端是可用的, 倾向于通过条目 ID 或内容类型获取 SDK 管理 还有口水 配置客户端一次, 然后调用 fetchOptimizedEntry() 在请求中的客户端上 在被接受的经验API呼叫后. forRequest() 客户端使用最新的选中优化 省去时; 单通呼叫需要明确 selectedOptimizations。 。 。 .

const optimization = new ContentfulOptimization({
  spaceId: 'space-id',
  contentful: { client: contentfulClient },
  environment: 'master',
  locale: appLocale,
})

const requestOptimization = optimization.forRequest({ consent: true, profile })
await requestOptimization.page()
const { baselineEntry, entry } = await requestOptimization.fetchOptimizedEntry({
  contentType: 'productPage',
  slug: req.params.slug,
  entryQuery: { locale: appLocale },
})

使用 fetchContentfulEntries() 或者说 prefetchManagedEntries() 当一个路由知道几个管理 输入来源。 弹出源接受 slugField 当内容模型不使用默认值时 slug 字段。 Slug 搜索执行内容类型、 字段选择器和双结果独有性限制 合并后 entryQuery;成功解析使用已获取条目的 sys.id. 分红 将规范化描述符嵌入 managedEntry 并保留该ID entryId. 同等身份证明 来源保留同干分批和100ID分块.

如果您的应用程序已经获取基线条目, 请继续使用手动解析器 :

const pageResult = await requestOptimization.page()
const resolvedEntry = optimization.resolveOptimizedEntry(
  baselineEntry,
  pageResult.accepted ? pageResult.data.selectedOptimizations : undefined,
)

在任意一条路径中使用一个 CDA 语言 。 对于本地化的应用程序,请配置您的应用程序本地化 。 A 类 请求的客户端用途 forRequest({ locale: appLocale }) 作为管理内容查询区域 当两个 contentful.defaultQuery 或每个呼叫的查询集 locale。将相同的值传递给 应用自有内容 CDA 请求和 forRequest({ locale: appLocale }) 当合并标签时 读取本地化配置字段与已提供条目语言相匹配。 不通过全本地 CDA 答复 withAllLocales 或者说 locale=*; 解析器期望直接的单地字段 数值。 见 条目个性化和变异分辨率 进入合同和 优化 SDK 套件中的位置处理 用于请求语言行为.

使用 getMergeTagValue() 富足富贵 文本合并标签和 getFlag() 自定义旗帜。 如果有的话 合并标签引用本地化配置字段, 如 location.city 或者说 location.country页:1 解析值遵循经验API返回的本地化配置数据。 节点SDK是 无国籍,所以 getFlag() 不自动放出旗帜视图跟踪.

缓存引导

应用层或SDK管理条目的内含载荷 缓存, 不是配置文件评价的 SDK 事件结果 。 使用 clearContentfulEntryCache() 当 SDK 时 实例必须删除缓存的 CDA 条目.

数据或呼叫请求缓存?原因
从 CDA 或 SDK 管理的条目缓存获取的原始内容条目对它们是内容快照,可以按请求解决
resolveOptimizedEntry() 财务报告和审定财务报表 getMergeTagValue() 结果仅当地请求结果取决于当前概况和优化数据
page(), (中文(简体) ), identify(), (中文(简体) ), screen(), (中文(简体) ), track()粘贴 trackView()没有这些调用执行副作用和返回请求特定配置
非粘贴 trackView(), (中文(简体) ), trackClick(), (中文(简体) ), trackHover(), (中文(简体) ), trackFlagView()没有这些调用释放出 Insights API 事件

这个 节点 SDK 集成指南 覆盖请求的上下文、配置持续性、内容输入分辨率以及混合节点+浏览器 设置细节.

利用发展

软件包本地 Dev 牵引装置来自 packages/node/node-sdk/dev/ 读取 .env 从此 软件包目录.

  1. 从 .env.example 创建或更新 packages/node/node-sdk/.env。 。 。 .

  2. 优先重现标准 PUBLIC_... 变量名称显示于 .env.example。 。 。 .

  3. 从 repo 根开始拉带 :

    pnpm --filter @contentful/optimization-node dev
    

版本与发布记录

@contentful/optimization-node 共发布 28 个版本,首次发布于 2026/02/03;过去 12 个月发布了 28 个版本。

版本发布日期距今
2.2.1latest2026/11/064 天前
2.2.02026/11/046 天前
2.1.12026/10/2220 天前
2.1.02026/10/1922 天前
2.0.22026/10/1625 天前
2.0.12026/09/231 个月前

其他发布通道:alpha → 0.1.0-alpha。

关于 @contentful/optimization-node 的常见问题

@contentful/optimization-node 是什么?

内容优化节点.js SDK

如何安装 @contentful/optimization-node?

在项目目录运行 npm install @contentful/optimization-node,或使用 pnpm add / yarn add / bun add。

@contentful/optimization-node 支持 TypeScript 吗?

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

@contentful/optimization-node 支持 ESM 还是 CommonJS?

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

@contentful/optimization-node 可以商用吗?

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

@contentful/optimization-node 的下载量有多少?

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

@contentful/optimization-node 还在维护吗?

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