Zero-build 隐私政策与 Astro
Source: Hacker News
当我们在三月推出 OpenPolicy Astro 集成时,它的工作方式是通过在构建时生成 Markdown 文件。你需要在 astro.config.mjs 中添加插件,指定输出目录,随后 Astro 会将生成的 .md 文件当作组件导入。
// astro.config.mjs — old approach
import { openPolicy } from "@openpolicy/astro";
export default defineConfig({
integrations: [
openPolicy({
formats: ["markdown"],
outDir: "src/generated/policies",
}),
],
});它能够正常工作,但也带来了一些摩擦:额外的依赖包、为生成目录添加的 .gitignore 条目,以及在配置和页面之间的文件监视步骤。
核心库现在可以直接编译策略。你可以直接在 Astro 的 frontmatter 中调用它——无需集成,也不需要生成文件。
安装
bun add @openpolicy/sdk @openpolicy/core @openpolicy/renderers无需 Astro 集成。无需 Vite 插件。共三个包。
定义你的配置
Create src/lib/openpolicy.ts:
import { defineConfig } from "@openpolicy/sdk";
export default defineConfig({
company: {
name: "Acme",
legalName: "Acme, Inc.",
// ...
},
privacy: {
effectiveDate: "2026-04-01",
dataCollected: { /* ... */ },
jurisdictions: ["us", "eu"],
// ...
},
cookie: {
effectiveDate: "2026-04-01",
cookies: [ /* ... */ ],
// ...
},
terms: {
effectiveDate: "2026-04-01",
governingLaw: { jurisdiction: "Delaware, USA" },
// ...
},
});查看 完整的配置模式 以获取所有可用字段。
填写此配置的最快方法是将您现有的隐私页面(或仅描述您的应用)粘贴到 Claude 中,让它生成配置。因为输出是确定性的——相同的配置始终产生相同的政策——Claude 只负责配置,而不编写法律文本。您审查输入,OpenPolicy 负责其余工作。
在专用页面渲染
每个页面从配置中获取其策略,编译后渲染为 HTML —— 所有操作都在 frontmatter 中完成:
---
// src/pages/privacy.astro
import { compile, expandOpenPolicyConfig } from "@openpolicy/core";
import { renderHTML } from "@openpolicy/renderers";
import openpolicy from "../lib/openpolicy";
const policies = expandOpenPolicyConfig(openpolicy);
const privacyPolicy = policies.find((p) => p.type === "privacy");
if (!privacyPolicy) {
throw new Error("Privacy policy not found in config");
}
const policy = renderHTML(compile(privacyPolicy));
---
Privacy PolicyexpandOpenPolicyConfig 将统一的配置拆分为单独的策略。compile 对每个策略运行其章节构建器。renderHTML 将结果转换为 HTML 字符串。set:html 在渲染时不进行转义。
所有操作均在构建时完成。浏览器中不加载任何 JavaScript。
条款和 Cookie 页面以相同方式工作 —— 只需查找 type === "terms" 或 type === "cookie" 即可。
astro.config.mjs
import { defineConfig } from "astro/config";
export default defineConfig({});没有集成。没有插件。没有需要配置的内容。
为什么这比旧方法更简单
插件方式会在 src/ 目录生成中间文件。这个方式 不会:
- 没有生成的文件。 不需要创建、管理或在 git 中排除
src/generated/目录。 - 没有插件配置。
astro.config.mjs保持为空。没有outDir、没有formats、没有监视路径。 - 没有额外的包。 去掉
@openpolicy/astro—— 运行时只需要core和renderers。 - 三种政策类型全部支持。 隐私、条款和 Cookie 政策都可以从同一个配置编译。相同的
defineConfig()调用,相同的流水线。
输出与之前相同:静态渲染的 HTML,不包含客户端 JavaScript。不同之处在于编译在使用它的页面内部进行,而不是作为插件监视文件系统的副作用。
完整的工作示例位于仓库的 examples/astro 目录。
进一步使用 OpenPolicy+
如果您需要的不仅仅是静态生成,OpenPolicy+ 扩展了核心库,提供基于云的同意跟踪、PR 自动化(policy linting、对每个拉取请求的合规性检查),以及我们团队的现场上手指导。预约演示 ,我们将帮助您完成设置。