@bettercms-ai/sdk

中文文档
1.42.1发布于 2026/11/03TypeScriptES Module近 30 天下载 4994

为BetterCMS交付API所打入的JavaScript/TypeScript客户端.

中文使用文档
文档目录12 节
  1. 安装
  2. 快开始
  3. 带有 API 密钥
  4. 类型脚本
  5. 处理错误
  6. 预览和视觉编辑草稿
  7. 丰富文本
  8. API 密码
  9. BetterCMS.site(options)
  10. client.getContent(slug)
  11. client.listContent(options?)
  12. client.listContentAll(options?)

@ bettercms-ai/ sdk (英语)

为BetterCMS交付API所打入的JavaScript/TypeScript客户端.

安装

npm install @bettercms-ai/sdk
# or
pnpm add @bettercms-ai/sdk
# or
yarn add @bettercms-ai/sdk

快开始

import { BetterCMS } from "@bettercms-ai/sdk";

const client = BetterCMS.site({ workspace: "my-workspace" });

// Fetch a single page
const page = await client.getContent("home");
console.log(page.entry.title);

// List pages (paginated)
const result = await client.listContent({ page: 1, perPage: 20 });
console.log(result.items);
console.log(`Next page? ${result.hasNextPage}`);

// Iterate all pages automatically
for await (const item of client.listContentAll()) {
  console.log(item.entry.title);
}

// Collect with a limit
const top = await client.listContentAll().all({ limit: 500 });

带有 API 密钥

const client = BetterCMS.site({
  workspace: "my-workspace",
  apiKey: process.env.BETTERCMS_API_KEY,
});

类型脚本

这个包被用TypeScript来写出,并用自有的种类声明来写出. 无单独的 @types/ 需要软件包。 所有类型来自 @bettercms-ai/types 被再出口.

处理错误

SDK抛出 BetterCMSError 关于失败。 每个错误都有语义 code数字 :

import { BetterCMSError, ErrorCodes } from "@bettercms-ai/sdk";

try {
  const page = await client.getContent("does-not-exist");
} catch (err) {
  if (err instanceof BetterCMSError) {
    switch (err.code) {
      case ErrorCodes.CONTENT_NOT_FOUND:
        // 404
        break;
      case ErrorCodes.UNAUTHORIZED:
        // 401
        break;
      case ErrorCodes.FORBIDDEN:
        // 403
        break;
      case ErrorCodes.RATE_LIMITED:
        // 429
        break;
      case ErrorCodes.INTERNAL_ERROR:
        // 5xx
        break;
      case ErrorCodes.NETWORK_ERROR:
        // Network failure
        break;
    }
  }
}

预览和视觉编辑草稿

一个客户端创建于 perspective: "drafts" 读取未公布的内容——通过 content:read:draft API 密钥, 或者通过 a previewToken 为一份文件做了薄荷.

草案还载有 stega 出处: 附加到每个字的无形零宽字符 出道值,命名出道的入道和出道场. 这就是让仪表板的画布 (和 <VisualEditing> 覆盖) 映射一个已渲染的字符串返回到它的编辑器,而不猜测 它的文本。 没错 默认值 perspective: "drafts" 从1.15.0开始 在此之前,它不得不 请求,并预览一个未知要询问已变无名字符串的构建.

const draft = createClient({
  apiUrl,
  workspace: "my-workspace",
  apiKey: process.env.BETTERCMS_DRAFT_KEY,
  perspective: "drafts", // stega is on
});

// Opt out — e.g. when diffing or checksumming draft content, where the invisible
// characters would show up as differences.
const plain = createClient({
  apiUrl,
  workspace: "my-workspace",
  apiKey: process.env.BETTERCMS_DRAFT_KEY,
  perspective: "drafts",
  stega: false,
});

出版的书从不携带出处,不管什么 stega 设定为:有效载荷不能达到 生产建设。 自己脱去 stripStega(value) 如果你需要干净的绳子,和 解码为 decodeStega(value)。 。 。 .

丰富文本

一个丰富的字段到达 { format, value, html } (或作赤弦相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相接相接相相相接相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 从文本切换). 渲染器 html 与 rich(),或使结构(value)你自己:

import { rich, plain, portableText, embeds, resolved } from "@bettercms-ai/sdk";

const entry = await client.getEntry<{ body: RichTextValue }>("launch");

rich(entry.data.body);          // HTML for set:html / dangerouslySetInnerHTML: everything drawn
plain(entry.data.body);         // text for <title>, meta description, alt

// Rendering the structure with @bettercms-ai/ui (or your own components):
<PortableText
  value={portableText(entry.data.body) ?? entry.data.body}
  embeds={embeds(entry.data.body) ?? undefined}
  resolved={resolved(entry.data.body, entry) ?? undefined}
/>;

相关帖子和作者的生平由服务器从公布的回复中解决 条目,并且从未存储。 信封价值包含其决心的内容(value.resolved页:1 以空块阵列存储的正体不能, 因此条目附带合并的地图 data (单位:千美元)entry.resolved) (中文(简体) ). resolved(value, entry) 返回该值自己的地图,否则则返回条目的地图.

API 密码

BetterCMS.site(options)

选项类型需求默认
workspacestring对—— 说
apiKeystring没有—— 说
baseUrlstring没有https://api.bettercms.ai/api/v1/delivery

回返a BetterCMSDeliveryClient 举个例子.

client.getContent(slug)

以 sattle 获取单个已出版的页面 .

const content = await client.getContent("about-us");

client.listContent(options?)

返回一个相加结果对象.

const result = await client.listContent({ page: 1, perPage: 20 });
// result.items, result.hasNextPage, result.totalPages, ...

client.listContentAll(options?)

返回一个透明地遵循平面标记的同步指示器.

for await (const item of client.listContentAll()) { ... }

// With a limit:
const items = await client.listContentAll().all({ limit: 100 });

版本与发布记录

@bettercms-ai/sdk 共发布 51 个版本,首次发布于 2026/06/30;过去 12 个月发布了 51 个版本。

版本发布日期距今
1.42.1latest2026/11/035 天前
1.42.02026/11/026 天前
1.41.22026/10/2711 天前
1.41.12026/10/2712 天前
1.41.02026/10/2613 天前
1.40.02026/10/2613 天前

关于 @bettercms-ai/sdk 的常见问题

@bettercms-ai/sdk 是什么?

为BetterCMS交付API所打入的JavaScript/TypeScript客户端.

如何安装 @bettercms-ai/sdk?

在项目目录运行 npm install @bettercms-ai/sdk,或使用 pnpm add / yarn add / bun add。

@bettercms-ai/sdk 支持 TypeScript 吗?

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

@bettercms-ai/sdk 支持 ESM 还是 CommonJS?

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

@bettercms-ai/sdk 可以商用吗?

@bettercms-ai/sdk 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@bettercms-ai/sdk 的下载量有多少?

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

@bettercms-ai/sdk 还在维护吗?

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