@ cloudhal/ astro- reser
用Astro 7绘制出一个 Cloudhal 网站图 。 主要作品:
| 导出 | 什麽 |
|---|---|
@cloudhal/astro-renderer/integration | cloudhal({ dataDir, siteId }) ——曝光项目配置为: virtual:cloudhal/config,将本地的 SQLite 模块外部化,在dev 中监视数据目录,以便在添加页面时清除 Astro 的路由缓存(Astro \ 6.3 缓存) getStaticPaths() (b) 对请求的处理. |
@cloudhal/astro-renderer/runtime | getSource(config) a 包括: GraphSource数字 : 现场直播 dev( 可见草案) 中的节点, a 简介 在建筑物中(CLOUDHAL_SOURCE=snapshot:<id>) (中文(简体) ). |
@cloudhal/astro-renderer/components | Sections 调度器+ Hero, (中文(简体) ), RichText, (中文(简体) ), Image, (中文(简体) ), ContentList .astro 组件。 主题通过 components 道具 (英语). |
@cloudhal/astro-renderer/fields | 已键入自定义字段(RFC-0041 第9段): entryFields, (中文(简体) ), renderFields, (中文(简体) ), hasShownFields,以及 resolveFields, (中文(简体) ), formatFieldValue, (中文(简体) ), fieldLabel, (中文(简体) ), fieldHelp, (中文(简体) ), optionLabel 从 @cloudhal/core-ts/fields。 。 。 . EntryFields.astro 内 ./components 画出它们. |
启动器中的页面路由是这样的:
---
import { Sections } from "@cloudhal/astro-renderer/components";
import { getSource } from "@cloudhal/astro-renderer/runtime";
import config from "virtual:cloudhal/config";
export async function getStaticPaths() {
const source = await getSource(config);
return (await source.pages()).map((p) => ({ params: { path: p.path === "/" ? undefined : p.path.slice(1) } }));
}
const source = await getSource(config);
const page = await source.pageByPath(Astro.params.path ? `/${Astro.params.path}` : "/");
---
<Sections sections={page.sections} />
.astro 文件船作为源(没有构建步骤);消费者的Astro汇编它们. astro 是同级依赖.
主题化 API 稳定性
cloudhal init 副本 starters/blog/src 输入每个项目,所以一个站点会不断调用这个包的出口(和 @cloudhal/core-ts和创造时一样 每次导出一个主题进口因此都是公共的API:永远不要改变它同名的含义. 打破的改变使旧的呼唤保持了堕落倒地. 在0.3.11号文件中 entryPath(entry) 成为 entryPath(site, entry) 并且每个有更古老的主题副本的网站 都变成空页 直到0.3.13恢复它. packages/cli/test/old-theme-compat.test.ts 建立已冻结的较早启动的复制件(packages/cli/test/fixtures/theme-v*/)与今天的包裹. 当发行时更改了主题化的API时会添加一个新的被冻结的复制.
已打入自定义字段(RFC-0041,在0.5.0中加入)
添加剂; entry.fields 仍然代表着所储存的确切内容,以及从未像以前那样称为这些主题的渲染(theme-v0.4.0 在比较测试中.
| 导出 | 签署 |
|---|---|
GraphSource.entryFields? | (entry: ContentEntry, options?: EntryFieldsOptions) => Promise<RenderedFields> 打开 LiveSource 财务报告和审定财务报表 SnapshotSource (在界面上选择,例如 search?(中文(简体) ) |
entryFields (单位:千美元)./fields, (中文(简体) ), .(中文(简体) ) | (source: FieldsSource, entry: ContentEntry, options?: EntryFieldsOptions) => Promise<RenderedFields>: 对任何来源相同(site()选项 entryById() 财务报告和审定财务报表 asset()(中文(简体) ) |
renderFields | (resolved: ResolvedFields, options: RenderFieldsOptions) => RenderedFields:纯粹的一步,因为你解决了自己的价值 |
hasShownFields | (fields: RenderedFields) => boolean |
resolveFields, (中文(简体) ), formatFieldValue, (中文(简体) ), fieldLabel, (中文(简体) ), fieldHelp, (中文(简体) ), optionLabel | 从 @cloudhal/core-ts/fields |
EntryFields (单位:千美元)./components(中文(简体) ) | <EntryFields fields={…} label?="Details" class?="…" />(单位:千美元) <dl class="ch-fields"> 的字段,当没有字段时无; 没有自己的样式 |
EntryFieldsOptions数字 : locale (默认:该条目的), media (这页) MediaContext, (中文(简体) ), timeZone, (中文(简体) ), words (单位:千美元){ yes, no }, (中文(简体) ), sizes每一个 RenderedField 已经 key, (中文(简体) ), label, (中文(简体) ), help?, (中文(简体) ), empty, (中文(简体) ), text (逃避的纯正文本),和每类 html (丰富文本 通过身体的标记下降管道), href (单位:千美元)safeHref,在不安全时下降, image (单位:千美元)imageAttributes 加号 assetId,在页面的语言中备选案文)或 datetime附加时 def, (中文(简体) ), value 财务报告和审定财务报表 fromOriginal 从 resolveFields。主题指南: docs/guides/fields.md。 。 。 .
收集阶段3(RFC-0042,0.6.0中加入)
爱心. entryHead, (中文(简体) ), entries(), (中文(简体) ), allEntries() 而每个已存在的导出都保留其含义;旧的主题副本唯一产生的区别来自一个站点所选择的设置(theme-v0.5.0 在比对测试中:通过收藏的条目 expiry 保存列表、信息、网址图和搜索,以及 contentList 区域 where编号 :orderBy 按字段分列的列表(ContentList.astro 这里的船,并询问来源 一个主题的列表来自.
| 导出 | 签署 |
|---|---|
GraphSource.queryEntries? | (q: FieldEntryQuery) => Promise<FieldEntryResult> 打开 LiveSource 财务报告和审定财务报表 SnapshotSource数字 : { collection, locale?, where?, orderBy?, sort?, filter?, limit? (1–100, default 20), offset?, includeExpired? } → { entries, total }· ; now 条件就是源头的瞬间 |
queryEntries (单位:千美元)./queries, (中文(简体) ), .(中文(简体) ) | (source: GraphSource, q: FieldEntryQuery) => Promise<FieldEntryResult>: 任何来源(返回到 entries() 没有源 queryEntries; 一个无效的查询匹配无任何内容并正在登录 |
contentListEntries (单位:千美元)./queries, (中文(简体) ), .(中文(简体) ) | (source, sections, locale?) => Promise<Record<string, ContentEntry[]>>页:1 entries 地图 Sections 读取(按收集;按编号 filter 用于 where编号 :orderBy(中文(简体) ) |
sectionQuery, (中文(简体) ), listsByField, (中文(简体) ), evaluateEntryQuery (单位:千美元)./queries(中文(简体) ) | 查询区域运行; 是否按字段列出; 纯评价员共享两个来源 |
GraphSource.routableEntries? | (locale?) => Promise<ContentEntry[]>:每个有公共URL的条目,包括未列出的条目(路线、静态构建、替代); allEntries 保留列出的 |
withStructuredData (单位:千美元)./seo, (中文(简体) ), .(中文(简体) ) | (head: HeadMeta, source, entry, { origin, media? }) => Promise<HeadMeta>: 后调用 entryHead; 替换 BlogPosting 与收藏预设( )Event, (中文(简体) ), JobPosting, (中文(简体) ), Product, (中文(简体) ), Recipe当该条目具有所需要值时,保留该条目 BreadcrumbList返回 head 原文不变 |
entryStructuredData (单位:千美元)./seo, (中文(简体) ), .(中文(简体) ) | (source, entry, { origin, media? }) => Promise<{ doc?, issues }>: 预设文档和为什么没有 |
collectionFeedLink (单位:千美元)./seo, (中文(简体) ), ./collection-feeds, (中文(简体) ), .(中文(简体) ) | (site, collection, origin, locale?) => FeedLink | undefined数字 : { title, href } 收集的饲料<prefix>/rss.xml在当地居民的URL, undefined 与 feed: false 或无前缀的永久链接; 添加到 head.feeds 之后 localizeHead |
collectionFeedPath, (中文(简体) ), feedCollections, (中文(简体) ), collectionFeedPaths, (中文(简体) ), collectionForFeedPath (单位:千美元)./collection-feeds(中文(简体) ) | 哪些收藏有饲料,在哪里; staticPaths().feeds 现在包括每个收藏种子路径 |
collectionFeedXml, (中文(简体) ), serveCollectionFeed (单位:千美元)./collection-feed-route(中文(简体) ) | 集合的 RSS 在一个地方; 中间软件的决定( 一个主题的404 一个种子路径成为种子) |
收集种子: cloudhal() 集成后添加了中间软件(collection-feed-middleware目标 <prefix>/rss.xml (和 /<locale><prefix>/rss.xml)只有主题自己的路线回答404,所以主题自己的路线获胜而旧的拷贝获得种子;静态建筑通过起动器写入它们 [...path]/rss.xml 路径来自 staticPaths().feeds。规则和缓存标签与 rss.xml。 。 。 .
预览 : renderSectionHtml(section, entries, media?, listing?) 带 { site, now? } 作为第四个论点 renderPagePreview 通过它,所以 contentList 区域 where编号 :orderBy 预览通过 evaluateEntryQuery 类似网站(一个术语) filter 仍然只在网站上适用).
指南 : docs/guides/structured-data.md。 。 。 .
衍生门: unlist 保留条目的页面(200),注释和菜单链接,但保留 entries(), (中文(简体) ), allEntries(), (中文(简体) ), entriesByFilter编号 :entriesByTerm (档案、相关)、资料、网址图和搜索; hide 404就像一个过期的 availability。两个源都应用它们,门索引在日期/日期列表字段的每个衍生瞬间和每个值瞬间封顶边缘缓存(用于 now 以“结束于...”通知”来忽略它们。 现场工人 GET /__cloudhal/features 答题 { "gates": 2 }; 作者拒绝 expiry 直到它发生.
站点分析(RFC-0006)
渲染器搭载了Cloudhal的无饼干分析器(Cloudhal)的站点侧面(Cloudhal)@cloudhal/analytics:
- S文. 现场工人建筑(
target: "cloudflare"(b) 与《京都议定书》cloudhal()集成组合@cloudhal/analytics/client与Astro的Vite 分为两个散列静态资产,/_cloudhal/p.<hash>.js(页面视图脚本, ≤ 1 KB gzipped, 由测试进行)和/_cloudhal/v.<hash>.js(维他命,web-vitals,以 N 中一个页面视图加载。 没有饼干,没有存储,没有识别器,没有第三方;CSP留下script-src 'self'; connect-src 'self'。 。 。 . - 现场工人 (单位:千美元)
cloudflare-entry.ts, (中文(简体) ),analytics.ts) (中文(简体) ).POST /__cloudhal/e答题204目标405用于其他方法),并将一个事件写入WaeWriter(env.ANALYTICS); 已出版的 HTML200开始吧<script type="module" src="/_cloudhal/p.<hash>.js" data-v="N">内<head>网站设置时( 从未预览、 出错或输入) ; 工作人生成的响应render事件( 已公布的 HTML200s,方向调整,404, (中文(简体) ),410, (中文(简体) ),451, (中文(简体) ),5xx) (中文(简体) ). 清洗会重新读取设置 . - 现场工人的期望 (书写人:
cloudhal deploy在推出步骤9中:分析引擎绑定ANALYTICS(数据集)<deployment>_events, (中文(简体) ),CLOUDHAL_ANALYTICS = "on", (中文(简体) ),CLOUDHAL_ANALYTICS_DEFAULTS(单位:千美元)cloudhal.json是因为analytics块为 JSON ;enabled默认为true),迁移0014_analytics在 D1 中(直到运行,分析计数为关闭),可选CLOUDHAL_SITE_HOSTS(外部主机名称;Site.domains财务报告和审定财务报表*.workers.dev请求主机已被接受). 没有开关或捆绑,则不收集任何信息,也不添加标签. cloudhal dev(单位:千美元)analytics-middleware.ts, (中文(简体) ),analytics-node.ts) (中文(简体) ). 同一端点;它记录在本地的 SQLite 商店(analytics_events仅与analytics.dev: true(一体化组织)analytics选项,博客启动器从cloudhal.json,或CLOUDHAL_ANALYTICS, (中文(简体) ),CLOUDHAL_ANALYTICS_DEFAULTS财务报告和审定财务报表CLOUDHAL_ANALYTICS_DEV=1),然后为脚本服务并注入标记. 静态建筑没有分析.