豫言 / 双宿主构建 @ 0.1.0

构建浏览器或云工豫言 Wasm 应用及其宿主外壳;--自动 模式自读包描述、传递解析依赖、绑定操作系统接口并构建。

源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。

说明.汉语.md

# 双宿主构建

云工模式另生成 `动态资源.mjs`:它把宿主库的隔离入口、宿主桥和句柄桥源码以及值桥 Wasm 字节打包给 Dynamic Worker Loader;另附文件式程序的隔离运行入口 `隔离运行客.mjs` 与浏览器编译器宿主 `编译宿主.mjs`(内存文件系统与 `执行模块`),供[隔离运行接口](../../../豫言操作系统接口/隔离运行/规范.汉语.md)的云工适配使用。业务仍只需编译豫言源码;若要使用 Loader,许可文件需在 `LOADER` 下列出绑定名,并在 Wrangler 中配置 `worker_loaders`。同一 `get` 标识必须使用不变的代码和限额。

本工具用豫言编写。它将应用豫言源码编译为 WasmGC,按编译器核心的结构化表示直接写出值桥,并从浏览器或云工宿主库复制固定的 JS 外壳。JS 外壳仅加载 Wasm、传递宿主能力;应用行为仍在豫言中。

## 自动模式(推荐)

构建一个云工或浏览器应用只需要一条命令:工具自己读应用的包描述,传递解析依赖,为每个 `豫言操作系统XXX` 接口选择适配并绑定,生成包上下文,构建应用,最后封装接口清单。不必再手写包上下文,也不必逐个运行 `yy豫言操作系统绑定`。

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm --自动 <云工|浏览器> <应用目录> <输出目录> \
  [--包根 <目录>]… [--许可 <文件>|-] [--命名入口 <名>] [--编译器 <路径>] [--类型检查]
```

**构建根**:在“构建根”目录运行。构建根是含 `库/`(标准库与内置基础库)、`豫言操作系统接口/`、`豫言操作系统/`(`适配/`、`宿主/`、`装载/`),以及已构建的 `yy4_bs.wasm`(或 `--编译器` 指定的编译器)、`yy豫言操作系统接口检查`、`yy豫言操作系统绑定`、`yy豫言操作系统装载包` 的目录。语言仓根目录本身就是构建根,云仓的 `dist/构建源码` 也是。这些目录可以是指向语言仓的符号链接:工具用规范化(解析符号链接后)的物理路径生成包上下文,因为包上下文要求规范的绝对路径,且编译缓存按路径计,同一份源码只能以一个路径出现。

**参数**(选项可以写在位置参数之前、之间或之后):

- `云工|浏览器`:宿主模式。
- `应用目录`:含 `入口。豫` 与恰好一个包描述的目录。
- `输出目录`:产物目录;构建前会先删除(见“产物与临时文件”里的安全检查)。
- `--包根 <目录>`:可重复,指定到哪些目录(递归)里找库包,只认 `<包名>。包。豫`。目录相对构建根,也可写绝对路径;同一文件经多个包根重复出现只算一个。
- `--许可 <文件>|-`:云工模式的许可文件;缺省时取 `<应用目录>/许可.json`(存在时),否则不用;`-` 表示明确不用。浏览器模式不使用许可文件,给出文件会报错。
- `--命名入口 <名>`:仅云工模式,同旧调用形式的第七个参数(须为 ASCII 标识符)。
- `--编译器 <路径>`:缺省 `./yy4_bs.wasm`;不含斜杠的名字会补 `./`。
- `--类型检查`:只对入口做类型检查(编译器带 `--type-check-only --parallel -j 24`,诊断直接打印到终端),不构建产物,不装载清单。
- 编译器恒带 `--parallel -j 24`(构建并行度不低于二十)。`--帮助` 打印两种调用形式的用法。

**做什么**(按顺序):

1. 应用目录须恰有一个 `*。包。豫`,读其名称、所有者与依赖;没有时,须恰有一个 `*。包。豫.txt`(语言仓一致性验证目录把包描述存成 `.txt`,免得被全仓库包发现当成包):此时把应用目录复制到 `dist/.自动构建/<输出名>/应用`,并把 `.txt` 改回原名,此后以副本为应用目录。
2. 传递解析依赖:`标准库` 与内置基础库(`单元测试`、`癸象工具`、`网页客户端`、`云工宿主`、`浏览器宿主`)内置;`豫言操作系统XXX` 表示操作系统接口 `XXX`;其余依赖到各 `--包根` 里找恰一个 `<名>。包。豫`,找不到或多于一个都报错(写明包名、被谁依赖、已搜索的包根或全部候选),并递归解析它的依赖;环用已访问表截断。库与应用的排列是依赖在前、应用在末;接口按名字的字节序排列,与依赖声明顺序、包根顺序无关,产物可复现。所有包的所有者须为「豫言」,依赖须是平铺的名字列表,包名与接口名不得为空、`.`、`..`,也不得含斜杠、反斜杠、制表符与换行。
3. 对每个接口 `XXX`:接口目录 `豫言操作系统接口/XXX`(恰有一个 `*。接口。豫` 模块),适配目录按宿主模式取第一个存在的:云工模式 `豫言操作系统/适配/XXX云工`、`XXX`,浏览器模式 `XXX浏览器`、`XXX`;先删旧的 `dist/操作系统绑定/XXX`,再运行 `./yy豫言操作系统绑定 <接口包描述> <适配包描述> <适配实现模块> dist/操作系统绑定/XXX`。找不到适配时报错,并提示是否只存在另一宿主的适配。
4. 生成包上下文到 `dist/.自动构建/<输出名>/包上下文`(一行一个包:标准库、各内置基础库、各接口绑定包、库、应用;路径都是规范绝对路径,字段以真制表符分隔)。
5. 调老调用形式的同一函数构建(进程内,不另起本工具):`<模式> <应用目录>/入口。豫 <输出目录> <编译器> <包上下文> <许可文件或->` 加可选的命名入口。
6. 运行 `./yy豫言操作系统装载包 <输出目录> dist/操作系统绑定/<各接口>…`,写入 `接口要求组.json` 与 `宿主提供组.json`。

**产物与临时文件**:

- `<输出目录>`:先删后建。安全检查:输出目录最后一段不能是空、`.`、`..`;已存在的必须是目录;不能位于 `dist/.自动构建` 内;不能等于构建根、应用目录、任一包根,也不能是它们的上级目录。
- `dist/操作系统绑定/<接口名>/`:接口绑定包,每次构建都重新绑定。
- `dist/.自动构建/<输出名>/`:生成的 `包上下文`(可用来复查)与 `.txt` 描述时的 `应用/` 副本。云仓与语言仓都已忽略 `/dist/`。

**错误信息**:一律中文并写明原因。包括:当前目录不是构建根;缺少工具或文件;应用目录没有或有多个包描述;包描述格式不对(带文件名与病因);找不到依赖包、有多个候选、名称或所有者不符;接口没有适配;输出目录不安全;外部命令失败(带命令行与退出码,编译失败还附编译器输出)。失败时退出码为 1。

**与老调用形式的关系**:老调用形式(下一节)不变,云仓构建程序仍在使用。自动模式最终调用同一个构建函数,同一包上下文下与老调用形式的整个输出目录逐字节相同;与手写配方的差别只有:直接读取工作树里的库源码(不再 rsync 到暂存)、接口清单里接口按名字排序、包上下文行序不同(行序不影响 `程序.wasm`)。

**例子**:

```sh
# 云工:云工作台用户目录持久对象(云仓,构建根里,包根用绝对路径)
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm --自动 云工 $C/应用/豫言云工作台/用户目录应用 dist/云用户目录 \
  --包根 $C/应用/豫言云工作台/库 --包根 $C/库
# 浏览器:包服务阅读页
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm --自动 浏览器 $C/应用/包管理服务/阅读应用 dist/阅读应用 --包根 $C/应用/包管理服务/库
# 语言仓一致性验证(.txt 描述,无需包根),产物 dist/日志一致性
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm --自动 云工 豫言操作系统/适配/日志/一致性验证/应用 dist/日志一致性
```

**须知**:编译缓存目录取决于编译器 `.wasm` 的路径与修改时间,多个构建同时使用同一编译器会共享缓存,也共用 `dist/操作系统绑定`,勿并发。已知限制:只支持所有者为「豫言」的包;依赖列表须是平铺名字;接口逐个绑定(不并行);编译失败时编译器的全部输出原样带回,较长。

**构建本工具**:在构建根里写一个只含标准库、单元测试、癸象工具与本包的包上下文(路径须为规范绝对路径,故用 `pwd -P`),再用稳定编译器编译(云仓构建程序也是这样构建它的):

```sh
R=$(pwd -P)
printf '豫构包上下文二\n豫言\t标准库\t%s/库/标准库/标准库。包。豫\n豫言\t单元测试\t%s/库/单元测试/单元测试。包。豫\t豫言\t标准库\n豫言\t癸象工具\t%s/库/癸象工具/癸象工具。包。豫\t豫言\t标准库\t豫言\t单元测试\n豫言\t双宿主构建\t%s/豫言操作系统/应用/双宿主构建/双宿主构建。包。豫\t豫言\t标准库\t豫言\t单元测试\t豫言\t癸象工具\n' $R $R $R $R > 双宿主构建上下文
node 豫言操作系统/宿主/节点/宿主.cjs yy_bs_stable.wasm 豫言操作系统/应用/双宿主构建/入口。豫 --package-context 双宿主构建上下文 --do-not-load-cache -o yy双宿主构建.wasm
```


**单元测试**(纯函数部分:包描述解析、依赖解析、包上下文生成、接口适配选择、命令行解析):在语言仓根目录运行 `node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 构建 双宿主构建 <测试名> --输出 yy双宿主构建测试.wasm`,再用同一宿主运行产物。测试名依次是 `文本工具。测试`、`包描述。测试`、`依赖解析。测试`、`上下文生成。测试`、`接口适配。测试`、`自动参数。测试`、`宿主构建。测试`;例如 `node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 构建 双宿主构建 包描述。测试 --输出 yy双宿主构建包描述测试.wasm && node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建包描述测试.wasm`。也可用编译器直接编:`node 豫言操作系统/宿主/节点/宿主.cjs yy3_bs.wasm 豫言操作系统/应用/双宿主构建/包描述。测试。豫 --package-context 双宿主构建上下文 --parallel -j 24 -o yy双宿主构建包描述测试.wasm`,其中包上下文与下面构建本工具用的相同。

## 老调用形式

先构建 `yy双宿主构建`,然后从豫言仓库根运行:

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm 浏览器 应用/入口。豫 dist/浏览器 ./yy3_bs.wasm 包上下文 -
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm 云工 应用/入口。豫 dist/云工 ./yy3_bs.wasm 包上下文 许可.json
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm 云工 应用/入口。豫 dist/云工 ./yy3_bs.wasm 包上下文 许可.json CloudModel
```

`许可.json` 按绑定种类列出可用名称,例如 `{"KV":["账户缓存"],"R2":["项目资源"],"D1":["项目数据库"],"SERVICE":["编译服务"],"DO":["项目对象"],"ASSETS":["ASSETS"],"QUEUE":["页面队列"],"EMAIL":["EMAIL"]}`。浏览器模式传 `-`。云工模式产物的 `入口.mjs` 是 Wrangler 的 `main`,同一豫言 Wasm 可由 `fetch` 或 `queue` 事件调用;浏览器模式由页面导入 `入口.mjs` 并调用 `启动豫言浏览器应用()`。构建器编译应用时禁用旧缓存,避免共享工作树中的过期产物;它不创建 Wrangler 部署配置,也不修改云仓代码。

第七个参数可选,仅云工模式使用:指定一个 ASCII 标识符作为命名 `WorkerEntrypoint` 导出名。上例生成 `CloudModel`,其 `fetch(Request)` 以 `service-fetch` 事件进入同一豫言 Wasm;公开默认入口继续以 `fetch` 事件进入,由豫言分别处理。Wrangler 的 Service binding 可配置 `{"binding":"内部服务","service":"当前Worker名","entrypoint":"CloudModel"}`。Wrangler 4.129.0 本地同 Worker 绑定已验证公开默认路径与内部服务路径分离;非法别名会被构建器拒绝。自定义 RPC 方法、多命名入口和云端部署尚待补齐。[Cloudflare 命名入口文档](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/rpc/#named-entrypoints)说明绑定配置。

浏览器模式还会复制 `自动启动.mjs`。页面直接写 `<script type="module" src="/产物/自动启动.mjs?标识=应用根"></script>` 即可启动,不需另写调用 JS;只有 `id="应用根"` 的元素存在时才加载 Wasm。省略 `标识` 时直接启动。真实 Chrome 已验证存在时执行豫言 Wasm、缺少标识时跳过且不请求 Wasm 文件。`入口.mjs` 的显式启动函数仍可用于需要自行控制生命周期的页面。

浏览器模式也复制 `工作线程自动启动.mjs`。将 Worker 的豫言程序另构建至页面产物子目录后,页面豫言可用 `浏览器工作线程新建("./子目录/工作线程自动启动.mjs", "{}")` 启动它。外壳在 Dedicated Worker 中加载同目录的 `程序.wasm` 与 `值桥.wasm`;Worker 业务须用豫言写,并调用 `浏览器工作线程自身句柄`、`浏览器事件订阅选项`、`等待浏览器事件` 及 `浏览器工作线程向主线程发值`。真实 Chrome 已验证两侧豫言 Wasm 的 ready 与回显往返。

云工模式的 `入口.mjs` 还导出通用 `豫言持久对象` 类,可在 Wrangler 的 Durable Object 绑定和 SQLite `exports` 中引用。类的 fetch、alarm 外层分派由宿主库完成,实际对象逻辑与持久数据读写由同一豫言 Wasm 执行;构建器仍不替应用生成 Wrangler 配置。

云工模式还会读取应用目录(`入口。豫` 所在目录)里的可选文件 `执行配置.json`,经 JSON 解析并规范化后写成产物 `动态资源.mjs` 的导出常量 `执行配置`,缺文件时写 `{}`(非法 JSON 使构建失败)。它只调整各事件种类的墙钟时限(如 `{"事件时限毫秒":{"durable-alarm":900000}}`),不属于 `许可.json`,也不改变许可的绑定种类结构;产物里的 `入口.mjs` 在加载时校验并使用它,非法配置使 Worker 加载失败。入口壳用命名空间导入读取该导出,所以新旧壳与新旧构建器可以混用(缺少该导出时按默认时限运行)。格式、默认值与上限见 `豫言操作系统/宿主/云工/说明.汉语.md`。

构建器调用编译器时恒带 `--parallel -j 24`(二十四路并行调度,用户要求构建并行度不低于二十),类型检查与最终链接的耗时明显缩短(实测应用类型检查由约 40 秒降到约 18 秒);同一编译缓存同一时刻只应由一次构建使用,勿并发运行多个 `yy双宿主构建` 共享缓存。

说明.文言.md

# 双宿主构建

云工模式又出 `动态资源.mjs`,汇隔离入口、宿主与句柄之源码,兼值桥 Wasm 字节,以备动态载器;又附文件式程序之隔离运行入口 `隔离运行客.mjs` 与浏览器编器宿主 `编译宿主.mjs`(内存文件系与 `执行模块`),以供[隔离运行公约](../../../豫言操作系统接口/隔离运行/规范.文言.md)之云工适配。实务唯书豫言;用 Loader 者,许可书之 `LOADER` 当列其名,Wrangler 须置 `worker_loaders`。同号 `get` 之码与限额须恒同。

此器以豫言书之。取应用豫言稿,编为 WasmGC,依编译器核心之结构径书值桥,抄浏览器或云工库中固定 JS 外壳。外壳唯载器、传能,应用之法悉在豫言。

## 自动模式(宜先用)

构一云工或浏览器之应用,一令足矣:器自读应用之包描述,循依赖而尽取其闭包,于每 `豫言操作系统XXX` 接口择适配而绑之,书包上下文,构应用,终封接口之清单。不必手书包上下文,亦不必逐一行 `yy豫言操作系统绑定`。

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm --自动 <云工|浏览器> <应用目录> <输出目录> \
  [--包根 <目录>]… [--许可 <文件>|-] [--命名入口 <名>] [--编译器 <路径>] [--类型检查]
```

**构建根**:行于「构建根」之目录。构建根者,含 `库/`(标准库与内置基础库)、`豫言操作系统接口/`、`豫言操作系统/`(`适配/`、`宿主/`、`装载/`),并已成之 `yy4_bs.wasm`(或 `--编译器` 所指者)、`yy豫言操作系统接口检查`、`yy豫言操作系统绑定`、`yy豫言操作系统装载包` 之目录也。语言仓根本身即构建根,云仓之 `dist/构建源码` 亦然。诸目录可为指向语言仓之符号链接:器以规范化(解符号链接后)之实径书包上下文,盖包上下文须规范绝径,且编译缓存以径计,同一源码唯可以一径见也。

**参数**(选项可书于位置参之前、之间、之后):

- `云工|浏览器`:宿主之模。
- `应用目录`:含 `入口。豫` 与恰一包描述之目录。
- `输出目录`:产物之目录;构建前先删之(见「产物与临时文件」之安检)。
- `--包根 <目录>`:可重复,指诸库包所在之目录(递归以寻),唯认 `<包名>。包。豫`。目录相对构建根,亦可书绝径;同一文件经数包根而重见者,只算其一。
- `--许可 <文件>|-`:云工模之许可文件;缺则取 `<应用目录>/许可.json`(有则用),否则不用;`-` 明示不用。浏览器模不用许可文件,给之则拒。
- `--命名入口 <名>`:唯云工模用,同旧式之第七参(须为 ASCII 标识符)。
- `--编译器 <路径>`:缺省 `./yy4_bs.wasm`;名无斜杠者补 `./`。
- `--类型检查`:唯对入口验类(编译器加 `--type-check-only --parallel -j 24`,诊断直出于终端),不出产物,不装清单。
- 编译器恒加 `--parallel -j 24`(构建并行不少于二十)。`--帮助` 陈二式之用法。

**所行**(依次):

1. 应用目录须恰有一 `*。包。豫`,读其名称、所有者与依赖;无之,则须恰有一 `*。包。豫.txt`(语言仓一致性验证之目录,以包描述存为 `.txt`,免为全仓库包发现误认为包):此时复制应用目录于 `dist/.自动构建/<输出名>/应用`,并改 `.txt` 为原名,此后以副本为应用目录。
2. 循依赖而尽取其闭包:`标准库` 与内置基础库(`单元测试`、`癸象工具`、`网页客户端`、`云工宿主`、`浏览器宿主`)内置;`豫言操作系统XXX` 谓操作系统接口 `XXX`;余依赖,于诸 `--包根` 中寻恰一 `<名>。包。豫`,无则告,多则告(明包名、何者所依、所搜之包根或诸候选),并递归解其依赖;有环则以已访之表截之。库与应用之序:依赖在前,应用居末;接口依名之字节序,不随依赖声明之序与包根之序,故产物可复现。诸包所有者须为「豫言」,依赖须为平铺之名列,包名与接口名不得空、不得为 `.`、`..`,亦不得含斜杠、反斜杠、制表与换行。
3. 每接口 `XXX`:接口目录 `豫言操作系统接口/XXX`(恰有一 `*。接口。豫` 模块);适配目录依宿主之模取其先存在者:云工模 `豫言操作系统/适配/XXX云工`、`XXX`,浏览器模 `XXX浏览器`、`XXX`;先删旧 `dist/操作系统绑定/XXX`,后行 `./yy豫言操作系统绑定 <接口包描述> <适配包描述> <适配实现模块> dist/操作系统绑定/XXX`。无适配则告,并示他宿主之适配存否。
4. 书包上下文于 `dist/.自动构建/<输出名>/包上下文`(一行一包:标准库、诸内置基础库、诸接口绑定包、诸库、应用;径皆规范绝径,字段以真制表符隔之)。
5. 以旧式之同一函数构建(同进程,不另启本器):`<模> <应用目录>/入口。豫 <输出目录> <编译器> <包上下文> <许可文件或->`,可加命名入口。
6. 行 `./yy豫言操作系统装载包 <输出目录> dist/操作系统绑定/<诸接口>…`,书 `接口要求组.json` 与 `宿主提供组.json`。

**产物与临时文件**:

- `<输出目录>`:先删后建。安检:其末段不得为空、`.`、`..`;已存在者须为目录;不得在 `dist/.自动构建` 之内;不得等于构建根、应用目录、任一包根,亦不得为其上级目录。
- `dist/操作系统绑定/<接口名>/`:接口绑定包,每次构建皆重绑。
- `dist/.自动构建/<输出名>/`:所书之 `包上下文`(可以复查)与 `.txt` 描述时之 `应用/` 副本。云仓与语言仓皆已忽略 `/dist/`。

**误告**:皆以中文书之,明其因。含:当前目录非构建根;缺工具或文件;应用目录无包描述或有多个;包描述格式不对(带文件名与病因);依赖包不得、候选有多、名称或所有者不符;接口无适配;输出目录不安全;外部命令败(带命令行与退出码,编译败者兼附编译器之输出)。败则退出码一。

**与旧式之关系**:旧式(下节)不变,云仓构建程序仍用之。自动模式终以同一构建函数行之,同一包上下文之下,整个输出目录与旧式逐字节相同;与手写配方之异,唯:直读工作树之库源(不复 rsync 于暂存)、接口清单中接口依名排序、包上下文行序有别(行序不影响 `程序.wasm`)。

**例**:

```sh
# 云工:云工作台用户目录持久对象(云仓;于构建根中,包根书绝径)
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm --自动 云工 $C/应用/豫言云工作台/用户目录应用 dist/云用户目录 \
  --包根 $C/应用/豫言云工作台/库 --包根 $C/库
# 浏览器:包服务阅读页
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm --自动 浏览器 $C/应用/包管理服务/阅读应用 dist/阅读应用 --包根 $C/应用/包管理服务/库
# 语言仓一致性验证(.txt 描述,无需包根),产物 dist/日志一致性
node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建.wasm --自动 云工 豫言操作系统/适配/日志/一致性验证/应用 dist/日志一致性
```

**须知**:编译缓存之目依编译器 `.wasm` 之径与修改之时,数构建同用一编译器则共其缓存,亦共 `dist/操作系统绑定`,勿并行。已知之限:唯支持所有者为「豫言」之包;依赖须为平铺之名列;接口逐一绑之(不并行);编译败时,编译器之全部输出原样带回,颇长。

**构建本器**:于构建根书一仅含标准库、单元测试、癸象工具与本包之包上下文(径须规范绝径,故用 `pwd -P`),而以稳定编译器编之(云仓构建程序亦如此构之):

```sh
R=$(pwd -P)
printf '豫构包上下文二\n豫言\t标准库\t%s/库/标准库/标准库。包。豫\n豫言\t单元测试\t%s/库/单元测试/单元测试。包。豫\t豫言\t标准库\n豫言\t癸象工具\t%s/库/癸象工具/癸象工具。包。豫\t豫言\t标准库\t豫言\t单元测试\n豫言\t双宿主构建\t%s/豫言操作系统/应用/双宿主构建/双宿主构建。包。豫\t豫言\t标准库\t豫言\t单元测试\t豫言\t癸象工具\n' $R $R $R $R > 双宿主构建上下文
node 豫言操作系统/宿主/节点/宿主.cjs yy_bs_stable.wasm 豫言操作系统/应用/双宿主构建/入口。豫 --package-context 双宿主构建上下文 --do-not-load-cache -o yy双宿主构建.wasm
```


**单元测试**(纯函数之部:包描述之解析、依赖之解析、包上下文之书、接口适配之择、命令行之析):于语言仓根行 `node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 构建 双宿主构建 <测试名> --输出 yy双宿主构建测试.wasm`,再以同一宿主行其产物。测试名依次为 `文本工具。测试`、`包描述。测试`、`依赖解析。测试`、`上下文生成。测试`、`接口适配。测试`、`自动参数。测试`、`宿主构建。测试`;例如 `node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 构建 双宿主构建 包描述。测试 --输出 yy双宿主构建包描述测试.wasm && node 豫言操作系统/宿主/节点/宿主.cjs yy双宿主构建包描述测试.wasm`。亦可以编译器直编:`node 豫言操作系统/宿主/节点/宿主.cjs yy3_bs.wasm 豫言操作系统/应用/双宿主构建/包描述。测试。豫 --package-context 双宿主构建上下文 --parallel -j 24 -o yy双宿主构建包描述测试.wasm`,包上下文同上「构建本器」所书。

## 旧式

先成 `yy双宿主构建`,于仓根以六参行之:模式、源码、产物目录、编译器、包上下文、许可文件;第七参可命云工服务入口。模式称「浏览器」或「云工」;浏览器许可传 `-`。云工许可书按 KV、R2、D1、SERVICE、DO、ASSETS、QUEUE、EMAIL 列可授绑定。云工之 `入口.mjs` 可作 Wrangler 主入口,同一豫言 Wasm 可受 fetch 或 queue 之事;浏览器则呼 `启动豫言浏览器应用()`。编应用时禁旧缓存,以防共享工作树旧物混入;此器不立部署配置,亦不改云仓。

云工第七参若为 `CloudModel`,构建器出同名 `WorkerEntrypoint`,其请以 `service-fetch` 事入豫言;公域默认请仍以 `fetch` 入。Wrangler 可以 `entrypoint: CloudModel` 指服务绑定。Wrangler 4.129.0 本地同 Worker 绑定已验二路异应;非法别名见拒。自定 RPC 法、多个别名及云上部署待补。详 [Cloudflare 命名入口文档](https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/rpc/#named-entrypoints)。

浏览器产物又有 `自动启动.mjs`。页载 `<script type="module" src="/产物/自动启动.mjs?标识=应用根"></script>`,无需别书调用 JS;有 `id="应用根"` 始取 Wasm 而启之。省标识则即启。真 Chrome 已验有标则行豫言、无标则略之且不取 Wasm。若欲自主持客器之寿,仍可呼 `入口.mjs` 所出之明启函数。

浏览器产物并抄 `工作线程自动启动.mjs`。工客豫言源若别于页客,宜构于页产物子目录;页客以子目录壳之相对址造工。壳于 Dedicated Worker 内载同目录二 Wasm;工客先以自身柄听主信,继以豫言回信。真 Chrome 已验页、工皆为豫言 Wasm 而初信与回信往还。

云工 `入口.mjs` 又出通用 `豫言持久对象` 类,可于 Wrangler 持久对象绑定及 SQLite `exports` 引之。类之外层分派 fetch、alarm 唯属宿主,实务之断与久态读写由同一豫言 Wasm 行之;构建器仍不代应用立 Wrangler 配置。

云工之模又读应用目录(`入口。豫` 所在)之可选文 `执行配置.json`,析为 JSON 而规整之,书为产物 `动态资源.mjs` 之导出常量 `执行配置`,无文则书 `{}`(JSON 非法则构建败)。其文惟调各事类之墙钟时限(如 `{"事件时限毫秒":{"durable-alarm":900000}}`),非属 `许可.json`,亦不易许可依绑定种类之结构;产物之 `入口.mjs` 于加载时验之而用之,配置非法则 Worker 加载败。入口壳以命名空间导入读此导出,故新旧之壳与新旧之构建器可相混而用(缺此导出则守默认时限)。其式、默值与上限见 `豫言操作系统/宿主/云工/说明.文言.md`。

构建器每召编译器,恒加 `--parallel -j 24`,二十四路并行,验类与终链皆速(实测验类自约四十秒减至约十八秒)。同缓存一时唯一构建可用,勿并行多构建共缓存。