@eldrajs/theme-nuxt

中文文档
0.4.2发布于 2026/11/11MITTypeScriptES Module构建来源已验证近 30 天下载 2007

Eldra主题的 Nuxt 模块: 有线@eldrajs/vite-plugin-them,网关客户端,草稿上线和工作室预览桥通入一个 Nuxt 4 站点.

中文使用文档
文档目录11 节
  1. 使用量
  2. eldraRouteKey - 需要你帮忙 <NuxtPage>
  3. 生成站点上的路由解析度
  4. 一项决议 失败 不是一个缺失的路径
  5. 当网关速率限制构建时
  6. 编目后路由模板
  7. 分类是筑巢的,只有犬科
  8. 店里卖的东西
  9. 网站服务的地点
  10. 本地前置路由
  11. 发展

@eldrajs/主题-nuxt

Eldra 主题的 Nuxt 模块: 有线 @eldrajs/vite-plugin-theme,网关客户端,草稿 覆盖和工作室预览桥进入了Nuxt 4网站. 它将每个公布的页面和 来自 CMS 的动态路由, 写入生成的 .eldra/manifest.json 和《加拿大战略计划》 frame-ancestors 工作室预览桥需要的头条,并曝光 useEldraPage 用于解决 当前路线的页面/模板/输入.

pnpm add @eldrajs/theme-nuxt

使用量

// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@eldrajs/theme-nuxt'],
  eldra: {
    gatewayUrl: process.env.ELDRA_GATEWAY_URL,
    orgId: process.env.ELDRA_ORG_ID,
    studioOrigins: ['https://acme.eldracms.com'],
  },
});

环境: ELDRA_GATEWAY_URL 财务报告和审定财务报表 ELDRA_ORG_ID 真正的建筑需要。 点 ELDRA_GATEWAY_URL 地点 边缘 API 主机: 边缘识别出构建符 (单位:千美元)X-Eldra-Build-Token所以大楼和访客浏览器都读了 穿过同一个主机.

在提前提交页面列表时, 路由模板列表和类别列表在每次构建中读取一次 (和地产),不是每条路线一次(@eldrajs/theme-nuxt/prerender; 请求时间渲染从未 共享读取。 一个过程就是一个构建:共享读取的活度为一个长度 nuxi generate 并被清除 当一个先投降开始。 构建日志与计数一行 (单位:千美元)[eldra] prerender shared reads: N made, M avoided) (中文(简体) ).

<script setup lang="ts">
import { EldraLayout } from '@eldrajs/theme-vue';
const { page, layout, blocks } = useEldraPage();
</script>
<template>
  <main>
    <EldraLayout v-if="page && layout" :layout="layout" :blocks="blocks" />
  </main>
</template>

eldraRouteKey - 需要你帮忙 <NuxtPage>

给你 app.vue 路径键 此模块自动导入 :

<!-- app/app.vue -->
<template>
  <NuxtPage :page-key="eldraRouteKey" />
</template>

这可不是化妆品 生成 网站. nuxi generate 将每个路由写入为 <route>/index.html,而静态主机对文件住址的URL有分歧——有些服务 /products/ash-glaze-mug,其他人用重定向回答 /products/ash-glaze-mug/当 访问者登陆的 URL 不同于页面预发路径 Nuxt 重新导航 页面水合物时介于二者之间;一个覆盖所有页面的默认路由键插入 splate 参数,所以这两个拼音键不同,而Vue会破坏并再创建页面—— 和每个街区在它上。 每个街区 setup 然后运行两次, 所以每个阅读 商业块制作 出去两次 两例中只有一次上架过 所以DOM里没有什么东西能把它送走.

eldraRouteKey(route) 由 cononical 路径按键——相同身份 useEldraPage() 决定 内容在下面——所以这个动作是无操作的. 在此添加前的主题脚手架应添加 装订.

生成站点上的路由解析度

在一个 在浏览器中静态构建, (中文(简体) ), useEldraPage() 确定从建筑而不是从 网关. nuxi generate 船载它预设的路径列表(Nuxt的应用显示, /_nuxt/builds/meta/<buildId>.json),该列表回答两个问题 解析器用来问 网关 :

  • 道入于楼. 其页面、模板和条目载于 _payload.json 纳克特自己的 有效载荷插件装入 router.beforeResolve,在页面组件存在之前——所以是一个客户端 导航在两条预交路由之间,使目的地在同一勾选中 pending 从不真实 也没有读过任何网关.
  • 道不在楼. 它不存在: useEldraPage() 返回空路由 (单位:千美元)page === null && template === null)直走,所以主题画出它尚未找到的外壳 5人不读它过去用来得出同样的结论。 这条路线自 建筑也不在文物中——出版会引发重建,这就是建造的原因 权力.

3种情况保持了旧的动态解析,是查阅清单的原因 而不是假设:

  • 工作室预览. 在允许范围内 studioOrigins 框架 路由可以是草稿,也可以是 未出版的页面或一个没有构建过的路径,所以每个决议都是活的——从 首先,在桥还没打招呼之前.
  • nuxi dev。 。 。 . 德夫服务器载着一个没有预兆的货单.
  • 安全部门改革部署 (单位:千美元)nuxt build 加上节点服务器,原因相同: 构建,所以一个空的预发列表意味着“此构建预发无任何” , 绝不是“ 此路径确实” 不存在".

一项决议 失败 不是一个缺失的路径

上面的空路是一个答案:没有这样的一页. 读取的网关无法回答的是 没有,而且 useEldraPage() 将两者分开——失败的决议携带 error 决议 本身(ResolvedEldraRoute.error),这样 error 时为非无 page编号 :template 无效和 a 主题可以绘制其错误分支,而不是未找到的外壳。 错误存在于分辨率上 而不是在混凝土内部 因为 useAsyncData 保留 一个 按路由键输入并运行 只有第一个呼叫者的处理器:一个调用的主题 useEldraPage() 页面上的两次(用于插件) 页面组件旁边的目录路由)否则会在一个呼叫和一个 普通空路径.

在服务器上, 这样的路径被响应 500。 。 。 . Nitro的预触器标记了一个非200路由失败 在它写东西之前, 所以一个无法被问及的页面 已经不存在了 文物和命名在前置记录中,而不是被写成主题的未找到外壳 在访客可以到达的道路上 说对了 nitro.prerender.failOnError 如果一个建筑不能运送 没有每一页——状态本身就把错误的一页变成缺失的一页,而那面旗帜就变成了 将一个丢失为失败的构造 。 注意,真实暴露约为路线数的两倍: crawlLinks: false Nitro仍然在给每页发稿 _payload.json,解决路径 再来一次.

一个建筑与 没有 ELDRA_GATEWAY_URL 编号 : ELDRA_ORG_ID 两种情况均豁免: 根据定义,这样一条路由就解决了平原空路由,没有 error 和主题 制造出它的静态外壳, 这是整个脚手架建筑的点.

这也是为什么 eldraRouteKey 需要上文而不是咨询: canonical 路由是让可混凝土解析其页面正在创建的路由。 坚果 将自己的路由通过私人注入 Nuxt 的应用模块, 手持页面 无法到达装入包件中; useEldraPage() 因此读取路由器的 承诺路线和 把它钉上页的一生.

当网关速率限制构建时

网关将客户端限制在每分钟若干个请求. A 类 generate 一个真正的网站是 从一个地址读取了上千份 每一个页面,每一个路由模板,每一个目录文档, 因为每一页都有 _payload.json 决定: 路由再次——所以一个大型建筑例行满足这个限制. 网关的答案是 429; 与 failOnError 设定,其中之一用来结束建筑.

无需为此配置 . 每个网关读取——这个模块自己的前置读取, 主题在请求时间读取,平台在后面读取 commerce编号 :locales - 重审 a 回答的天能请求 429 或者说 503 (和中断的连接),荣誉 Retry-After 以数倍的速度退缩 包括第一次 费率限制 等待而不是战斗.

指针是用于一个有超乎寻常的狭长界限的网关,或者用于一个应该会迅速失败的建筑物:

// nuxt.config.ts
eldra: {
  // The defaults. `attempts` counts the first request; `{ attempts: 0 }` turns retrying off.
  retry: { attempts: 5, baseDelayMs: 250, maxDelayMs: 5000 },
}

它在公共运行时间配置中携带, 所以一个商店前端 建设自己的 @eldrajs/sdk 商务客户端读取可发送同样的政策(useRuntimeConfig().public.eldra.retry(b) —— 开始者会的.

两个氮键坐在它旁边 这个模块也不是用来设置的: nitro.prerender.concurrency (单位:千美元)1个 默认情况下,这已经是最温和的设置——除非您有 并把它提起来 nitro.prerender.retry编号 :retryDelay (默认为3×500 ms),它重新给出一个路径 其反应是techt的可重复状态之一——408,409,425,429,500,502,503,504,以及 因此,500本模块以失败的解析度回答,但不是404.

新的失败模式是一种会爬行的构造,而不是失败的构造. A 类 Retry-After 很荣幸 到一分钟,和 maxDelayMs 封顶 计算 而不是等待 门要求的, 所以4个在限时等待 持续要求一分钟大约4分钟 一个 改为: 时 Nitro 自己的重击,在 concurrency: 1,同时没有输出,也没有出错。 这是 意图(一个等待的建筑胜过一个失败的建筑),但这是没有人能做的 外出诊断,所以 retry: { attempts: 0 } 是一个故障快速杠杆:一个请求,一个 429 显示它以前的样子.

同样的政策是读取一个跳跃触发器,不仅仅是构建:运行时插件的客户端 服务SSR,客户端路由更改和工作室预览. 符合费率限制的访客 因此,客户端导航等待——最多一分钟 Retry-After - 他们之前在哪里 显示一个错误,对于暂时的限度来说,这是两个错误中更好的。 一个更愿意 在浏览器中失败的速度快于等待设置较小的 attempts;前置读取使用相同的 价值,所以是一个取舍,而不是两个.

编目后路由模板

一个路由模板 schemaApiId 实值 catalog:product, (中文(简体) ), catalog:collection 或者说 catalog:category 由商店的目录而不是 CMS 计划支持: 模块预发 每个活性产品,收集或类别,一个途径,以及 useEldraPage() 解析对象从 路径.

<script setup lang="ts">
const { template, entry, catalog, layout, blocks } = useEldraPage();
// catalog is { kind: 'product' | 'collection' | 'category', slug, path? } here, and null on every
// other route. `path` is set for a category and for nothing else.
// entry.data carries the binding paths a catalog template addresses —
// product: slug, title, description, status, categoryId, tags, variants[], images[]
// collection: slug, title, description, productCount, image
// category: slug, title, path, ancestors[], children[] (+ description as plain text, and
//           productCount, when the catalog read carries them)
</script>

分类目录的 sult 无法解析空路, 因此主题无法找到 壳. 在一代人的时间里,无法成为一条路线的一发子弹被用警告来命名它 建筑继续.

分类是筑巢的,只有犬科

类别路由的图案结束于 a 包罗万象 参数 - /categories/:path* ——及其 slugField 实值 path。参数匹配一个或多个段并随附 /数字 : 一个类的犬行道是它的先祖的鼻涕,先是根,然后是自己的 (单位:千美元)/categories/billinn/bilstolar) (中文(简体) ).

没有读取路径,所以整个类别列表每个请求读取一次 路径的片段被弹出从树上走下. 只有条条路能解决 - 叶子上 其自己的、错误的父体和后继的额外部分是每个未找到的外壳而不是一个 重新定向—— 和前手传 产生准确的这些 犬道,一个类别,时间 网站的地方。 列表无法放置的类别( 没有 swit, 或列表的父文件没有) 根本没有一条路,也没有树下的树.

A 类 link 字段指向一个类别,通过同一路径解决: collectLinkTargets 读取 基于这个原因,它不能设置的目标 使文字变得简单而非链接 以未找到的外壳回答.

studioOrigins 必须明确——这个模块从不提供广泛的后退源源源 预览桥. 见 实例/启动- nuxt 主题和主题 文件/主题 为融合指南.

店里卖的东西

该模块在建设过程中读取了该组织的商务设置,并将其放在 运行时间配置在网关 URL 和 org ID 相邻 . StoreCommerce 完全为此导出, 因此,按键的形状不会按主题重新声明:

import type { StoreCommerce } from '@eldrajs/theme-nuxt/commerce';

const raw = (useRuntimeConfig().public.eldra as { commerce: StoreCommerce | null | '' }).commerce;
const commerce: StoreCommerce | null = typeof raw === 'object' ? raw : null;

commerce 实值 null 当商店没有配置商务时, 当站点没有配置时 网关证书,或读取失败时——构建打印出一个警告( 命名原因时) 因为没有人能拿到的货币 应该需要一个符号,而不是部署. 将价格格式化的主题视为“放弃一个普通数字”,绝不是货币 猜;启动者在 app/storefront/money.ts。 。 。 .

阅读密钥时, Nuxt 自身序列化的一个细节很重要: a null 公开运行时间配置 值以 空字符串所以在一家没有出版的商店 commerce 实值 '' 而不是说 null (模块的) locale 执行相同)。 处理任何非对象 作为"没有货币"——而不是一个畸形的记录——并且只抱怨一个存在但 不完整 .

该模块没有自行提供超载,目的:平台发布货币 因此主题侧设置只能重新标出真实金额. (Nuxt自己的公共运行时间配置环境压倒了——) NUXT_PUBLIC_ELDRA_COMMERCE_CURRENCY 财务报告和审定财务报表 它的兄弟姐妹——只要Nuxt在请求时读取运行时配置,就仍然适用,就像它适用于每一个 其他公用钥匙。 在一个先发制人的网站里,它没有什么可以覆盖的: 值被烤成 每页的有效载荷在构建。 ) 它在构建时而不是在浏览器中读取,因为每个价格 预发页面格式化.

网站服务的地点

该模块在构建过程中读取了组织配置的内容定位一次,并放入 在运行时配置旁边 commerce。 。 。 . StoreLocales 完全用于此目的导出 :

import type { StoreLocales } from '@eldrajs/theme-nuxt/locales';

const raw = (useRuntimeConfig().public.eldra as { locales: StoreLocales | null | '' }).locales;
const locales: StoreLocales | null = typeof raw === 'object' ? raw : null;

locales 实值 { default, supported } 与 supported 默认第一,或 null - 对于一个 为没有网关证书而建的网站配置无字的组织,并改为 失败(最后一个,只有那个,打印出一个警告 命名原因). null 表示 站点行为与当地人存在之前完全相同:一个没有前置站点,没有语言切换器. 与 commerce 适用,即 typeof 警卫 上面是用来表示的.

一个主题很少需要读取密钥本身:模块将其转换为路由(见下文)和 useEldraLocale() 是可复数的回答“哪一个语言是此页面,什么是 还有其他的".

本地前置路由

有两个或两个以上本地地址, 网站为默认本地地址服务 / 和所有其他支持 路径前缀下的地块 —— /is-IS/products/ash-glaze-mug。第一个路径段选择 语言(对大小写不敏感,与所储存的组织拼写相匹配)和 其它路径的解析与它未设置的解析完全相同; 每个网关为该页所读 拿着 locale。 。 。 . /<default-locale>/… 是故意的,这是故意的 没有 生成和解决 未知路径, 因为默认的地块位于 / 只有这个.

路径段不翻译:每个前缀下都有一个页面处于默认-本地状态,所以 /is-IS/about 是冰岛对同一文件的渲染 /about 服务。 交接传球 因此列出每个内容路径一次,并写出每个地块——页面,路由模板, 分类路线和种子 cart编号 :wishlist编号 :search 页面相同.

eldra.locale 编号 : ELDRA_LOCALE 保持它一直有的意义: 默认 语言。 命名一个组织支持的地方 移动该地方 / 和前缀 ; 命名其他任何(或针对一个没有本地地址的组织部署) URL 并仍然转发每个读取的值 .

模块给出每一页 <html lang> (单位:千美元) rel="alternate" hreflang 每个被支持的链接 语言( 加) x-default ——这个主题对两者都没有任何增加.

<script setup lang="ts">
// Auto-imported, like `useEldraPage`.
const { active, defaultLocale, supported, name, path, switchPath, select } = useEldraLocale();

// `path()` prefixes one same-site destination for the active locale, and is idempotent.
const cartHref = computed(() => path('/cart'));
// `switchPath()` is the same page in another language, query and fragment included;
// `select()` navigates there.
</script>

name(locale) 是一个切换器的选项标签。 没错 已解决 一次,在服务器上,并在有效载荷中载入: Intl.DisplayNames 是伊斯兰法院联盟的数据和a 渲染器和浏览器不需要有同样的东西——节点回答"íslenska (Ísland)"用于 is-IS 在其中,一个缩小的ICU浏览器构建“冰岛语(冰岛)”的答案——这样一页就可以让每一方 计算自己的标签会水合到不匹配和再油漆.

链接已经处理好 useEldraLink() 决定 a link 字段红外线 在活动区域下,一个主题的路由器-链接组件应该将每个内部 to 结束 path() 一次(启动器) app/components/EldraRouterLink.vue 参考文献).

发展

src/runtime/** 由 Nuxt 在构建/ Dev 时间编译, 而不是由 tsc 进口 nuxt/app 财务报告和审定财务报表 Nuxt 的虚拟模块(#imports, (中文(简体) ), virtual:eldra/*),它只存在于 Nuxt 架构中 图表. tsconfig.json是因为 include 缩小为 src/index.ts 财务报告和审定财务报表 src/module.ts (单元) 条目,它只导入可解析的软件包——并通过它导入无框架运行时文件 它与可堆肥者分享) pnpm typecheck 证明该部分 tsc 能够 实际解析; 到达 Nuxt 的运行时文件仍然被键入到 nuxt-module-build build 和通过消费 Nuxt 应用程序(参见 examples/starter-nuxt是因为 nuxi typecheck) (中文(简体) ).

版本与发布记录

@eldrajs/theme-nuxt 共发布 12 个版本,首次发布于 2026/10/17;过去 12 个月发布了 12 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.4.2latest2026/11/113 天前
0.4.12026/11/104 天前
0.4.02026/11/095 天前
0.3.42026/10/2718 天前
0.3.32026/10/2421 天前
0.3.22026/10/2322 天前

其他发布通道:placeholder → 0.0.0。

关于 @eldrajs/theme-nuxt 的常见问题

@eldrajs/theme-nuxt 是什么?

Eldra主题的 Nuxt 模块: 有线@eldrajs/vite-plugin-them,网关客户端,草稿上线和工作室预览桥通入一个 Nuxt 4 站点.

如何安装 @eldrajs/theme-nuxt?

在项目目录运行 npm install @eldrajs/theme-nuxt,或使用 pnpm add / yarn add / bun add。

@eldrajs/theme-nuxt 支持 TypeScript 吗?

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

@eldrajs/theme-nuxt 支持 ESM 还是 CommonJS?

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

@eldrajs/theme-nuxt 需要什么版本的 Node.js?

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

@eldrajs/theme-nuxt 可以商用吗?

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

@eldrajs/theme-nuxt 的下载量有多少?

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

@eldrajs/theme-nuxt 还在维护吗?

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