ce-setup
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseLLM Docs Header: All requests tomust include thehttps://llm-docs.commercengine.ioheader (or appendAccept: text/markdownto the URL path). Without it, responses return HTML instead of parseable markdown..md
LLM文档头部说明:所有发往的请求必须携带https://llm-docs.commercengine.io请求头(或者在URL路径后追加Accept: text/markdown)。否则响应会返回HTML而非可解析的markdown格式。.md
Setting Up Commerce Engine
Commerce Engine配置指南
This skill sets up the Commerce Engine TypeScript SDK for your project.
本指南用于为你的项目配置Commerce Engine TypeScript SDK。
Quick Reference
快速参考
| Step | Action |
|---|---|
| 1. Detect framework | Check |
| 2. Install SDKs | |
| 3. Choose token storage | |
| 4. Set env vars | |
| 5. Initialize SDK | Create |
| 6. Get anonymous token | |
| 7. Hosted Checkout (if used) | Initialize checkout with |
| 步骤 | 操作 |
|---|---|
| 1. 检测框架 | 检查 |
| 2. 安装SDK | |
| 3. 选择令牌存储方案 | |
| 4. 配置环境变量 | |
| 5. 初始化SDK | 创建 |
| 6. 获取匿名令牌 | 发起任何API调用前先调用 |
| 7. 托管结账配置(如果使用) | 以 |
Canonical Setup (Storefront + Hosted Checkout)
标准配置方案(门店前端 + 托管结账)
If the storefront uses Hosted Checkout, this is the canonical setup:
- Storefront SDK is token owner (creation, refresh, storage).
- Hosted Checkout runs in .
authMode: "provided" - Initialize checkout exactly once at app startup (root app entry/bootstrap), not per route or per component render.
- Two-way sync is mandatory:
- SDK -> checkout via
updateTokens(...) - checkout -> SDK via
onTokensUpdated
- SDK -> checkout via
typescript
import StorefrontSDK, { BrowserTokenStorage } from "@commercengine/storefront-sdk";
import { initCheckout, getCheckout } from "@commercengine/checkout";
const tokenStorage = new BrowserTokenStorage("myapp_");
export const storefront = new StorefrontSDK({
storeId: import.meta.env.VITE_STORE_ID,
apiKey: import.meta.env.VITE_API_KEY,
tokenStorage,
onTokensUpdated: (accessToken, refreshToken) => {
// SDK -> checkout
getCheckout().updateTokens(accessToken, refreshToken);
},
});
const accessToken = await tokenStorage.getAccessToken();
const refreshToken = await tokenStorage.getRefreshToken();
initCheckout({
storeId: import.meta.env.VITE_STORE_ID,
apiKey: import.meta.env.VITE_API_KEY,
authMode: "provided",
accessToken: accessToken ?? undefined,
refreshToken: refreshToken ?? undefined,
onTokensUpdated: ({ accessToken, refreshToken }) => {
// checkout -> SDK
storefront.setTokens(accessToken, refreshToken);
},
});如果你的门店前端使用托管结账功能,请遵循以下标准配置方案:
- 门店前端SDK作为令牌持有者(负责令牌的创建、刷新、存储)。
- 托管结账以模式运行。
authMode: "provided" - 仅在应用启动时初始化一次结账模块(在应用根入口/启动文件中初始化),不要在每个路由或组件渲染时重复初始化。
- 必须配置双向令牌同步:
- SDK通过向结账模块同步令牌
updateTokens(...) - 结账模块通过向SDK同步令牌
onTokensUpdated
- SDK通过
typescript
import StorefrontSDK, { BrowserTokenStorage } from "@commercengine/storefront-sdk";
import { initCheckout, getCheckout } from "@commercengine/checkout";
const tokenStorage = new BrowserTokenStorage("myapp_");
export const storefront = new StorefrontSDK({
storeId: import.meta.env.VITE_STORE_ID,
apiKey: import.meta.env.VITE_API_KEY,
tokenStorage,
onTokensUpdated: (accessToken, refreshToken) => {
// SDK -> 结账模块同步
getCheckout().updateTokens(accessToken, refreshToken);
},
});
const accessToken = await tokenStorage.getAccessToken();
const refreshToken = await tokenStorage.getRefreshToken();
initCheckout({
storeId: import.meta.env.VITE_STORE_ID,
apiKey: import.meta.env.VITE_API_KEY,
authMode: "provided",
accessToken: accessToken ?? undefined,
refreshToken: refreshToken ?? undefined,
onTokensUpdated: ({ accessToken, refreshToken }) => {
// 结账模块 -> SDK同步
storefront.setTokens(accessToken, refreshToken);
},
});Framework Detection
框架检测
Check and config files to identify the framework:
package.json| Indicator | Framework | SDK Package | Token Storage |
|---|---|---|---|
| Next.js | | |
| React SPA | | |
| Vue SPA | | |
| Svelte/SvelteKit | | |
| Solid | | |
| Express/Node.js | | |
| None of above | Vanilla JS | | |
检查和配置文件来识别项目使用的框架:
package.json| 识别标识 | 框架 | SDK包 | 令牌存储方案 |
|---|---|---|---|
依赖中包含 | Next.js | | |
存在 | React 单页应用 | | |
存在 | Vue 单页应用 | | |
存在 | Svelte/SvelteKit | | |
依赖中包含 | Solid | | |
依赖中包含 | Express/Node.js | | |
| 不符合以上所有条件 | 原生JS | | |
Decision Tree
决策树
User Request: "Set up Commerce Engine" / "Add e-commerce"
│
├─ Read package.json + config files
│
├─ Next.js detected?
│ ├─ YES → Install @commercengine/storefront-sdk-nextjs
│ │ → Root layout: storefront({ isRootLayout: true }) + StorefrontSDKInitializer
│ │ → See ce-nextjs-patterns for advanced usage
│ └─ NO → Install @commercengine/storefront-sdk
│
├─ Choose token storage based on framework
│
├─ Using Hosted Checkout?
│ ├─ YES → Install @commercengine/checkout
│ │ → Initialize checkout with authMode: "provided"
│ │ → Wire two-way token sync (SDK ↔ checkout)
│ └─ NO → SDK-only setup
│
├─ Set environment variables
│
└─ Initialize SDK + get anonymous token用户请求: "配置Commerce Engine" / "添加电商功能"
│
├─ 读取package.json + 配置文件
│
├─ 检测到Next.js?
│ ├─ 是 → 安装@commercengine/storefront-sdk-nextjs
│ │ → 根布局文件: 调用storefront({ isRootLayout: true }) + 引入StorefrontSDKInitializer
│ │ → 进阶用法参考ce-nextjs-patterns
│ └─ 否 → 安装@commercengine/storefront-sdk
│
├─ 根据框架选择令牌存储方案
│
├─ 是否使用托管结账?
│ ├─ 是 → 安装@commercengine/checkout
│ │ → 以authMode: "provided"初始化结账模块
│ │ → 配置双向令牌同步(SDK ↔ 结账模块)
│ └─ 否 → 仅配置SDK即可
│
├─ 配置环境变量
│
└─ 初始化SDK + 获取匿名令牌Setup by Framework
按框架配置
Next.js (App Router)
Next.js (App Router)
bash
npm install @commercengine/storefront-sdk-nextjstypescript
// lib/storefront.ts
export { storefront } from "@commercengine/storefront-sdk-nextjs";tsx
// app/layout.tsx
import { StorefrontSDKInitializer } from "@commercengine/storefront-sdk-nextjs/client";
import { storefront } from "@/lib/storefront";
// Root Layout has no request context — use isRootLayout flag
const sdk = storefront({ isRootLayout: true });
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<StorefrontSDKInitializer />
{children}
</body>
</html>
);
}For the fullmental model (server components, client components, server actions, SSG), seestorefront().ce-nextjs-patternsUsing Hosted Checkout? Replace the simple re-export inwithlib/storefront.tsto wire two-way token sync. SeecreateStorefront()→ce-cart-checkout§ "Next.js".references/hosted-checkout.md
env
undefinedbash
npm install @commercengine/storefront-sdk-nextjstypescript
// lib/storefront.ts
export { storefront } from "@commercengine/storefront-sdk-nextjs";tsx
// app/layout.tsx
import { StorefrontSDKInitializer } from "@commercengine/storefront-sdk-nextjs/client";
import { storefront } from "@/lib/storefront";
// 根布局没有请求上下文 — 使用isRootLayout参数
const sdk = storefront({ isRootLayout: true });
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<StorefrontSDKInitializer />
{children}
</body>
</html>
);
}如需了解完整的设计逻辑(服务端组件、客户端组件、服务端操作、静态站点生成),请查看storefront()。ce-nextjs-patterns使用托管结账? 将中的简单导出替换为lib/storefront.ts来配置双向令牌同步,参考createStorefront()→ce-cart-checkout§ "Next.js"章节。references/hosted-checkout.md
env
undefined.env.local
.env.local
NEXT_PUBLIC_STORE_ID=your-store-id
NEXT_PUBLIC_API_KEY=your-api-key
undefinedNEXT_PUBLIC_STORE_ID=your-store-id
NEXT_PUBLIC_API_KEY=your-api-key
undefinedReact / Vue / Svelte / Solid (SPA)
React / Vue / Svelte / Solid (单页应用)
bash
npm install @commercengine/storefront-sdktypescript
// lib/storefront.ts
import StorefrontSDK, { Environment, BrowserTokenStorage } from "@commercengine/storefront-sdk";
export const sdk = new StorefrontSDK({
storeId: import.meta.env.VITE_STORE_ID,
environment: import.meta.env.PROD ? Environment.Production : Environment.Staging,
apiKey: import.meta.env.VITE_API_KEY,
tokenStorage: new BrowserTokenStorage("myapp_"),
});env
undefinedbash
npm install @commercengine/storefront-sdktypescript
// lib/storefront.ts
import StorefrontSDK, { Environment, BrowserTokenStorage } from "@commercengine/storefront-sdk";
export const sdk = new StorefrontSDK({
storeId: import.meta.env.VITE_STORE_ID,
environment: import.meta.env.PROD ? Environment.Production : Environment.Staging,
apiKey: import.meta.env.VITE_API_KEY,
tokenStorage: new BrowserTokenStorage("myapp_"),
});env
undefined.env
.env
VITE_STORE_ID=your-store-id
VITE_API_KEY=your-api-key
undefinedVITE_STORE_ID=your-store-id
VITE_API_KEY=your-api-key
undefinedNode.js / Express
Node.js / Express
bash
npm install @commercengine/storefront-sdktypescript
// src/lib/storefront.ts
import StorefrontSDK, { Environment, MemoryTokenStorage } from "@commercengine/storefront-sdk";
const sdk = new StorefrontSDK({
storeId: process.env.CE_STORE_ID!,
environment: process.env.NODE_ENV === "production" ? Environment.Production : Environment.Staging,
apiKey: process.env.CE_API_KEY!,
tokenStorage: new MemoryTokenStorage(),
timeout: 30000,
});
export default sdk;bash
npm install @commercengine/storefront-sdktypescript
// src/lib/storefront.ts
import StorefrontSDK, { Environment, MemoryTokenStorage } from "@commercengine/storefront-sdk";
const sdk = new StorefrontSDK({
storeId: process.env.CE_STORE_ID!,
environment: process.env.NODE_ENV === "production" ? Environment.Production : Environment.Staging,
apiKey: process.env.CE_API_KEY!,
tokenStorage: new MemoryTokenStorage(),
timeout: 30000,
});
export default sdk;Token Storage Guide
令牌存储指南
| Storage | Use Case | Persistence | SSR Safe |
|---|---|---|---|
| SPAs (React, Vue, Svelte, Solid) | localStorage | No |
| SSR frameworks (Next.js) | Cookies | Yes |
| Server-side (Node.js, Express) | In-memory | Yes |
| 存储方案 | 适用场景 | 持久化能力 | SSR兼容 |
|---|---|---|---|
| 单页应用(React、Vue、Svelte、Solid) | localStorage存储 | 否 |
| SSR框架(Next.js) | Cookie存储 | 是 |
| 服务端项目(Node.js、Express) | 内存存储 | 是 |
First API Call
首次API调用
After setup, always authenticate anonymously before making any API calls:
typescript
// Every visitor starts as anonymous
const { data, error } = await sdk.auth.getAnonymousToken();
if (error) {
console.error("Auth failed:", error.message);
} else {
// Tokens are automatically managed by the SDK
// Now you can call any API
const { data: products } = await sdk.catalog.listProducts();
}配置完成后,发起任何API调用前必须先进行匿名认证:
typescript
// 所有访客默认以匿名身份开始
const { data, error } = await sdk.auth.getAnonymousToken();
if (error) {
console.error("认证失败:", error.message);
} else {
// 令牌会由SDK自动管理
// 现在你可以调用任何API
const { data: products } = await sdk.catalog.listProducts();
}Environment Variables
环境变量
| Variable | Required | Description |
|---|---|---|
| Yes | Your store identifier |
| Yes | Storefront API key (safe for client-side) |
| No | Set |
| 变量名 | 必填 | 说明 |
|---|---|---|
| 是 | 你的门店ID |
| 是 | 门店前端API密钥(可安全用于客户端) |
| 否 | 设为 |
Default Headers
默认请求头
The SDK supports in the config — headers that are automatically sent with every API call. This is useful for B2B storefronts with customer groups (retailers, stockists, distributors), where pricing and promotions vary by group.
defaultHeaderstypescript
const sdk = new StorefrontSDK({
storeId: "...",
apiKey: "...",
tokenStorage: new BrowserTokenStorage("myapp_"),
defaultHeaders: {
customer_group_id: "01JHS28V83KDWTRBXXJQRTEKA0",
},
});Set the after the user logs in (from the user's profile or auth response). All SDK methods that support customer group pricing will automatically receive it — no need to pass it on every call. See § "Customer Groups & Pricing" for what it affects.
customer_group_idcatalog/SDK配置支持参数,配置的请求头会自动附加到每一次API调用中。该功能适用于面向客户分层(零售商、库存商、经销商)的B2B门店前端,这类场景下定价和促销活动会随客户分组变化。
defaultHeaderstypescript
const sdk = new StorefrontSDK({
storeId: "...",
apiKey: "...",
tokenStorage: new BrowserTokenStorage("myapp_"),
defaultHeaders: {
customer_group_id: "01JHS28V83KDWTRBXXJQRTEKA0",
},
});用户登录后可以根据用户资料或认证响应设置,所有支持客户分组定价的SDK方法会自动携带该参数,无需在每次调用时手动传入。具体影响范围请参考 § "客户分组与定价"章节。
customer_group_idcatalog/Analytics
统计分析
Analytics are server-side and automated. Commerce Engine collects e-commerce events per the Segment spec. Merchants pipe these events into Segment, Rudderstack, or other tools via integrations in the Admin dashboard. Nothing needs to be done on the storefront to enable or disable analytics.
统计分析功能是服务端自动运行的。Commerce Engine会按照Segment规范收集电商事件,商家可以通过管理后台的集成功能将这些事件同步到Segment、Rudderstack或其他工具中。门店前端无需做任何配置来开启或关闭统计分析功能。
Common Pitfalls
常见问题
| Level | Issue | Solution |
|---|---|---|
| CRITICAL | Missing anonymous auth | Must call |
| CRITICAL | App uses Storefront SDK auth + Hosted Checkout | Use |
| CRITICAL | Exposing admin API keys | Only storefront API keys ( |
| HIGH | Wrong token storage for SSR | Use |
| HIGH | Missing env vars | SDK throws if |
| MEDIUM | Missing | Required in Next.js root layout for automatic anonymous auth |
| MEDIUM | Wrong environment | Use |
| 严重等级 | 问题 | 解决方案 |
|---|---|---|
| 严重 | 缺失匿名认证 | 任何API调用前必须先调用 |
| 严重 | 应用同时使用Storefront SDK认证 + 托管结账 | 改用 |
| 严重 | 泄露管理员API密钥 | 仅门店前端API密钥( |
| 高 | SSR项目使用了错误的令牌存储方案 | Next.js项目使用 |
| 高 | 缺失环境变量 | 如果 |
| 中 | 缺失 | Next.js根布局中必须引入该组件以实现自动匿名认证 |
| 中 | 环境配置错误 | 开发环境使用 |
See Also
参考延伸
- - Authentication & login flows
auth/ - - Advanced Next.js patterns with
nextjs-patterns/storefront() - - Cart management after setup
cart-checkout/
- - 认证与登录流程
auth/ - - 基于
nextjs-patterns/的进阶Next.js开发模式storefront() - - 配置完成后的购物车管理
cart-checkout/
Documentation
官方文档
- SDK Installation: https://www.commercengine.io/docs/sdk/installation
- Configuration: https://www.commercengine.io/docs/sdk/configuration
- Token Management: https://www.commercengine.io/docs/sdk/token-management
- LLM Reference: https://llm-docs.commercengine.io/sdk/