# @coralreefventures/site-tools 中文文档

规范地址：https://npmcn.com/package/%40coralreefventures/site-tools/

版本：0\.7\.0
npm 元数据更新时间：2026-10-19T22:57:04.301Z
中文译文更新时间：2026-11-14T13:31:06.030Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40coralreefventures/site-tools
原文对照：https://npmcn.com/package/%40coralreefventures/site-tools/?lang=original
项目主页：https://coralreefventures.com/
源码仓库：https://github.com/Coral-Reef-Ventures/reef

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：261 kB，63 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=24
- 运行依赖：0 个
- peer 依赖：@playwright/test 1\.63\.0
- 首次发布：2026-10-04T20:07:13.028Z
- 最新版本发布：2026-10-19T22:57:03.930Z
- 近 30 天下载量：2035（2026-10-11 至 2026-11-09，npm 官方下载统计）
- 已发布版本数：11（近 12 个月 11 个）

## 中文简介

珊瑚礁公共站点的指令行工具:像主机一样服务静态输出,用灯塔把它关上,并把它锁在门后.

## 安装

```sh
npm install @coralreefventures/site-tools
```

也可以使用：`pnpm add @coralreefventures/site-tools`、`yarn add @coralreefventures/site-tools`、`bun add @coralreefventures/site-tools`

## README

# @colorreefventures/现场工具

珊瑚礁公共网站的3个命令行工具,这是由Amplify Hosting服务的Next.js静态输出. 两个地点的前两个地点是: `scripts/serve.ts` 财务报告和审定财务报表 `scripts/lighthouse.ts`他们现在是垃圾桶,还有.. 产品脚本去。 第三锁后门一地.

```sh
reef-serve [--root out] [--port 3140]
reef-lighthouse [--root out] [--reports lighthouse] [--port 3160] [--threshold 90] [--retries 2] [--shard 1/3] [--chrome <path>] [path ...]
reef-door-bundle --site <id> [--out out] --door-url <url> --hosts <h1,h2> --jwks-url <url> [--signout-chain id=host,...]
                 [--name <display name>] [--mark <file>] [--mark-dark <file>] [--accent #rrggbb] [--accent-dark #rrggbb]
```

`reef-serve` 对 Playwright 和 Lighthouse 的导出方式服务: 目录答案及其 `index.html`,一个目录路径,没有它的斜线重定向到它, 其他的都是有状态的404页 404, 而文本会随着CDN的压缩被压缩. `PORT` 读取时间 `--port` 未给出, 所以是一个 Playwright `webServer` 命令可以通过 :

```ts
webServer: { command: `pnpm exec reef-serve --port ${port}`, port },
```

`reef-lighthouse` 是合并门:在导出站点地图(或给定的路径)中每一页的灯塔 默认的移动仿真,每一个性能,可访问性,最佳做法和在阈值或上方的SEO. A 类 下页再次被测量,最多 `--retries` (默认为2次),其运行的中位数决定: 性能得分在共享跑道上同一页跑道之间摇晃几分,一个低跑道应该 门三跑不会失败, 而每跑一次发现低的一页仍然失败。 下方的一页失败 运行,然后将其上份报告留在 `--reports`类别本身的楼层`--performance 85`代表着 仅该类别的阈值,即一个站点的外壳将每页小于90分的分数放在共用跑道上 其他三类为90个. `--shard <index>/<count>` 分页比例,每页 `count`\-从 `index`\-th (基于1个,作为 Playwright) `--shard`因此,一个地方的大门向外延伸 一个跑者把它分割 灯塔一次测量一页,每页约14秒 在一个跑道上并肩作战, 将扭曲对方的成绩。 灯塔本身不是附属物,因为它 捆绑轴-核心(MPL-2.0),在家族许可列表之外;它贯穿 `pnpm dlx`,钉住 (单位:千美元)`--lighthouse-version`) (中文(简体) ). Chrome 是 Playwright 的铬 当 `@playwright/test` 安装在这个软件包旁边, 或者说 `--chrome`。 。 。 .

## 大门

`reef-door-bundle` 将静态导出转换成可扩展的部署,不从 门。 写着 `.amplify-hosting/` 门内输出的计算包和部署清单 确切的一条路线, `/*` 要计算,没有静态路径,所以每个字节(页,RSC有效载荷, `_next/static` 块, 相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 应用程序运行在平台上 `WEB_COMPUTE` 带有缓存 类型 `AMPLIFY_MANAGED`所以饼干在CDN的缓存密钥中.

```sh
reef-door-bundle --site <id> --door-url https://<door> --hosts <host> --jwks-url https://<door>/.well-known/crv-door-jwks.json \
  --signout-chain <id>=<host>,<id>=<host>
```

每个旗子都掉回一个环境变量,所以一个构建的 spec可以设置每个应用程序: `CRV_DOOR_URL`, (中文(简体) ), `CRV_DOOR_HOSTS`, (中文(简体) ), `CRV_DOOR_JWKS_URL`, (中文(简体) ), `CRV_DOOR_SIGNOUT_CHAIN` 财务报告和审定财务报表 `CRV_DOOR_HOST_HEADER` (单位:千美元)`host`,默认值,或 `x-forwarded-host` 如果平台重写主机). 垃圾桶会取回JWKS,如果无法到达则会失败建造, 空的,或者除了P-256 公用钥匙以外的任何东西,它拒绝 `static/` 目录, 第二条路由和超过200 MB的捆绑.

闸门是一个节点服务器,没有依赖性(它导入了节点自己的模块,没有其他模块,测试持有), 在3000号口监听 对于每项请求,顺序如下:

1.  路径 `..`,反斜或控制字符,原始或百分比编码,是400;非GET, 头部或POST是405.
2.  未输入主机 `--hosts` 是一个空的 403 .
3.  `/robots.txt` 拒绝一切; `/_door/health` 答题 `ok`。 。 。 .
4.  `POST /_door` 从形体取出门票: `kid` 在JWKS中,由门发行 对于这个精确的宿主, 未过期 和生活最多一个小时 `__Host-crv_door_state` 饼干和命名 同样的峡谷 `next` 作为形式。 它变成 `__Host-crv_door` 饼干`HttpOnly; Secure; SameSite=Lax`, (中文(简体) ), 以及303至303小时 `next`设置 `__Host-crv_door_seen=1` (单位:千美元)`HttpOnly; Secure; SameSite=Lax`, 30天), 一个没有身份的标记, 这个浏览器在这里有一个会话 。 任何错误都是303回门 `?error=ticket`。 。 。 . `GET /_door/signin?next=<path>` 启动登录:它运行 `next` 下一个(缺失、重复或 拒绝一个变成 `/`),设置新32字节 `__Host-crv_door_state` 饼干`SameSite=None`,十分钟)和 回答门上的302 `site`, (中文(简体) ), `host`, (中文(简体) ), `next` 财务报告和审定财务报表 `state`。即将来临的一页的按钮链接在这里。 仅a 顶级导航启动一个( 导航, 或请求, 不包含 `Sec-Fetch-*` 接受 HTML 的标题,以及 `Sec-Fetch-Dest: document` 当发送时); 图像、帧或取回得到一个空的401, 没有饼干, 所以另一个 网站不能覆盖访客状态的中签.
5.  `/_door/signout?then=<id>` 清除全部三个 cookie( 一个空值和一个 `Expires` 在时代,带有属性 都设定了,没有 `Max-Age`,Firefox可以保留片刻作为饼干结束),然后用固定的地图继续:到站点的大门 `<id>` 内 `--signout-chain`,以它命名网站,或者,为任何其他(`door`,最后一站,门的 `/signout/`。它从不从查询方向重定向到 URL.
6.  带有有效的会话, 导出将用作放大其、 HTML 和 `.txt` 作为 `private, no-store` 财务报告和审定财务报表 `/_next/static/**` 作为 `private, max-age=31536000, immutable`。 。 。 .
7.  没有一个, 页面负载( 导航, 或请求, 无 `Sec-Fetch-*` 接受 HTML 信头)获得 下方的来顺页,作为401;其他的都得到一空的401. 也没有设置饼干。 例外是 顶层的页载载所见标记:一个被邀请者,其时数已升起,将直接送到门上(新鲜) 状态饼干和302 `/_door/signin` 在它自己签到时,它会立即发出新票,所以 更新时保持沉默。 标记一无所取;携带的取来仍然得到空的401. 401个都携带 `WWW-Authenticate: Cookie realm="<id>", form-action="/_door/signin", cookie-name="__Host-crv_door"`。 。 。 .
8.  一个例外是空500。 门关了.

每一个反应都带有 `X-Robots-Tag: noindex, nofollow`, HSTS, , (中文), `nosniff`, (中文(简体) ), `X-Frame-Options: DENY` (单位:千美元) `Cache-Control` 与 `no-store` 或者说 `private`。 。 。 . `next` 通过对主机进行解析,重新序列化,可以实现语法化 它作为路径和查询,如果它离开源头或持有回击或控制字符,则拒绝它 (单位:千美元)`canonicalNext`,导出,因此门票发行机构可以运行相同的台阶.

### 即将来临的一页

没有会议的访问者看到产品自己的域名:产品标记和名称 " 即将来临 很快","现在向被邀请的来宾开放","有邀请函吗? 签名"按钮 `/_door/signin` 携带 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}请示的下一位 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}所以签到门前 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}门票会把被邀请者带回他们要求的页面 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}请示 和“参与”链接 `<door>/get-involved/?site=<id>`。 。 。 .

这是大门自己的HTML,没有带任何网站:一个内线样式表,标记为 `data:` URI,没有 脚本,没有要求任何地方。 它是在大门开始时建造的 并且是除路外的每一条路的同一个字节 `next` 它的按钮携带。 它的头是大门的保安头, `X-Robots-Tag: noindex, nofollow`, (中文(简体) ), `Cache-Control: no-store`,而且内容-安全政策允许: `default-src 'none'; style-src 'sha256-<its stylesheet>'; img-src data:` 和 `base-uri`, (中文(简体) ), `form-action` 财务报告和审定财务报表 `frame-ancestors` 全部 `'none'`头部得到相同的头部 没有身体。 接下来 `prefers-color-scheme`,读取于 320px,而每一对相色相会合WCAG AA.

**为什么401.** 没有会话,任何请求都不会得到2xx,所以漏出检查和任何探测器都可以从一个被锁定的站点得知 单凭地位打开一个。 一台200读作站台本身取自爬行机或升起时显示器,一台503读作一台 废. RFC 9110需要一个401来携带一个 `WWW-Authenticate` 中,没有注册的方案描述会话 从一个签入的页面取出cookie,所以大门使用所起草的形状精确地表示(草稿-broyer-http-cookie-auth). 浏览器只提示它们所执行的方案, 所以对于这个方案,它们使身体, 浏览器套件证明 在铬、火狐和WebKit中.

其内容来自bin's旗,存储于 `gate.config.json` 作为 `page` 并检查捆绑时间:

| 旗帜 | 默认 | 已检查 |
| --- | --- | --- |
| `--name` | 站点编号,资本化 | 1到60个字符,没有控制字符,两端没有空格 |
| `--mark` | 无:名称单独存在 | a 一个 `.svg` 或者说 `.png` 导出内部路径(拒绝连接),最多64 KB,内含为基数64 |
| `--mark-dark` | 无: 黑暗方案显示 `--mark` 轻地砖上 | 作为 `--mark`; 仅与 `--mark` |
| `--accent` | `#1f2933` | `#rrggbb`,在灯页上至少显示3:1(`#ffffff`(中文(简体) ) |
| `--accent-dark` | `#d5dbe1` | `#rrggbb`,在暗页上至少3:1`#11161b`(中文(简体) ) |

按钮的标签为白色或黑色,以口音上读取较好者为准;两者之一总能达到4.5:1. 这个 标记是网站的文件,每个访客然后都会看到,所以只命名一个要公开的文件:标志,永远不要 门后的东西 如果 Amplify 应用程序的自定义头条也设置了内容-安全政策, Amplify 获胜 或两者均适用;产品的政策允许内衬样式和 `data:` 图像,所以页面是任意一种方式.

大门只持有公用钥匙,将其所有配置作为数据,并命名为没有产品. 售票员 门和场地登记是门自己的.

## 图书馆

库条目导出 `serve`, (中文(简体) ), `createStaticServer`, (中文(简体) ), `runLighthouse` 财务报告和审定财务报表 `pagesFromSitemap` 用于脚本 需要它们进行中, 和门的部分: `createGate`, (中文(简体) ), `startGate`, (中文(简体) ), `verifyTicket`, (中文(简体) ), `parseJwks`, (中文(简体) ), `canonicalNext`, (中文(简体) ), `parseGateConfig`, (中文(简体) ), `bundleDoor`和即将来临的一页 `comingSoon` 财务报告和审定财务报表 `parsePageConfig`。 。 。 .

这是寄存器中一个有构建的软件包:一个宾箱必须是JavaScript,因为节点拒绝剥去 从下面的文件类型 `node_modules`。 。 。 . `tsc` 写入 `dist/` 打开 `prepack`,而门捆 复制门的 从那里整理文件 .

## 常见问题

### @coralreefventures/site-tools 是什么？

珊瑚礁公共站点的指令行工具:像主机一样服务静态输出,用灯塔把它关上,并把它锁在门后\.

### 如何安装 @coralreefventures/site-tools？

在项目目录运行 npm install @coralreefventures/site-tools，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 reef-serve、reef-lighthouse、reef-door-bundle，可以用 npx reef-serve 直接运行。

### @coralreefventures/site-tools 支持 TypeScript 吗？

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

### @coralreefventures/site-tools 支持 ESM 还是 CommonJS？

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

### @coralreefventures/site-tools 需要什么版本的 Node\.js？

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

### @coralreefventures/site-tools 可以商用吗？

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

### @coralreefventures/site-tools 的下载量有多少？

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

### @coralreefventures/site-tools 还在维护吗？

最新版本 0\.7\.0 发布于 2026/10/20（25 天前）；至今共发布 11 个版本，其中过去 12 个月发布了 11 个；首次发布于 2026/10/05。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

