@decocms/tanstack

中文文档
8.18.0发布于 2026/11/11TypeScriptES Module零依赖构建来源已验证近 30 天下载 2.5万

在 Cloudflare 工人上启动 TanStack 的 Deco CMS: 工人、 根文档、 路由器和 Vite 插件

中文使用文档
文档目录7 节
  1. 那个工人
  2. 草稿主机
  3. 访客、任务和客户
  4. 页面缓存
  5. 名称和工作室的起源
  6. 应用程序
  7. 图像

@ decocms/ tanstack (英语)

Deco CMS 用于 TanStack 启动 在Cloudflare工人的工地上, 部署德克部署他们的方式。 有观点认为:一个工人进入 有一些选择,一个逃出舱门 为你自己的路线, 和每个Deco TanStack网站应该有的行为, 总是在.

端点 : @decocms/blocks (同一个版本), @tanstack/react-start, (中文(简体) ), @tanstack/react-router, (中文(简体) ), react,以及 vite 页:1 /vite。 。 。 .

那个工人

// src/worker-entry.ts (wrangler.jsonc "main"), without a page cache
import { createDecoWorker } from "@decocms/tanstack/worker";
import handler, { createServerEntry } from "@tanstack/react-start/server-entry";
import { cms } from "./cms";

export default createDecoWorker({
  serverEntry: createServerEntry({ fetch: handler.fetch }),
  cms,
  dev: import.meta.env.DEV,
});

总是在: /deco/_liveness; 404 用于 v7 的管理员路径; Studio 可能设定站点(frame-ancestors,没有 X-Frame-Options和安全头; 草稿(CMS的预览主机, Cookie 草稿, 仅以低于 500 的回复设置; 任何请求带有 ?__draft=, (中文(简体) ), off 包含,或 cookie 草稿为预览: 它从未到达 pageCache 准确回答 Cache-Control: max-age=0, no-cache, must-revalidate, (中文(简体) ), Vary: Cookie 财务报告和审定财务报表 noindex,一个除指纹外的资产; 与无法读取的草稿的链接使得发布, 过期的饼干和显示 DecoPreview冷静的注意,永远不要500;CMS重定向;一 Set-Cookie 每块饼干; x-page-status· ; CDN-Cache-Control: no-store (a) 在每一份答复中均不提及 http.server.request.duration 在CMS的遥测中 recordServerRequest 从 @decocms/blocks/metrics (没有 token 或一个 endpoint标签 http.route (内容的页面模板, redirect 每一次CMS重定向,一个固定的如: /_serverFn/* 或者说 /assets/*,否则 unmatched, (中文(简体) ), http.request.method, (中文(简体) ), status_class, (中文(简体) ), cache (单位:千美元)DRAFT 预览; 否则 X-Cache  pageCache 回答说, HIT 页:1 HIT, (中文(简体) ), STALE-HIT 财务报告和审定财务报表 STALE-ERROR, (中文(简体) ), MISS,则 BYPASS和 device。 。 。 .

选项,每个值一个站点需要更改: csp, (中文(简体) ), pageCache, (中文(简体) ), preload 财务报告和审定财务报表 routes。 。 。 .

工人缓存没有页面:页面缓存是网站的,如Next.js. 无 pageCache 每一个请求都要求. 页面缓存 下面连接一个完整的工人条目和一个.

草稿主机

链接草案( A)?__draft=在 CMS 允许的主机上进行预览,其中 cms.readVersion 检查: 地址 Studio 写入当前发行的元数据 (previewHosts 内 latest.json这样 createCMS 需要网站的 site 给他们的)加 createCMS({ preview: { hosts } })。网站没有列出其他内容。 没有列表, 每个主机都会预览: 没有的网站 latest.json 尚未在CDN上发布,或者在 Studio 撰稿前发布 previewHosts (它下一次出版时会写列表),内容没有 site 除非 preview.hosts 列出主机( 如 ["localhost"]) (中文(简体) ). 若为 latest.json 无法读取( 网络错误, 5xx, 错误的文件) , 预览会保持关闭 preview.hosts,直到读取成功。 任何其它主机上的链接都会获得发布,永远不会出错. 同样的链接可以携带已公布的发行承诺SHA而不是草稿(Studio's "Preview this version"),其中任何一个可以携带预览时间(SHA)__at测试和运动开启或关闭(__test, (中文(简体) ), __campaign页:1 cms.readVersion 读作客户端的 date, (中文(简体) ), experiments 财务报告和审定财务报表 campaigns;所有这一切都通过同一个主机检查,所以现场的访客从不选择一个版本. 工人们将接受的版本 单独传送到应用程序 x-deco-version 请求标题( e)requestVersion(request) 读在一 routes 处理者)。 请求草案检查一次最新发布(cms.checkRelease():主机检查,工人阅读了草稿,其重定向和任务以及页面 contentClient 都等着那张支票 工友的身份证 x-deco-release-check (删除从外部发送的任何副本),所以一个预览请求会获取 latest.json 一次,并显示 发布片前一分钟.

访客、任务和客户

工人按要求在边缘决定一次。 在每一个页面和服务器功能请求中,它读取访问者 readVisitor 从 @decocms/blocks/experiments (单位:千美元) deco_segment 饼干,或者新访客, 然后每次测试和运动 上或下: readAssignments(cms, { visitor, ...version }),它解决了保存 experiments 财务报告和审定财务报表 campaigns 块通 cms.client({ visitor, version, date, experiments, campaigns }) 与工作室链接的版本, 瞬间和切换测试和运动。 它把访客放到应用程序上 x-deco-visitor 和决定的执行情况 x-deco-assignments,删除任何从外部发送的拷贝,以及提交网站的决定 pageCache 作为 page.assignments为了它的关键。 它只向访客发送第一次访问的饼干(没有身份证明的访客),从未从预览中发出.

contentClient(cms) 从 @decocms/tanstack/server 正在建设 cms.client({ version, experiments, campaigns }) 从头部,每个测试和运动 工人决定它, 所以页面使 精确的缓存键 和决定 不再; requestVersion(), (中文(简体) ), requestVisitor() 财务报告和审定财务报表 requestAssignments() 把它们交还给网站的密码 他们信任那些信头: createDecoWorker 他们持有工人的决定,因为它删除了从外部发送的任何副本。 在没有工人的情况下到达应用程序的请求(另一个条目,或一个不使用的应用程序) createDecoWorker)的读取方式相同,无论用什么 x-deco-version, (中文(简体) ), x-deco-visitor 财务报告和审定财务报表 x-deco-assignments 它随同而来;没有任何人,它的访客决定;没有一个人,每一次试验都停止。 要求通过工人, 和如何保护其他人, 是现场的呼声.

页面缓存

pageCache(page) 是该网站自己在应用程序周围的缓存。 工人们给每个页面和服务器功能请求都打电话 isCacheable 接受(a) GET 当前发布时没有 ?__draft= 外面没有饼干草稿 vite dev,没有 Authorization没有 /_build: 从未预览、草稿或旧版本),带有 page.request (随着应用程序得到它), page.url, (中文(简体) ), page.visitor (网页上的访客,包括第一次访问的新访问), page.assignments (每个测试和运动 或关闭,如页面使其), page.device, (中文(简体) ), env, (中文(简体) ), ctx 财务报告和审定财务报表 page.render(scope?),使页面。 从您的缓存中回复, 或者打电话 render(); 设置 X-Cache 回答请求的度量标准。 页面请求 Authorization 从来没有达到它和答案 Cache-Control: private, no-cache, no-store, must-revalidate所以没有共享缓存能保存一个呼叫器的页面.

访客的初访饼干从来不在什么 render() 返回:工人将其添加到任意 pageCache 答案,包含一个缓存副本。 所以存储的拷贝从不携带访客的饼干,从缓存服务的新访客仍然得到他们的. 永远不要存储设置其他饼干的响应.

关键需要,从 @decocms/tanstack/worker,名称与 @decocms/nextjs/proxy他们都在那里:

  • assignmentsKey(page.assignments): 测试和运动作为一串(x=<tests>|c=<campaigns>, (中文(简体) ), "" 没有,从来没有访客的身份证。 每个测试的同一边的访客共享一个条目,另一边得到自己的条目,一个运动开始或结束将每个页面移动到新条目. liveAssignmentKeys(cms) 列出当前可以携带的每个活请求键(每个被保存测试的子集,有运行中的运动,没有),以进行清洗.
  • cacheVersion(cms, buildHash, page.url)数字 : <build>.<content revision>,所以一个部署或发布的发布会立刻得到新的条目. 与 URL 相通, 修订版是页面制作的一页( 在发布之后, 前一页同时是页面的新块负载), 因此一个页面从未存储在它没有渲染的修订版下 .
  • detectDevice(userAgent) (v7的班级: mobile, (中文(简体) ), tablet, (中文(简体) ), desktop, (中文(简体) ), segmentKey(segment) (一个部分作为一个稳定的字符串)和 segmentToken(segment, version)页:1 __cseg 符号 。 通过它作为 render({ csegToken }) 财务报告和审定财务报表 DecoDocument 出版; decoServerFnFetch 在页面的导航数据上发回( p)CSEG_PARAM),而您的缓存可能会让CDN在符号与请求本身匹配时保留该响应.
  • isCacheable(request, { version, dev }), (中文(简体) ), requestVersion(request), (中文(简体) ), isServerFnPath(pathname), (中文(简体) ), serverFnPagePath(url) (服务器功能页面载荷要求的网页,从其有效载荷)和 DEGRADED_HEADER (一个装入器失败的页面:永远不存储).

一个完整的工人条目,有一个页面缓存 examples/tanstack-worker-smoke/src/worker-entry.ts: 复制给您 src/worker-entry.ts 并改变您的网站需要。 在Cloudflare Cache API上它是v7的边缘缓存,它的每一部分都是你的:

  • 钥匙: 路径(跟踪参数和 __cseg ),设备以及您部分自己的部件(buildSegment,v7's: 一个区域,一个销售渠道,), assignmentsKey(page.assignments) 财务报告和审定财务报表 cacheVersion(cms, __BUILD_HASH__, page.url)· 签字的速记loggedIn: true 从 buildSegment),私人反应和已退化的反应从不储存.
  • 简介: v7 每个 URL 的缓存配置文件 (PROFILES),每页保持了多久新鲜,在重新验证时服务了多久;以及应用程序失败了多久.
  • 清洗: v7 级 POST /_cache/purge 与 Authorization: Bearer <PURGE_TOKEN> 和一个身体 { "paths": ["/", "/shoes"] },可选择使用 "segments": [{ "device": "desktop", "salesChannel": "2" }] (你自己的部件). 它会减少每个精确路径(/shoes 从不下降 /shoes?page=2),在当前版本下,对于每个片段(正文名称为"无"的设备),每个分配密钥,作为导航和服务器函数获取,以及答案 { "purged": [...], "total": n }。缓存 API 是每个数据中心的,所以清理可以到达服务它的数据中心的副本.

__BUILD_HASH__ 是构建 id decoTanstack() 定义(声明一次: declare const __BUILD_HASH__: string;),以及 PURGE_TOKEN a 工人秘密。 举例来说,该档案是作为工人的条目,并附有其测试结果worker-entry.test.ts ) (中文(简体).

名称和工作室的起源

根出口持有什么工人, /server 财务报告和审定财务报表 DecoDocument 共享,对于一个站点自己的代码: 草稿名称(DRAFT_PARAM __draft, (中文(简体) ), DRAFT_COOKIE __deco_draft),标题为工人手持应用程序(VERSION_HEADER x-deco-version, (中文(简体) ), VISITOR_HEADER x-deco-visitor, (中文(简体) ), ASSIGNMENTS_HEADER x-deco-assignments, (中文(简体) ), draftResponseHeaders(preview) (单位:千美元)max-age=0, no-cache, must-revalidate, (中文(简体) ), Vary: Cookie, (中文(简体) ), noindex;通过版本,或 true 以及工作室的起源: STUDIO_ORIGINS, (中文(简体) ), STUDIO_FRAME_ANCESTORS (工人的吗? ) frame-ancestors 从)和 isStudioOrigin; Studio频道的确切列表, DEFAULT_STUDIO_ORIGINS 财务报告和审定财务报表 studioOrigins(option?); 和 : withStudioCsp(directives)工人对现场所做的 csp (Studio的起源于 script-src 财务报告和审定财务报表 frame-ancestors),对于一项政策,网站发送一些其他方式.

import { STUDIO_ORIGINS, VERSION_HEADER } from "@decocms/tanstack";

应用程序

// vite.config.ts
plugins: [cloudflare({ viteEnvironment: { name: "ssr" } }), tanstackStart(), react(),
  decoTanstack({ buildHash: process.env.WORKERS_CI_COMMIT_SHA })]

// src/router.tsx
export const getRouter = () => createDecoRouter({ routeTree });

// src/start.ts
export const startInstance = createStart(() => ({ serverFns: { fetch: decoServerFnFetch } }));

// src/routes/__root.tsx
export const Route = createRootRoute({ component: () => <DecoDocument site="my-store" /> });

DecoDocument mangs v7's "." 编辑快捷键, Studio频道和草稿徽章. 它只是v8:v7的被框处理器(scrollToComponent, (中文(简体) ), editor::rerender)已消失,所以页面上没有任何脚本可以比较窗口和 top 或者说 parent,以及重写"帧-破坏"代码(Cypress's modifyObstructiveCode)服务于字节的页面字节. 工作室频道在每一页上,制作内容包括:一个小的内线脚本(约0.7 kB gziped),工作室通过它将自己的编辑码(一保存后的部分线框,页面互换)加载到页面中. 这是工作室在页面中运行代码的唯一方式:桥面评价没有脚本工作室发送. 该页面信任一份准确工作室起源列表: studioOrigins 道具当给, 否则 DECO_STUDIO_ORIGIN 环境变量,逗号分隔(在服务器上读取;本地工作室,例如 http://localhost:3000)),其他工作室的出品和出品起源(出品人DEFAULT_STUDIO_ORIGINS) (中文(简体) ). 框架, 页面帖 { type: "deco:ready" } 每一个都作为目标来源(只有其中之一的家长收到),并且只有在工作室的回答时,才会导入一个模块, { type: "deco:load", url },来自其中之一,并在该消息的来由上命名一个URL;不是由任何其他来源设定,也不是由其他来源设定,它什么都不做。 工人在HTML响应的CSP中添加了同样的列表: frame-ancestors,然后 script-src (或 script-src-elem; 只对脚本进行限制的政策 default-src 获得一个 script-src 与它的源 加上工作室的。 一个设置 studioOrigins 打开 DecoDocument 设置工人的 studioOrigins 选项; DECO_STUDIO_ORIGIN 都设置好了 内线剧本取自网站 nonce。信件和模块类型在 @decocms/blocks/protocol返回页面路由 pathTemplate (页面块的 path,作为 matchRoute 与它匹配)在其加载器数据中,所以""在存储页面打开该页面在工作室编辑器中. 保存自己文档的站点( 跳过链接 ) <main>说) <DecoPreview site="my-store" /> 联合国 <body> 取而代之的是:捷径,通道,徽章和他们所读的草稿.

图像

// src/imageUrl.ts: the site's image URLs (@decocms/blocks/image plus its platform's helpers)
import { createImageUrl, decoCdn } from "@decocms/blocks/image";
import { vtexCatalog } from "@decocms/apps-vtex/image"; // a VTEX store
import { shopifyCdn } from "@decocms/apps-shopify/image"; // a Shopify store
export const imageUrl = createImageUrl({
  providers: [vtexCatalog(), shopifyCdn(), decoCdn({ quality: "high", sources: "all" })],
});

// src/router.tsx: around every page
createDecoRouter({ routeTree, Wrap: ({ children }) => <ImageUrlProvider value={imageUrl}>{children}</ImageUrlProvider> });

// any component
<Image src={src} width={400} height={300} preload={isLcp} />

Image, (中文(简体) ), Picture 财务报告和审定财务报表 Source 从 /react 使用 v7 的道具并渲染 v7 的标记, 因此一个迁移的呼叫站点只改变其导入 。 这个软件包不知道商业平台:v7的组件调整了这些平台主机上的VTEX目录和Shopify图像的大小,一个网站通过在之前列出平台的助手来保存这些 URL decoCdn 如上(v7's URL,字节为字节,并带有 decoCdn 选择 :. stripAssetHosts: "leading" 从7.71.4:v7到v8的迁移技能列出了他们). 一个 Image 或者说 Source 无宽度写 v7's width=NaN 候选人,就像v7一样。 没有 ImageUrlProvider 每个来源都经过 assets.decocms.com (单位:千美元)DECO_IMAGE_URL) (中文(简体) ).

examples/tanstack-worker-smoke 在寄存器中是一个完整的应用程序.

版本与发布记录

@decocms/tanstack 共发布 245 个版本,首次发布于 2026/07/08;过去 12 个月发布了 245 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
8.18.0latest2026/11/11今天
8.17.02026/11/11今天
8.16.12026/11/111 天前
8.16.02026/11/111 天前
8.15.02026/11/101 天前
8.14.02026/11/101 天前

其他发布通道:latest-7 → 7.85.2。

关于 @decocms/tanstack 的常见问题

@decocms/tanstack 是什么?

在 Cloudflare 工人上启动 TanStack 的 Deco CMS: 工人、 根文档、 路由器和 Vite 插件

如何安装 @decocms/tanstack?

在项目目录运行 npm install @decocms/tanstack,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^19.0.0)、@decocms/blocks(^8.6.0)、@tanstack/react-start(>=1.166.0)、@tanstack/react-router(>=1.166.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@decocms/tanstack 支持 TypeScript 吗?

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

@decocms/tanstack 支持 ESM 还是 CommonJS?

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

@decocms/tanstack 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@decocms/tanstack 可以商用吗?

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

@decocms/tanstack 的下载量有多少?

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

@decocms/tanstack 还在维护吗?

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