# Node.js/NPM

如果您需要更多控制并希望在应用层进行操作，您可以从 npm 安装 GitBook embed 包。此方法非常适合服务端渲染、构建时集成或自定义 iframe 管理。

## 步骤

{% stepper %}
{% step %}

#### 安装包

添加 `@gitbook/embed` 到您的项目：

```bash
npm install @gitbook/embed
```

有关完整的 API 参考和源代码，请参阅 [`@gitbook/embed` GitHub 上的包](https://github.com/GitbookIO/gitbook/tree/main/packages/embed).
{% endstep %}

{% step %}

#### 导入包

在您的应用代码中，导入 `createGitBook` 函数：

```javascript
import { createGitBook } from "@gitbook/embed";
```

或者使用 CommonJS：

```javascript
const { createGitBook } = require("@gitbook/embed");
```

{% endstep %}

{% step %}

#### 初始化 GitBook

使用您的文档站点 URL 创建一个 GitBook 实例：

```javascript
const gitbook = createGitBook({
  siteURL: "https://docs.company.com",
});
```

{% endstep %}

{% step %}

#### 创建一个 iframe

生成一个 iframe 元素，并将其源设置为嵌入 URL：

```javascript
const iframe = document.createElement("iframe");
iframe.src = gitbook.getFrameURL({
  visitor: {
    token: 'your-jwt-token', // 可选：用于自适应内容或已认证访问
    unsignedClaims: { // 可选：用于动态表达式的自定义声明
      userId: '123',
      plan: 'premium'
    }
  }
});
iframe.id = "gitbook-embed-container";
iframe.style.border = "none";
iframe.style.width = "100%";
iframe.style.height = "600px";
```

{% endstep %}

{% step %}

#### 附加该框架

创建一个 GitBook 框架实例并将其挂载到您的页面：

```javascript
const frame = gitbook.createFrame(iframe);
document.getElementById("gitbook-embed-container").appendChild(iframe);
```

{% endstep %}

{% step %}

#### 以编程方式控制嵌入

使用框架实例与嵌入内容交互：

```javascript
// 导航到文档选项卡中的特定页面
frame.navigateToPage("/getting-started");

// 切换到助手选项卡
frame.navigateToAssistant();

// 向聊天发送消息
frame.postUserMessage("How do I get started?");

// 清除聊天记录
frame.clearChat();
```

{% endstep %}

{% step %}

#### 配置嵌入

使用自定义选项配置嵌入：

```javascript
frame.configure({
  trademark: false,
  tabs: ['assistant', 'search', 'docs'],
  actions: [
    {
      icon: 'circle-question',
      label: 'Contact Support',
      onClick: () => window.open('https://support.example.com', '_blank')
    }
  ],
  greeting: { title: 'Welcome!', subtitle: 'How can I help?' },
  suggestions: ['What is GitBook?', 'How do I get started?'],
  tools: [/* ... */]
});
```

{% endstep %}

{% step %}

#### 监听事件

注册事件监听器以响应嵌入事件：

```javascript
frame.on('close', () => {
  console.log('Frame closed');
});

// 完成后取消订阅
const unsubscribe = frame.on('navigate', (data) => {
  console.log('Navigated to:', data.path);
});
```

{% endstep %}
{% endstepper %}

## API 参考

### 客户端工厂

* `createGitBook(options: { siteURL: string })` → `GitBookClient`
* `client.getFrameURL(options?: { visitor?: {...}, colorScheme?: 'light' | 'dark' })` → `string` - 获取带可选框架选项的 iframe URL
* `client.createFrame(iframe: HTMLIFrameElement)` → `GitBookFrameClient` - 创建一个用于与 iframe 通信的框架客户端

### 框架客户端方法

* `frame.navigateToPage(path: string)` → `void` - 导航到文档选项卡中的特定页面
* `frame.navigateToAssistant()` → `void` - 切换到助手选项卡
* `frame.postUserMessage(message: string)` → `void` - 向聊天发送消息
* `frame.clearChat()` → `void` - 清除聊天记录
* `frame.configure(settings: Partial<GitBookEmbeddableConfiguration>)` → `void` - 配置嵌入
* `frame.on(event: string, listener: Function)` → `() => void` - 注册事件监听器（返回取消订阅函数）

## 配置选项

大多数自定义选项可通过以下方式使用： `frame.configure({...})`.

#### `tabs`

覆盖显示哪些选项卡。

搜索默认启用。如果您设置 `tabs`，则嵌入内容仅显示您列出的选项卡。

* **类型**: `('assistant' | 'search' | 'docs')[]`

#### `actions`

在侧边栏中与选项卡并排渲染的自定义操作按钮。每个操作按钮在点击时都会触发一个回调。

**注意**：这之前名为 `buttons`。请改用 `actions` 。

* **类型**: `Array<{ icon: string, label: string, onClick: () => void }>`

#### `greeting`

在助手选项卡中显示的欢迎消息。

* **类型**: `{ title: string, subtitle: string }`

#### `suggestions`

在助手欢迎界面中显示的建议问题。

* **类型**: `string[]`

#### `trademark`

在嵌入 UI 中显示或隐藏 GitBook 商标——包括 Docs Embed 页脚和 Assistant 品牌标识。

* **类型**: `boolean`
* **默认值**: `true`

#### `tools`

用于扩展助手的自定义 AI 工具。详见 [创建自定义工具](https://gitbook-v2-lrp5kto0w-gitbook.vercel.app/url/gitbook.com/docs/documentation/zh/docs-site/embedding/configuration/creating-custom-tools) 了解详情。

* **类型**: `Array<{ name: string, description: string, inputSchema: object, execute: Function, confirmation?: {...} }>`&#x20;

### 框架 URL 选项

某些选项会传递给 `getFrameURL({...})`.

#### `colorScheme`

覆盖嵌入的配色方案。

如果省略，嵌入将遵循 iframe 的 CSS `color-scheme`，从而继承父页面或浏览器偏好。

* **类型**: `'light' | 'dark'`

### `visitor` （已认证访问）

传递给 `getFrameURL({ visitor: {...} })`。用于 [自适应内容](https://gitbook-v2-lrp5kto0w-gitbook.vercel.app/url/gitbook.com/docs/documentation/zh/site-access/adaptive-content) 和 [已认证访问](https://gitbook-v2-lrp5kto0w-gitbook.vercel.app/url/gitbook.com/docs/documentation/zh/site-access/authenticated-access).

* **类型**: `{ token?: string, unsignedClaims?: Record<string, unknown> }`

## 常见问题

* **忘记安装包** – 在导入之前运行 `npm install @gitbook/embed` 。
* **缺少 siteURL** – `siteURL` 选项是必需的，并且必须与您已发布的文档站点匹配。
* **iFrame 未渲染** – 确保父容器具有足够的宽度/高度以显示 iframe。
* **在初始化前调用了框架方法** – 等待 `createFrame()` 完成后再调用框架方法。
* **未取消订阅事件** – 记得调用由 `frame.on()` 返回的取消订阅函数，以防止内存泄漏。
* **使用旧版 API 方法** – 诸如 `open()`, `close()`, `toggle()`以及 `destroy()` 之类的方法在 NPM 包中不可用。请改用框架客户端方法。
