在当前网页里加载并启动另一个同源的豫言浏览器应用。
源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。
# 网页应用接口规范 0.1.0
本包让一个浏览器里的豫言应用**启动同一站点上的另一个豫言浏览器应用**。云控制台的各服务页(用量分析、AI 市场)各是一个独立构建的豫言应用,宿主页里的控制台应用在需要时把它们挂到页面上,而不必让页面另写 JavaScript 去动态加载。应用依赖本包后,全部函数都必须实现。
“豫言浏览器应用”指构建器生成的应用目录:目录里有加载器 `入口.mjs`(导出 `启动豫言浏览器应用(选项)`)、`程序.wasm`、`值桥.wasm`、宿主 JS 与接口清单;子应用有自己的 Wasm 实例、自己的统一事件队列、自己的句柄表,与父应用只通过**页面本身**(DOM、网页消息)交换信息。
## 函数
### `启动页面应用 : 字符串 → 有`
参数是子应用加载器的**站内路径**,例如 `/AI市场应用/入口.mjs`。宿主:
1. 校验路径(见下);
2. 动态加载该模块,调用它导出的 `启动豫言浏览器应用()`(应用文件的位置默认是该模块所在目录);
3. **挂起当前调用**,直到子应用**就绪**——它第一次进入事件等待,或已经运行结束;就绪前父应用的事件照常排队;
4. 返回。子应用此后独立运行,直到页面结束或**父应用结束**(宿主关闭时子应用一并关闭);父应用无法停止或查询它。
**路径规则**:以 `/` 开头且不以 `//` 开头;以 `/入口.mjs` 结尾;至多 512 个 UTF-16 码元;不含 `..`、`.` 目录段、查询(`?`)、片段(`#`)、反斜杠、控制字符与百分号编码。违反属违规调用。
**限额与失败**:同一路径在一个页面里**只能启动一次**(重复启动抛事故,避免两个应用争抢同一片 DOM);同时最多启动 8 个子应用;模块不存在或加载失败、模块没有导出 `启动豫言浏览器应用`、子应用装载或接口核对失败、30 秒内未就绪,都抛事故并带中文说明(子应用启动后才发生的失败不影响父应用)。
## 使用约定
- **先备好 DOM,再启动**:子应用在启动时读取页面里它需要的元素与订阅事件,所以父应用要先用文树接口(例如 `装入页面模板`)把子应用的容器与静态骨架放到页面里,再调用 `启动页面应用`。
- **一个页面里各应用的元素 ID 不得冲突**(子应用按 ID 读写页面)。
- 父子之间要通信,用网页消息包(前缀“豫言”的文档消息)。
## 一致性样例
1. 页面已有 `<div id="子根"></div>`;父应用 `启动页面应用("/子应用/入口.mjs")` 返回后,子应用已经把文字写进 `子根`,并且响应它订阅的点击。
2. 再次 `启动页面应用("/子应用/入口.mjs")`:抛事故(已启动)。
3. `启动页面应用("/子应用/程序.wasm")`、`启动页面应用("../入口.mjs")`、`启动页面应用("/子应用/入口.mjs?x=1")`:抛事故(路径不合规)。
4. 路径合规但文件不存在:抛事故,说明加载失败。
5. 子应用启动期间到达的父应用事件(点击、消息)不丢,`启动页面应用` 返回后可取到。
## 边界
本包不规定:停止或重启子应用、把参数传给子应用(用页面 DOM 与网页消息)、跨来源的应用、子应用退出的通知、共享内存或共享句柄。
# 网页应用之约 0.1.0 此包令一浏览器中之豫言应用**启同站之另一豫言浏览器应用**。云控制台诸服务页(用量分析、AI 市场)各为独立构建之豫言应用,宿主页中之控制台应用,需时以之挂于页上,而不使页面别书 JavaScript 以动态载之。客依此包,诸术皆当具。 “豫言浏览器应用”,谓构建器所生之应用目录:其中有加载器“入口.mjs”(出“启动豫言浏览器应用(选项)”)、程序.wasm、值桥.wasm、宿主 JS 与接口清单;子应用自有其 Wasm 实例、自有其统一事列、自有其句柄表,与父应用惟凭**页面本身**(文树、网页消息)相通。 ## 诸术 ### 启动页面应用:字符串,返有 参数乃子应用加载器之**站内径**,如“/AI市场应用/入口.mjs”。宿主: 1. 验其径(见下); 2. 动态载其模块,调其所出之“启动豫言浏览器应用()”(应用文件之位默认在此模块所在之目录); 3. **挂起当前之调用**,直至子应用**就绪**——其首入事件之候,或已行毕;就绪前父应用之事照常排列; 4. 而返。子应用此后独行,直至页终或**父应用终**(宿主闭则子应用一并闭);父应用不能止之,亦不能问之。 **径之律**:以“/”首而非“//”首;以“/入口.mjs”终;至多五百一十二 UTF-16 码元;无“..”、“.”目录段、查询(“?”)、片段(“#”)、反斜杠、控制字符与百分号编码。违者为违约之调用。 **限额与败**:同一径于一页中**惟可启一次**(重启则发事故,免二应用争同一片文树);同时至多启八个子应用;模块不存或载败、模块无“启动豫言浏览器应用”之出、子应用装载或接口核对败、三十秒内未就绪,皆发事故而附中文之释(子应用启后所生之败不累父应用)。 ## 用之约 - **先备文树,后启动**:子应用启时读页中所需之元素而订阅诸事,故父应用当先以文树接口(如装入页面模板)置子应用之容器与静骨于页,然后调启动页面应用。 - **一页中诸应用之元素标识不得相冲**(子应用依标识而读写页面)。 - 父子欲通,用网页消息包(“豫言”首之文档消息)。 ## 一致性之例 1. 页已有 `<div id="子根"></div>`;父应用启动页面应用(“/子应用/入口.mjs”)返后,子应用已书文于“子根”,且应其所订之点击。 2. 再启动页面应用(“/子应用/入口.mjs”):发事故(已启)。 3. 启动页面应用(“/子应用/程序.wasm”)、(“../入口.mjs”)、(“/子应用/入口.mjs?x=1”):发事故(径不合)。 4. 径合而文件不存:发事故,释其载败。 5. 子应用启时所至之父应用事(点击、消息)不失,启动页面应用返后可取。 ## 界 此包不定:止或重启子应用、传参于子应用(用页面文树与网页消息)、跨来源之应用、子应用退出之告、共享内存或共享句柄。