Zero-build 隐私政策与 Astro

发布: (2026年4月10日 GMT+8 16:13)
5 分钟阅读
原文: Hacker News

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 Policy

expandOpenPolicyConfig 将统一的配置拆分为单独的策略。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 —— 运行时只需要 corerenderers
  • 三种政策类型全部支持。 隐私、条款和 Cookie 政策都可以从同一个配置编译。相同的 defineConfig() 调用,相同的流水线。

输出与之前相同:静态渲染的 HTML,不包含客户端 JavaScript。不同之处在于编译在使用它的页面内部进行,而不是作为插件监视文件系统的副作用。

完整的工作示例位于仓库的 examples/astro 目录。

进一步使用 OpenPolicy+

如果您需要的不仅仅是静态生成,OpenPolicy+ 扩展了核心库,提供基于云的同意跟踪、PR 自动化(policy linting、对每个拉取请求的合规性检查),以及我们团队的现场上手指导。预约演示 ,我们将帮助您完成设置。

0 浏览
Back to Blog

相关文章

阅读更多 »