WU / 文档通用微前端
中文

适配器与绑定参考

十三种技术的注册、自定义适配器、插槽、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 导出。

一起完善 WU

发现了问题?有新的想法?

你的使用体验能让 WU 变得更好。告诉我们遇到的问题,或支持项目的持续开发。