适配器与绑定参考
十三种技术的注册、自定义适配器、插槽、hooks、响应式 store 和 AI 辅助工具。
版本、变更与要求见 Framework 3.2 与 CLI 1.0。
共同契约与各框架能力
每个 wu-framework/adapters/<framework> 子路径导出 register 及专用工具。只导入实际使用的适配器。wu-framework/adapters 汇集 registerReact、registerVue 和 createVueUseWuAI 等别名;wuReact、wuVue 等对象将相同函数分组,其 default export 也是同一组工具。
注册返回 true 表示生命周期已定义,或独立挂载已经完成。register() 会等待该挂载,失败时拒绝。在 shell 中,从微应用入口注册并等待 wu.mount;adapter 生命周期是异步的。
Hook factories 在 render 外创建,在对应组件内使用。Card、Root 等示例组件的导入代表已由相应 framework 编译的应用模块。每个条目说明 4.0.0 中的清理方式和契约。
事件和 store hooks 会解析已挂载应用的 facade。只有在 WU 挂载之外才使用全局 runtime。getWuInstance() 仍返回 host,AI helpers 仍使用其 wu.ai。参阅集成和组合权限。
loadAdapter
按名称加载并缓存适配器模块。
loadAdapter(name): Promise<AdapterModule>
- 参数: ADAPTER_NAMES 中的一个名称,使用小写。
- **返回:**adapter 对象(
wuReact、wuVue或等价对象);共享进行中加载的 promise。 - 错误: 未知名称或导入失败会拒绝。加载失败会释放 Promise,允许重试。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 导入的模块保留在进程缓存中。
import { loadAdapter } from 'wu-framework/adapters';
const { register } = await loadAdapter('react');
参考:src/adapters/index.js.
ADAPTER_NAMES
列出可从 barrel 加载的适配器。
ADAPTER_NAMES: readonly string[]
- 参数: 冻结常量。
- 返回值: 名称列表。
- 错误: 读取无副作用。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 无需清理。
import { ADAPTER_NAMES } from 'wu-framework/adapters';
console.log(ADAPTER_NAMES);
参考:src/adapters/index.js.
getWuInstance
在当前窗口以及可访问的 parent、top 中查找 WU。
getWuInstance(): WuCore | null
- 参数: 由 shared 和各适配器导出。
- 返回值: 找到的实例或 null。
- 错误: 捕获跨 origin 访问 parent/top 的错误,不因此抛出。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 不创建订阅。
import { getWuInstance } from 'wu-framework/adapters/shared';
const wu = getWuInstance();
参考:src/adapters/shared.js.
waitForWu
通过 ready 事件和轮询等待全局实例。
waitForWu(timeout?): Promise<WuCore | null>
- 参数: 毫秒时间,默认 5000。
- 返回值: 找到的实例;没有实例的外部 ready 事件可能解析为 null。
- 错误: 超时后拒绝;需要 window。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: helper 在成功或拒绝时移除监听器和定时器。
import { waitForWu } from 'wu-framework/adapters/shared';
const wu = await waitForWu(3000);
if (!wu) throw new Error('No hay runtime disponible');
参考:src/adapters/shared.js.
createWuAdapter
构建自定义适配器,为各应用管理挂载状态和 props。
createWuAdapter(config): register
- 参数: mount 和 unmount 必填;name、ensure、update、hydrate、defineTimeout 可选。生成的函数接收 appName、Component、options。
- 返回值: 返回 boolean 的异步注册函数。
- 错误: 缺少 mount/unmount 时抛出;ensure:false 返回 false。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { createWuAdapter } from 'wu-framework/adapters/shared';
const register = createWuAdapter({
mount(container, { Component, props }) { return Component(container, props); },
unmount(_container, { instance }) { instance?.dispose?.(); },
});
await register('plain', (container) => {
container.textContent = 'Hola';
return { dispose() { container.replaceChildren(); } };
}, { standalone: false });
不包含独立的权限策略。container 和生命周期来自 WU。
参考:src/adapters/shared.js.
react.register
通过 WU 支持的回调注册 React 应用。
register(appName, Component, options?): Promise<boolean>
- 参数: strictMode true、props、onMount/onUnmount、standalone true、standaloneContainer #root,以及可选 runtime:{React,ReactDOM}。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/react';
import React from 'react';
import * as ReactDOM from 'react-dom/client';
await register('card', Card, { runtime: { React, ReactDOM }, props: { count: 1 }, standalone: false });
React 必须使用 createRoot;hydration 需要同一实例中的 hydrateRoot。
参考:src/adapters/react/index.js.
vue.register
通过 WU 支持的回调注册 Vue 应用。
register(appName, RootComponent, options?): Promise<boolean>
- 参数: props、setup(app)、onMount/onUnmount、standalone true、standaloneContainer #app。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/vue';
await register('card', Card, { props: { count: 1 }, standalone: false });
Vue 通过响应式 wrapper 更新已挂载或已水合子实例的 props,并保留 keep-alive。
参考:src/adapters/vue/index.js.
angular.register
通过 WU 支持的回调注册 Angular 应用。
register(appName, AppModule, options?): Promise<boolean>
- 参数: platformFactory、providers、rootSelector app-root、standalone 和回调。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/angular';
await register('card', AppModule, { rootSelector: 'card-root', standalone: false });
standalone 组件使用 registerStandalone。此注册负责创建和销毁 Angular 平台与模块。
参考:src/adapters/angular/index.js.
svelte.register
通过 WU 支持的回调注册 Svelte 应用。
register(appName, Component, options?): Promise<boolean>
- 参数: props、context Map、intro false、standalone true、standaloneContainer #app 和回调。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/svelte';
await register('card', Card, { props: { count: 1 }, standalone: false });
此注册使用 Svelte 4 模型的构造函数、$set 和 $destroy。现代 API 请使用 registerSvelte5。
参考:src/adapters/svelte/index.js.
preact.register
通过 WU 支持的回调注册 Preact 应用。
register(appName, Component, options?): Promise<boolean>
- 参数: props、回调、standalone true 和 standaloneContainer #app。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/preact';
await register('card', Card, { props: { count: 1 }, standalone: false });
向 props 添加 wuAppName 和 wuInstance;update 合并 props 后重新渲染。
参考:src/adapters/preact/index.js.
solid.register
通过 WU 支持的回调注册 Solid 应用。
register(appName, Component, options?): Promise<boolean>
- 参数: props、回调、standalone true 和 standaloneContainer #root。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/solid';
await register('card', Card, { props: { count: 1 }, standalone: false });
注册需要 solid-js/web,不预设与 React 相同的 update/hydrate 契约。
参考:src/adapters/solid/index.js.
lit.register
通过 WU 支持的回调注册 Lit 应用。
register(appName, ElementClass, options?): Promise<boolean>
- 参数: tagName、properties、回调、standalone true 和 standaloneContainer #root。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/lit';
await register('card', CardElement, { tagName: 'demo-card', properties: { count: 1 }, standalone: false });
卸载后自定义元素仍保留在 customElements 中,全局注册无法撤销。
参考:src/adapters/lit/index.js.
vanilla.register
通过 WU 支持的回调注册原生 JavaScript 应用。
register(appName, config, options?): Promise<boolean>
- 参数: config.render 必填,init/destroy/state 可选;共享适配器的 options。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/vanilla';
await register('card', {
state: { count: 1 },
render(container, state) { container.textContent = String(state.count); },
}, { standalone: false });
render 控制容器内容,destroy 释放外部资源。
参考:src/adapters/vanilla/index.js.
alpine.register
通过 WU 支持的回调注册 Alpine 应用。
register(appName, appConfig, options?): Promise<boolean>
- 参数: template 和 data();runtime Alpine 与 dataName 可位于 config 或 options;standalone/callbacks。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/alpine';
await register('card', {
template: '<section x-data="__WU_ALPINE_DATA__"><b x-text="count"></b></section>',
data: () => ({ count: 1 }),
}, { runtime: Alpine, standalone: false });
没有 Alpine runtime 时只插入 HTML 并警告;注册 true 不证明 Alpine 属性已生效。
参考:src/adapters/alpine/index.js.
qwik.register
通过 WU 支持的回调注册 Qwik 应用。
register(appName, Component, options?): Promise<boolean>
- **参数:**props 和 runtime;runtime 可以是 Qwik 1 或 Qwik 2。不接受
base、createProps、loadQwikLoader或 standalone 选项。 - 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/qwik';
await register('card', Card, { props: { count: 1 } });
adapter 优先加载 @qwik.dev/core,其次为 @builder.io/qwik,并加载与 runtime 版本匹配的 qwikloader。wu prop 使用 noSerialize,包含应用的 facade。
参考:src/adapters/qwik/index.js.
stencil.register
通过 WU 支持的回调注册 Stencil 应用。
register(appName, tagName, options?): Promise<boolean>
- 参数: props 传 JavaScript 值,attributes 传字符串,另有回调和 standalone。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/stencil';
await register('card', 'demo-card', { props: { count: 1 }, attributes: { label: 'Resumen' }, standalone: false });
请预先注册 Stencil bundle 的自定义元素;helper 创建标签,但不加载其定义。
参考:src/adapters/stencil/index.js.
htmx.register
通过 WU 支持的回调注册 HTMX 应用。
register(appName, config, options?): Promise<boolean>
- 参数: template 必填;baseUrl、setup(container,htmx)、runtime 及 standalone/callbacks 选项。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/htmx';
await register('card', {
template: '<button hx-get="/fragment">Actualizar</button>',
baseUrl: '/api',
}, { runtime: htmx, standalone: false });
以 / 开头的 hx-* 路径通过拼接 baseUrl 重写。没有 htmx 时只插入 HTML,不启用请求。setup 可以返回 cleanup。
参考:src/adapters/htmx/index.js.
stimulus.register
通过 WU 支持的回调注册 Stimulus 应用。
register(appName, config, options?): Promise<boolean>
- 参数: template 和非空 controllers 映射,回调及 standalone。
- 返回值: 定义生命周期或成功启用 standalone 回退时为 true;无法完成注册时为 false。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { register } from 'wu-framework/adapters/stimulus';
await register('card', {
template: '<section data-controller="counter"></section>',
controllers: { counter: CounterController },
}, { standalone: false });
为子树创建 Stimulus Application,卸载时停止它。
参考:src/adapters/stimulus/index.js.
angular.registerStandalone
在 WU 容器内部创建宿主并挂载 Angular standalone 组件。
registerStandalone(appName, RootComponent, options?): Promise<boolean>
- 参数: appConfig、createApplication、createComponent、provideZoneChangeDetection、回调和 standalone。
- 返回值: 注册结果 Boolean。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { registerStandalone } from 'wu-framework/adapters/angular';
import { createApplication } from '@angular/platform-browser';
import { createComponent } from '@angular/core';
await registerStandalone('card', Card, { createApplication, createComponent, standalone: false });
初始 props 和 wu.update() 应用于 Angular 实例的 inputs。
参考:src/adapters/angular/index.js.
angular.registerElement
通过 Angular Elements 暴露 Angular 组件。
registerElement(appName, Component, options?): Promise<boolean>
- 参数: elementTag、appConfig、回调、standalone 和 standaloneContainer。
- 返回值: 注册结果 Boolean。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { registerElement } from 'wu-framework/adapters/angular';
await registerElement('card', Card, { elementTag: 'angular-card', standalone: false });
需要 @angular/elements。移除元素不会撤销其全局构造函数注册。
参考:src/adapters/angular/index.js.
svelte.registerSvelte5
使用 Svelte 5 的 mount/unmount,并可回退到旧组件 API。
registerSvelte5(appName, Component, options?): Promise<boolean>
- **参数:**props、onMount、onUnmount 和 standalone 选项。不接受
createProps。 - 返回值: 注册结果 Boolean。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { registerSvelte5 } from 'wu-framework/adapters/svelte';
await registerSvelte5('card', Card, { props: { count: 1 }, standalone: false });
registerSvelte5 注册 mount/unmount,不提供 update slot。实时数据应使用共享 store;不要期望 wu.update() 改变由该函数注册的组件 props。
参考:src/adapters/svelte/index.js.
preact.registerCompat
使用 preact/compat 渲染,无法导入时回退到 Preact 适配器。
registerCompat(appName, Component, options?): Promise<boolean>
- 参数: props、回调和 standalone。
- 返回值: 注册结果 Boolean。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { registerCompat } from 'wu-framework/adapters/preact';
await registerCompat('card', Card, { standalone: false });
compat 路径注册 mount/unmount,不等同于普通 register 的 update 通道。
参考:src/adapters/preact/index.js.
lit.registerWebComponent
为不依赖 Lit 的 HTMLElement 类复用 Lit 注册。
registerWebComponent(appName, ElementClass, options?): Promise<boolean>
- 参数: 自定义元素类,以及 Lit register 的相同 options。
- 返回值: 注册结果 Boolean。
- 错误: WU 或框架不可用时,注册可能返回 false;也会捕获 mount 期间 renderer 的错误。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 wu.unmount(appName) 卸载以执行框架清理;保存并取消自己的订阅。
import { registerWebComponent } from 'wu-framework/adapters/lit';
class Card extends HTMLElement { connectedCallback() { this.textContent = 'Hola'; } }
await registerWebComponent('card', Card, { tagName: 'plain-card', standalone: false });
参考:src/adapters/lit/index.js.
react.createUseWuEvents
创建与组件生命周期绑定的事件 hook。
createUseWuEvents(React): () => EventsHelper
- 参数: 包含所需 hooks 的 React namespace。helper 返回 emit、on 和 once。
- 返回值: 返回发布与订阅函数的 hook。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: on 创建的订阅会在卸载时移除;once 可能尚未触发时,也应保存其 disposer。
import React from 'react';
import { createUseWuEvents } from 'wu-framework/adapters/react';
const useWuEvents = createUseWuEvents(React);
function View() {
const events = useWuEvents();
return null;
}
参考:src/adapters/react/index.js.
react.createUseWuStore
创建将 store 路径映射到组件状态的 hook。
createUseWuStore(React): (namespace?) => StoreHelper
- 参数: hooks namespace;hook 接受状态前缀,空值表示根。
- 返回值: 对象 {state,setState,getState}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import React from 'react';
import { createUseWuStore } from 'wu-framework/adapters/react';
const useWuStore = createUseWuStore(React);
function View() {
const { state, setState } = useWuStore('cart');
return null;
}
参考:src/adapters/react/index.js.
react.createWuSlot
创建按名称和 URL 承载 WU 应用的组件。
createWuSlot(React): WuSlotComponent
- 参数: 框架名称和 hooks;props 包括 name、url、appName、fallback 和回调。
- 返回值: 用于渲染 slot 的组件。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import React from 'react';
import { createWuSlot } from 'wu-framework/adapters/react';
const WuSlot = createWuSlot(React);
const element = React.createElement(WuSlot, { name: 'card', url: '/apps/card' });
参考:src/adapters/react/index.js.
preact.createUseWuEvents
创建与组件生命周期绑定的事件 hook。
createUseWuEvents(hooks): () => EventsHelper
- 参数: 包含所需 hooks 的 hooks namespace。helper 返回 emit、on 和 once。
- 返回值: 返回发布与订阅函数的 hook。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: on 创建的订阅会在卸载时移除;once 可能尚未触发时,也应保存其 disposer。
import * as hooks from 'preact/hooks';
import { createUseWuEvents } from 'wu-framework/adapters/preact';
const useWuEvents = createUseWuEvents(hooks);
function View() {
const events = useWuEvents();
return null;
}
参考:src/adapters/preact/index.js.
preact.createUseWuStore
创建将 store 路径映射到组件状态的 hook。
createUseWuStore(hooks): (namespace?) => StoreHelper
- 参数: hooks namespace;hook 接受状态前缀,空值表示根。
- 返回值: 对象 {state,setState,getState}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import * as hooks from 'preact/hooks';
import { createUseWuStore } from 'wu-framework/adapters/preact';
const useWuStore = createUseWuStore(hooks);
function View() {
const { state, setState } = useWuStore('cart');
return null;
}
参考:src/adapters/preact/index.js.
preact.createWuSlot
创建按名称和 URL 承载 WU 应用的组件。
createWuSlot(h, hooks?): WuSlotComponent
- 参数: Preact 的 h 函数和 useState/useEffect/useRef hooks 对象。没有 hooks 时返回行为较少的基础版本。
- 返回值: 用于渲染 slot 的组件。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { h } from 'preact';
import * as hooks from 'preact/hooks';
import { createWuSlot } from 'wu-framework/adapters/preact';
const WuSlot = createWuSlot(h, hooks);
参考:src/adapters/preact/index.js.
vue.useWuEvents
提供事件工具和显式清理。
useWuEvents(): EventsHelper
- 参数: 无参数。
- 返回值: {emit,on,once,off,cleanup}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 在 onUnmounted 中调用 cleanup,必要时保存 once 的取消函数。
import { useWuEvents } from 'wu-framework/adapters/vue';
import { onUnmounted } from 'vue';
const events = useWuEvents();
events.on('cart:changed', console.log);
onUnmounted(events.cleanup);
参考:src/adapters/vue/index.js.
vue.useWuStore
适配器运行时可用时,将 store 路径映射到 Vue ref。
useWuStore(namespace?): StoreHelper
- 参数: 可选 namespace。
- 返回值: {state,setState,getState,cleanup}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 卸载时调用 cleanup。
import * as Vue from 'vue';
import { useWuStore, wuVuePlugin } from 'wu-framework/adapters/vue';
app.use(wuVuePlugin, { Vue });
const cart = useWuStore('cart');
Vue.onUnmounted(cart.cleanup);
必须配置 Vue runtime;不会将 namespace.* 模式解释为观察任意后代。
参考:src/adapters/vue/index.js.
vue.wuVuePlugin
安装 WuSlot、全局工具,以及适配器使用的 Vue 实例。
app.use(wuVuePlugin, options?): app
- 参数: options.Vue 可传入宿主的 Vue namespace。
- 返回值: Vue app.use 的结果。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 宿主卸载 Vue 应用,并清理组件自身的监听器。
import * as Vue from 'vue';
import { wuVuePlugin } from 'wu-framework/adapters/vue';
const app = Vue.createApp(Root);
app.use(wuVuePlugin, { Vue });
参考:src/adapters/vue/index.js.
vue.WuSlot
暴露挂载 WU 应用的 Vue 组件。
WuSlot: Vue component options
- 参数: Props name、url、appName 和 fallbackText;需要可用的 Vue runtime。
- 返回值: 组件定义对象。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { WuSlot } from 'wu-framework/adapters/vue';
const components = { WuSlot };
WuSlot 在 Vue 生命周期内运行,不是 Next 子路径中的 WuApp。
参考:src/adapters/vue/index.js.
svelte.createWuStore
创建兼容 Svelte subscribe 并连接 WU 的 store。
createWuStore(namespace?): SvelteStore
- 参数: 路径前缀;空值观察根。
- 返回值: {subscribe,set,get,update}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 最后一个 subscriber 取消后移除 WU 订阅;新订阅会重新连接。
import { createWuStore } from 'wu-framework/adapters/svelte';
const cart = createWuStore('cart');
const stop = cart.subscribe(value => console.log(value));
stop();
参考:src/adapters/svelte/index.js.
svelte.createWuEventStore
将最新事件暴露为可订阅 store。
createWuEventStore(eventPattern): EventStore
- 参数: event bus 支持的模式。
- 返回值: {subscribe,emit}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 最后一个 subscriber 取消后断开 WU 监听器。
import { createWuEventStore } from 'wu-framework/adapters/svelte';
const changes = createWuEventStore('cart:changed');
const stop = changes.subscribe(console.log);
stop();
参考:src/adapters/svelte/index.js.
svelte.useWuEvents
为 Svelte 组件提供 emit/on/once/off,需要手动清理。
useWuEvents(): EventsHelper
- 参数: 无参数。
- 返回值: {emit,on,once,off,cleanup}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 在 onDestroy 调用 cleanup;该函数不会代你注册生命周期。
import { onDestroy } from 'svelte';
import { useWuEvents } from 'wu-framework/adapters/svelte';
const events = useWuEvents();
onDestroy(events.cleanup);
参考:src/adapters/svelte/index.js.
svelte.createWuSlotConfig
返回构建 Svelte slot 的模板和配置。
createWuSlotConfig(): SlotConfig
- 参数: 无参数。
- 返回值: {props,template,createInstance}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { createWuSlotConfig } from 'wu-framework/adapters/svelte';
const config = createWuSlotConfig();
console.log(config.props, config.template);
它是包含组件源文本的配置,不是已编译组件,也不是能自行渲染的函数。
参考:src/adapters/svelte/index.js.
solid.createWuStore
把 WU 路径连接到 Solid signal。
createWuStore(namespace?): [accessor, setter]
- 参数: Namespace;必须在运行时可用的 Solid owner 内执行。
- 返回值: 状态 accessor 与 setWuState(path,value) 函数组成的元组。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 将 unsubscribe 注册到 Solid owner 的 onCleanup。
import { createWuStore } from 'wu-framework/adapters/solid';
function View() {
const [cart, setCart] = createWuStore('cart');
setCart('count', 1);
return null;
}
参考:src/adapters/solid/index.js.
solid.createWuEvent
在 signal 中反映最新事件。
createWuEvent(pattern): accessor
- 参数: 总线模式。
- 返回值: 返回事件的 accessor,初始值为 null。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 通过 onCleanup 注册 unsubscribe。
import { createWuEvent } from 'wu-framework/adapters/solid';
function View() {
const latest = createWuEvent('cart:changed');
return null;
}
参考:src/adapters/solid/index.js.
solid.useWuEvents
在 Solid owner 内提供事件工具。
useWuEvents(): EventsHelper
- 参数: 无参数。
- 返回值: {emit,on,once,off}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { useWuEvents } from 'wu-framework/adapters/solid';
function View() { const events = useWuEvents(); return null; }
参考:src/adapters/solid/index.js.
solid.createWuContext
创建用于共享 WU 实例的 Solid context。
createWuContext(): { WuProvider, useWu, WuContext }
- 参数: 无参数;需要可用的 Solid runtime。
- 返回值: Provider、hook 和 context。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: context 不打开传输通道或持久资源。
import { createWuContext } from 'wu-framework/adapters/solid';
const { WuProvider, useWu } = createWuContext();
参考:src/adapters/solid/index.js.
solid.createWuSlot
创建 Solid slot 组件。
createWuSlot(): WuSlotComponent
- 参数: 无参数;组件接收 name、url、appName、fallback 和回调。
- 返回值: 组件函数。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { createWuSlot } from 'wu-framework/adapters/solid';
const WuSlot = createWuSlot();
参考:src/adapters/solid/index.js.
angular.createWuService
为 Angular service 提供事件与状态函数。
createWuService(): WuService
- 参数: 无参数。
- 返回值: emit,on,once,off,getState,setState,onStateChange,destroy 和 getter wu。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 在 ngOnDestroy 调用 destroy;once 订阅尚未触发时应取消。
import { createWuService } from 'wu-framework/adapters/angular';
const service = createWuService();
service.on('cart:changed', console.log);
service.destroy();
getState 将 falsy 值转换为 null。在应用内要保留 false、0 或空字符串,请在 DI 上下文中使用 inject(WuAppScope).wu.store.get(path)。service.wu 返回 host,不应通过它绕过 grants。
参考:src/adapters/angular/index.js.
angular.createWuSlotComponent
返回实现 Angular slot 所需的元数据和基础方法。
createWuSlotComponent(): ComponentConfig
- 参数: 无参数。
- 返回值: 包含 selector、template、styles 和 methods 的对象。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { createWuSlotComponent } from 'wu-framework/adapters/angular';
const config = createWuSlotComponent();
console.log(config.selector, config.methods);
不会返回已由 @Component 装饰的类。需要把元数据、ViewChild 和方法集成到 Angular 类。
参考:src/adapters/angular/index.js.
angular.getWuSlotModuleConfig
描述承载 Angular slot 的模块名称。
getWuSlotModuleConfig(): object
- 参数: 无参数。
- 返回值: 包含字符串名称的 {imports,declarations,exports}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { getWuSlotModuleConfig } from 'wu-framework/adapters/angular';
console.log(getWuSlotModuleConfig());
这些是描述性名称,不是可直接传给 @NgModule 的类引用。
参考:src/adapters/angular/index.js.
lit.createWuSlotElement
创建承载 WU slot 的 Lit 类。
createWuSlotElement(LitElement, html, css?): ElementClass
- 参数: 来自宿主同一 Lit 实例的基础 API。
- 返回值: 待注册的自定义元素类。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { LitElement, html, css } from 'lit';
import { createWuSlotElement } from 'wu-framework/adapters/lit';
customElements.define('demo-wu-slot', createWuSlotElement(LitElement, html, css));
core 使用文档选择器挂载;放入另一 shadow root 前,请确认 slot 的 DOM 策略与版本。
参考:src/adapters/lit/index.js.
lit.WuMixin
向元素类添加 wuEmit/wuOn/wuOnce 和 store 访问。
WuMixin(Base): subclass
- 参数: 基类 HTMLElement 或 LitElement。
- 返回值: 包含 WU 方法、在 disconnectedCallback 清理的子类。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 覆盖 disconnectedCallback 时调用 super.disconnectedCallback,以执行 mixin 清理。
import { LitElement } from 'lit';
import { WuMixin } from 'wu-framework/adapters/lit';
class Card extends WuMixin(LitElement) {
connectedCallback() { super.connectedCallback(); this.wuOn('cart:changed', console.log); }
}
参考:src/adapters/lit/index.js.
lit.wuProperty
把元素属性连接到 store 路径。
wuProperty(storePath): legacy property decorator
- 参数: 字符串路径;应用到 prototype 和属性名的 legacy 装饰器。
- 返回值: 安装 getter/setter 及连接 hooks 的装饰器函数。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { wuProperty } from 'wu-framework/adapters/lit';
wuProperty('cart.count')(Card.prototype, 'count');
不是通用 Stage 3 装饰器。setter 写入 WU,订阅同步本地值。
参考:src/adapters/lit/index.js.
lit.createSimpleElement
使用模板、样式和回调构建自定义元素。
createSimpleElement(config): ElementClass
- 参数: 可选 name、字符串或函数 template、styles,以及默认 true 的 shadow。
- 返回值: HTMLElement 类;name 可触发自定义元素注册。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { createSimpleElement } from 'wu-framework/adapters/lit';
const Card = createSimpleElement({ template: () => '<p>Hola</p>', styles: ':host{display:block}' });
customElements.define('simple-card', Card);
Template 作为 HTML 插入,不经过净化;必须控制其内容。
参考:src/adapters/lit/index.js.
vanilla.registerClass
在自身容器内挂载应用类。
registerClass(appName, AppClass, options?): Promise<boolean>
- 参数: constructorArgs、回调和 standalone。
- 返回值: 注册结果 Boolean。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { registerClass } from 'wu-framework/adapters/vanilla';
class Card { constructor(container) { this.container = container; } render() { this.container.textContent = 'Hola'; } destroy() {} }
await registerClass('card', Card, { standalone: false });
参考:src/adapters/vanilla/index.js.
vanilla.registerTemplate
注册包含数据及可选样式和脚本的 HTML 模板。
registerTemplate(appName, template, options?): Promise<boolean>
- 参数: template 字符串;data、scripts、styles、回调和 standalone。
- 返回值: 注册结果 Boolean。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { registerTemplate } from 'wu-framework/adapters/vanilla';
await registerTemplate('card', '<h2>Resumen</h2>', { styles: ['h2{margin:0}'], standalone: false });
脚本作为宿主代码执行,HTML 不经过净化。不要用不可信内容作模板。
参考:src/adapters/vanilla/index.js.
vanilla.createComponent
创建具有本地状态和模板渲染的组件。
createComponent(config): VanillaComponent
- 参数: state、template(state)、actions、onInit 和 onDestroy。
- 返回值: {state,init,render,destroy,setState,getState}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 所属组件卸载时释放订阅。
import { createComponent, register } from 'wu-framework/adapters/vanilla';
const component = createComponent({ state: { count: 1 }, template: state => `<b>${Number(state.count)}</b>` });
await register('card', component, { standalone: false });
setState 合并本地状态并重新渲染 HTML,不替代 wu.store。
参考:src/adapters/vanilla/index.js.
vanilla.useWuEvents
组合事件发布与订阅,不依赖 UI 框架。
useWuEvents(scope?): EventsHelper
- 参数: 无参数。
- 返回值: {emit,on,once,off,cleanup}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 卸载时调用 cleanup;once 尚未触发时保留其取消函数。
import { useWuEvents } from 'wu-framework/adapters/vanilla';
const events = useWuEvents();
events.on('cart:changed', console.log);
events.cleanup();
参考:src/adapters/vanilla/index.js.
vanilla.useWuStore
为 store 读取、写入和监听路径添加前缀。
useWuStore(namespace?, scope?): StoreHelper
- 参数: 可选 namespace。
- 返回值: {get,set,onChange}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 每次 onChange 返回独立 unsubscribe,helper 不会汇总保存。
import { useWuStore } from 'wu-framework/adapters/vanilla';
const cart = useWuStore('cart');
cart.set('count', 1);
const stop = cart.onChange('count', console.log);
stop();
参考:src/adapters/vanilla/index.js.
vanilla.createWuSlot
插入容器并请求在其中挂载 WU 应用。
createWuSlot(target, props): SlotHandle
- 参数: target 元素;props name,url,fallbackText,onLoad,onError。
- 返回值: {container,destroy}。
- 错误: 需要框架运行时和可访问的 WU 实例;执行操作前检查可用性。
- **权限:**事件/store hooks 使用所属应用的 facade;注册和 slots 使用 host。在 manifest 中申请资源,并由 shell 授权。
- 清理: 移除宿主时调用 destroy。
import { createWuSlot } from 'wu-framework/adapters/vanilla';
const slot = createWuSlot(document.querySelector('#host'), { name: 'card', url: '/apps/card' });
slot.destroy();
内部挂载为异步操作;handle 不是表示应用已挂载的 Promise。
参考:src/adapters/vanilla/index.js.
react.createUseWuAI
把 React 界面连接到 AI 对话。
createUseWuAI(React): helper
- 参数: factory 要求的 runtime;helper 接受可选 namespace,默认 default。
- 返回值: useWuAI(options) hook,包含 messages,isStreaming,error,send,sendSync,abort,clear。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { createUseWuAI } from 'wu-framework/adapters/react';
import React from 'react';
const useWuAI = createUseWuAI(React);
在组件外只创建一次 hook,在 render 内使用。send 使用流式输出,sendSync 请求完整响应。
参考:src/adapters/react/index.js.
preact.createUseWuAI
把 Preact 界面连接到 AI 对话。
createUseWuAI(hooks): helper
- 参数: factory 要求的 runtime;helper 接受可选 namespace,默认 default。
- 返回值: useWuAI(options) hook,包含消息状态及 send/clear 函数。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { createUseWuAI } from 'wu-framework/adapters/preact';
import * as hooks from 'preact/hooks';
const useWuAI = createUseWuAI(hooks);
使用与渲染组件相同 Preact 实例的 hooks。
参考:src/adapters/preact/ai.js.
vue.createUseWuAI
把 Vue 界面连接到 AI 对话。
createUseWuAI(Vue): helper
- 参数: factory 要求的 runtime;helper 接受可选 namespace,默认 default。
- 返回值: composable,包含 messages,isStreaming,error refs 和 send/clear。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { createUseWuAI } from 'wu-framework/adapters/vue';
import * as Vue from 'vue';
const useWuAI = createUseWuAI(Vue);
const chat = useWuAI({ namespace: 'help' });
此变体使用 Vue refs。
参考:src/adapters/vue/ai.js.
vue.useWuAI
把 Vue 界面连接到 AI 对话。
useWuAI(options?): helper
- 参数: factory 要求的 runtime;helper 接受可选 namespace,默认 default。
- 返回值: 简单 helper,包含 messages,isStreaming,error,send,clear。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { useWuAI } from 'wu-framework/adapters/vue';
const chat = useWuAI({ namespace: 'help' });
此变体不创建 refs。初始复制的属性不构成内部状态的完整响应式视图;组件中优先使用 createUseWuAI(Vue)。
参考:src/adapters/vue/ai.js.
svelte.createWuAIStore
把 Svelte 界面连接到 AI 对话。
createWuAIStore(options?): helper
- 参数: factory 要求的 runtime;helper 接受可选 namespace,默认 default。
- 返回值: Store {subscribe,send,clear},其值包含 messages,isStreaming,error。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { createWuAIStore } from 'wu-framework/adapters/svelte';
const chat = createWuAIStore({ namespace: 'help' });
const stop = chat.subscribe(console.log);
stop();
取消 subscribe 只移除本地观察者,不自动取消 provider 对话。
参考:src/adapters/svelte/ai.js.
angular.createWuAIService
把 Angular 界面连接到 AI 对话。
createWuAIService(options?): helper
- 参数: factory 要求的 runtime;helper 接受可选 namespace,默认 default。
- 返回值: service,包含 messages,isStreaming,error getters 和 send/clear 方法。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { createWuAIService } from 'wu-framework/adapters/angular';
const chat = createWuAIService({ namespace: 'help' });
不是已装饰的 Injectable 类,也不是 RxJS Observable。需要将变更接入宿主的检测机制。
参考:src/adapters/angular/ai.js.
solid.createUseWuAI
把 Solid 界面连接到 AI 对话。
createUseWuAI(): helper
- 参数: factory 要求的 runtime;helper 接受可选 namespace,默认 default。
- 返回值: helper factory,包含 messages,isStreaming,error accessors 和 send/clear。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { createUseWuAI } from 'wu-framework/adapters/solid';
const useWuAI = createUseWuAI();
const chat = useWuAI({ namespace: 'help' });
accessor 读取普通对象,实现不会创建 Solid signals。不要假定会自动触发响应式失效。
参考:src/adapters/solid/ai.js.
vanilla.useWuAI
把原生 JavaScript 界面连接到 AI 对话。
useWuAI(options?): helper
- 参数: factory 要求的 runtime;helper 接受可选 namespace,默认 default。
- 返回值: {send,clear,getMessages,getError,isStreaming}。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { useWuAI } from 'wu-framework/adapters/vanilla';
const chat = useWuAI({ namespace: 'help' });
console.log(chat.getMessages());
clear 清空本地历史和关联对话;await send 后更新界面。
参考:src/adapters/vanilla/ai.js.
lit.WuAIMixin
把 Lit 界面连接到 AI 对话。
WuAIMixin(Base): helper
- 参数: 元素基类。
- 返回值: 子类,包含 wuAI,wuAISend(text,options),wuAISetNamespace(ns)。
- 错误: 检查 WU AI 可用性;helper 维护 error 字段,不可用时也可能返回 null。
- 权限: 使用全局运行时的 ai.send;provider 请求的 actions 仍遵循宿主配置的 AI 策略。
- 清理: 不销毁全局 AI 协调器。需要取消待处理请求时,应显式 abort 组件 namespace。
import { WuAIMixin } from 'wu-framework/adapters/lit';
class Card extends WuAIMixin(HTMLElement) {
connectedCallback() { this.wuAISetNamespace('card'); }
}
不维护响应式消息,也不会自动添加 AbortController。
参考:src/adapters/lit/ai.js.
qwik.adoptQwikStyles
将 Qwik 样式复制到对应 root 的 adoptedStyleSheets。
adoptQwikStyles(container): () => void
- 参数: 含样式的 Container;需要 CSSStyleSheet.replaceSync 和 adoptedStyleSheets。
- 返回值: 清理样式表和观察者的函数。
- 错误: 不支持 constructable stylesheets 时返回空 cleanup。
- 权限: 操作所提供容器的样式。
- 清理: 销毁容器前调用返回的函数。
import { adoptQwikStyles } from 'wu-framework/adapters/qwik';
const release = adoptQwikStyles(container);
release();
参考:src/adapters/qwik/index.js.
qwik.ensureQwikLoader
加载并去重初始化文档的 Qwik loader。
ensureQwikLoader(load?): Promise<boolean>
- **参数:**可选
load函数;默认导入@builder.io/qwik/qwikloader.js。Qwik 注册会传入与其 runtime 匹配的 loader。 - 返回值: 首次加载为 true,已经初始化为 false。
- 错误: loader 模块无法导入时拒绝。失败 Promise 的恢复行为取决于版本。
- 权限: loader 是宿主全局代码。
- 清理: 没有撤销 loader 执行的公开 API。
import { ensureQwikLoader } from 'wu-framework/adapters/qwik';
await ensureQwikLoader();
参考:src/adapters/qwik/index.js.
shared.snapshot
创建浅副本,帮助响应式绑定检测变化。
snapshot(value): unknown
- 参数: Array、对象或原始值。
- 返回值: 新 Array、对象浅副本或原始值本身。
- 错误: 复制对象时传播 getter 或属性错误。
- 权限: 本身不访问 store。
- 清理: 无持久资源。
import { snapshot } from 'wu-framework/adapters/shared';
const next = snapshot(wu.store.get('cart'));
不是深克隆,也不验证数据。
参考:src/adapters/shared.js.
将 hooks 和 stores 迁移到 4.0
未经授权的 emit 返回 false。无权限订阅会抛出 WU_EVENT_SUBSCRIBE_DENIED;无权限读取、观察或写入 store 会抛出 WU_CAPABILITY_DENIED。卸载会释放 facade listeners。之后事件 helpers 会警告并停止操作,store 调用会抛出 WU_APP_SCOPE_REVOKED。
// App manifest: wu.permissions. Shell registration: grants.
const permissions = ['store.read:cart.count', 'store.write:cart.count', 'events.emit:cart:changed'];
await wu.init({ apps: [{
name: 'cart', url: '/apps/cart/',
manifest: { entry: 'assets/cart.js', wu: { permissions } },
grants: permissions,
}] });
React/Preact/Vue 和 Solid setters 用值或 updater 写入所观察的路径:setState(value) 和 setState(prev => next)。setState(path, value) 形式写入子路径。没有 namespace 时使用两个参数。在 Svelte 中,set(value) 替换所观察值,update(fn) 按 store 契约应用 updater。
const useWuStore = createUseWuStore(React);
function Counter() {
const { state, setState } = useWuStore('cart.count');
return <button onClick={() => setState(value => (value ?? 0) + 1)}>{state ?? 0}</button>;
}
在组件上下文之外使用 helpers 时,请保留 facade:Vanilla 接受 useWuEvents(scope) 和 useWuStore(namespace, scope)。Lit、Alpine、htmx、Stimulus、Stencil 和 Qwik 中的 resolveWu(element) 通过 DOM 查找 facade;已移除节点保留其已撤销的 scope。Angular 通过 DI 提供 WuAppScope。名为 wuInstance 的兼容 props 和 injections,以及 AI helpers,仍暴露 host。
Slots 将容器元素传给 WU,因此可在 Shadow DOM 内工作,并支持 cart.v2 等名称。Angular 支持 zoneless 挂载,仅在已加载 Zone.js 时启用 Zone.js 检测。htmx 2 和 4 共用 htmx.process(),但 setup 代码必须使用对应版本的事件。baseUrl 支持 hx-action、hx-query 和 data-hx- 变体,并保留 // URL。
Qwik 不提供 standalone 挂载:若 3 秒内未出现 WU 或无法导入 Qwik,register 返回 false。它不注册 update slot。针对 Shadow DOM 的文档 listeners 适配在卸载后仍保持有效。
shared.resolveWu
resolveWu(target?): WuAppFacade | WuCore | null
接受 DOM 节点、{ wu } 上下文或 facade。解析目标 scope 或当前同步生命周期;仅在两者之外退回全局 host。如果后续会在 render 上下文之外工作,请在 await 之前保留它。它由 wu-framework/adapters/shared 及 Lit、Vanilla、Alpine、htmx、Stimulus、Stencil、Qwik adapters 导出。