# 适配器与绑定参考

十三种技术的注册、自定义适配器、插槽、hooks、响应式 store 和 AI 辅助工具。

版本、变更与要求见 [Framework 3.2 与 CLI 1.0](/zh-cn/docs/guides/releases/)。


<span id="un-contrato-común-con-capacidades-por-framework"></span>

<span class="section-anchor" id="section-1"></span>

## 共同契约与各框架能力

每个 `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`。参阅[集成](/zh-cn/docs/framework/integrations/)和[组合权限](/zh-cn/docs/framework/api-core/)。

<span class="section-anchor" id="section-2"></span>

## loadAdapter

按名称加载并缓存适配器模块。

`loadAdapter(name): Promise<AdapterModule>`

- **参数：** ADAPTER_NAMES 中的一个名称，使用小写。
- **返回：**adapter 对象（`wuReact`、`wuVue` 或等价对象）；共享进行中加载的 promise。
- **错误：** 未知名称或导入失败会拒绝。加载失败会释放 Promise，允许重试。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 导入的模块保留在进程缓存中。

```js
import { loadAdapter } from 'wu-framework/adapters';
const { register } = await loadAdapter('react');
```

参考：`src/adapters/index.js`.

<span class="section-anchor" id="section-3"></span>

## ADAPTER_NAMES

列出可从 barrel 加载的适配器。

`ADAPTER_NAMES: readonly string[]`

- **参数：** 冻结常量。
- **返回值：** 名称列表。
- **错误：** 读取无副作用。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 无需清理。

```js
import { ADAPTER_NAMES } from 'wu-framework/adapters';
console.log(ADAPTER_NAMES);
```

参考：`src/adapters/index.js`.

<span class="section-anchor" id="section-4"></span>

## getWuInstance

在当前窗口以及可访问的 parent、top 中查找 WU。

`getWuInstance(): WuCore | null`

- **参数：** 由 shared 和各适配器导出。
- **返回值：** 找到的实例或 null。
- **错误：** 捕获跨 origin 访问 parent/top 的错误，不因此抛出。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 不创建订阅。

```js
import { getWuInstance } from 'wu-framework/adapters/shared';
const wu = getWuInstance();
```

参考：`src/adapters/shared.js`.

<span class="section-anchor" id="section-5"></span>

## waitForWu

通过 ready 事件和轮询等待全局实例。

`waitForWu(timeout?): Promise<WuCore | null>`

- **参数：** 毫秒时间，默认 5000。
- **返回值：** 找到的实例；没有实例的外部 ready 事件可能解析为 null。
- **错误：** 超时后拒绝；需要 window。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** helper 在成功或拒绝时移除监听器和定时器。

```js
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`.

<span class="section-anchor" id="section-6"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-7"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-8"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-9"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
import { register } from 'wu-framework/adapters/angular';
await register('card', AppModule, { rootSelector: 'card-root', standalone: false });
```

standalone 组件使用 registerStandalone。此注册负责创建和销毁 Angular 平台与模块。

参考：`src/adapters/angular/index.js`.

<span class="section-anchor" id="section-10"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-11"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-12"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-13"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-14"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-15"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-16"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-17"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-18"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-19"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-20"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-21"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
import { registerElement } from 'wu-framework/adapters/angular';
await registerElement('card', Card, { elementTag: 'angular-card', standalone: false });
```

需要 @angular/elements。移除元素不会撤销其全局构造函数注册。

参考：`src/adapters/angular/index.js`.

<span class="section-anchor" id="section-22"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-23"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
import { registerCompat } from 'wu-framework/adapters/preact';
await registerCompat('card', Card, { standalone: false });
```

compat 路径注册 mount/unmount，不等同于普通 register 的 update 通道。

参考：`src/adapters/preact/index.js`.

<span class="section-anchor" id="section-24"></span>

## 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) 卸载以执行框架清理；保存并取消自己的订阅。

```js
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`.

<span class="section-anchor" id="section-25"></span>

## 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。

```js
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`.

<span class="section-anchor" id="section-26"></span>

## react.createUseWuStore

创建将 store 路径映射到组件状态的 hook。

`createUseWuStore(React): (namespace?) => StoreHelper`

- **参数：** hooks namespace；hook 接受状态前缀，空值表示根。
- **返回值：** 对象 {state,setState,getState}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-27"></span>

## react.createWuSlot

创建按名称和 URL 承载 WU 应用的组件。

`createWuSlot(React): WuSlotComponent`

- **参数：** 框架名称和 hooks；props 包括 name、url、appName、fallback 和回调。
- **返回值：** 用于渲染 slot 的组件。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-28"></span>

## 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。

```js
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`.

<span class="section-anchor" id="section-29"></span>

## preact.createUseWuStore

创建将 store 路径映射到组件状态的 hook。

`createUseWuStore(hooks): (namespace?) => StoreHelper`

- **参数：** hooks namespace；hook 接受状态前缀，空值表示根。
- **返回值：** 对象 {state,setState,getState}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-30"></span>

## preact.createWuSlot

创建按名称和 URL 承载 WU 应用的组件。

`createWuSlot(h, hooks?): WuSlotComponent`

- **参数：** Preact 的 h 函数和 useState/useEffect/useRef hooks 对象。没有 hooks 时返回行为较少的基础版本。
- **返回值：** 用于渲染 slot 的组件。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-31"></span>

## vue.useWuEvents

提供事件工具和显式清理。

`useWuEvents(): EventsHelper`

- **参数：** 无参数。
- **返回值：** {emit,on,once,off,cleanup}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 在 onUnmounted 中调用 cleanup，必要时保存 once 的取消函数。

```js
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`.

<span class="section-anchor" id="section-32"></span>

## vue.useWuStore

适配器运行时可用时，将 store 路径映射到 Vue ref。

`useWuStore(namespace?): StoreHelper`

- **参数：** 可选 namespace。
- **返回值：** {state,setState,getState,cleanup}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 卸载时调用 cleanup。

```js
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`.

<span class="section-anchor" id="section-33"></span>

## 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 应用，并清理组件自身的监听器。

```js
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`.

<span class="section-anchor" id="section-34"></span>

## vue.WuSlot

暴露挂载 WU 应用的 Vue 组件。

`WuSlot: Vue component options`

- **参数：** Props name、url、appName 和 fallbackText；需要可用的 Vue runtime。
- **返回值：** 组件定义对象。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
import { WuSlot } from 'wu-framework/adapters/vue';
const components = { WuSlot };
```

WuSlot 在 Vue 生命周期内运行，不是 Next 子路径中的 WuApp。

参考：`src/adapters/vue/index.js`.

<span class="section-anchor" id="section-35"></span>

## svelte.createWuStore

创建兼容 Svelte subscribe 并连接 WU 的 store。

`createWuStore(namespace?): SvelteStore`

- **参数：** 路径前缀；空值观察根。
- **返回值：** {subscribe,set,get,update}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 最后一个 subscriber 取消后移除 WU 订阅；新订阅会重新连接。

```js
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`.

<span class="section-anchor" id="section-36"></span>

## svelte.createWuEventStore

将最新事件暴露为可订阅 store。

`createWuEventStore(eventPattern): EventStore`

- **参数：** event bus 支持的模式。
- **返回值：** {subscribe,emit}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 最后一个 subscriber 取消后断开 WU 监听器。

```js
import { createWuEventStore } from 'wu-framework/adapters/svelte';
const changes = createWuEventStore('cart:changed');
const stop = changes.subscribe(console.log);
stop();
```

参考：`src/adapters/svelte/index.js`.

<span class="section-anchor" id="section-37"></span>

## svelte.useWuEvents

为 Svelte 组件提供 emit/on/once/off，需要手动清理。

`useWuEvents(): EventsHelper`

- **参数：** 无参数。
- **返回值：** {emit,on,once,off,cleanup}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 在 onDestroy 调用 cleanup；该函数不会代你注册生命周期。

```js
import { onDestroy } from 'svelte';
import { useWuEvents } from 'wu-framework/adapters/svelte';
const events = useWuEvents();
onDestroy(events.cleanup);
```

参考：`src/adapters/svelte/index.js`.

<span class="section-anchor" id="section-38"></span>

## svelte.createWuSlotConfig

返回构建 Svelte slot 的模板和配置。

`createWuSlotConfig(): SlotConfig`

- **参数：** 无参数。
- **返回值：** {props,template,createInstance}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
import { createWuSlotConfig } from 'wu-framework/adapters/svelte';
const config = createWuSlotConfig();
console.log(config.props, config.template);
```

它是包含组件源文本的配置，不是已编译组件，也不是能自行渲染的函数。

参考：`src/adapters/svelte/index.js`.

<span class="section-anchor" id="section-39"></span>

## 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。

```js
import { createWuStore } from 'wu-framework/adapters/solid';
function View() {
  const [cart, setCart] = createWuStore('cart');
  setCart('count', 1);
  return null;
}
```

参考：`src/adapters/solid/index.js`.

<span class="section-anchor" id="section-40"></span>

## solid.createWuEvent

在 signal 中反映最新事件。

`createWuEvent(pattern): accessor`

- **参数：** 总线模式。
- **返回值：** 返回事件的 accessor，初始值为 null。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 通过 onCleanup 注册 unsubscribe。

```js
import { createWuEvent } from 'wu-framework/adapters/solid';
function View() {
  const latest = createWuEvent('cart:changed');
  return null;
}
```

参考：`src/adapters/solid/index.js`.

<span class="section-anchor" id="section-41"></span>

## solid.useWuEvents

在 Solid owner 内提供事件工具。

`useWuEvents(): EventsHelper`

- **参数：** 无参数。
- **返回值：** {emit,on,once,off}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
import { useWuEvents } from 'wu-framework/adapters/solid';
function View() { const events = useWuEvents(); return null; }
```

参考：`src/adapters/solid/index.js`.

<span class="section-anchor" id="section-42"></span>

## solid.createWuContext

创建用于共享 WU 实例的 Solid context。

`createWuContext(): { WuProvider, useWu, WuContext }`

- **参数：** 无参数；需要可用的 Solid runtime。
- **返回值：** Provider、hook 和 context。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** context 不打开传输通道或持久资源。

```js
import { createWuContext } from 'wu-framework/adapters/solid';
const { WuProvider, useWu } = createWuContext();
```

参考：`src/adapters/solid/index.js`.

<span class="section-anchor" id="section-43"></span>

## solid.createWuSlot

创建 Solid slot 组件。

`createWuSlot(): WuSlotComponent`

- **参数：** 无参数；组件接收 name、url、appName、fallback 和回调。
- **返回值：** 组件函数。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
import { createWuSlot } from 'wu-framework/adapters/solid';
const WuSlot = createWuSlot();
```

参考：`src/adapters/solid/index.js`.

<span class="section-anchor" id="section-44"></span>

## 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 订阅尚未触发时应取消。

```js
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`.

<span class="section-anchor" id="section-45"></span>

## angular.createWuSlotComponent

返回实现 Angular slot 所需的元数据和基础方法。

`createWuSlotComponent(): ComponentConfig`

- **参数：** 无参数。
- **返回值：** 包含 selector、template、styles 和 methods 的对象。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
import { createWuSlotComponent } from 'wu-framework/adapters/angular';
const config = createWuSlotComponent();
console.log(config.selector, config.methods);
```

不会返回已由 @Component 装饰的类。需要把元数据、ViewChild 和方法集成到 Angular 类。

参考：`src/adapters/angular/index.js`.

<span class="section-anchor" id="section-46"></span>

## angular.getWuSlotModuleConfig

描述承载 Angular slot 的模块名称。

`getWuSlotModuleConfig(): object`

- **参数：** 无参数。
- **返回值：** 包含字符串名称的 {imports,declarations,exports}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
import { getWuSlotModuleConfig } from 'wu-framework/adapters/angular';
console.log(getWuSlotModuleConfig());
```

这些是描述性名称，不是可直接传给 @NgModule 的类引用。

参考：`src/adapters/angular/index.js`.

<span class="section-anchor" id="section-47"></span>

## lit.createWuSlotElement

创建承载 WU slot 的 Lit 类。

`createWuSlotElement(LitElement, html, css?): ElementClass`

- **参数：** 来自宿主同一 Lit 实例的基础 API。
- **返回值：** 待注册的自定义元素类。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-48"></span>

## 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 清理。

```js
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`.

<span class="section-anchor" id="section-49"></span>

## lit.wuProperty

把元素属性连接到 store 路径。

`wuProperty(storePath): legacy property decorator`

- **参数：** 字符串路径；应用到 prototype 和属性名的 legacy 装饰器。
- **返回值：** 安装 getter/setter 及连接 hooks 的装饰器函数。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
import { wuProperty } from 'wu-framework/adapters/lit';
wuProperty('cart.count')(Card.prototype, 'count');
```

不是通用 Stage 3 装饰器。setter 写入 WU，订阅同步本地值。

参考：`src/adapters/lit/index.js`.

<span class="section-anchor" id="section-50"></span>

## lit.createSimpleElement

使用模板、样式和回调构建自定义元素。

`createSimpleElement(config): ElementClass`

- **参数：** 可选 name、字符串或函数 template、styles，以及默认 true 的 shadow。
- **返回值：** HTMLElement 类；name 可触发自定义元素注册。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-51"></span>

## vanilla.registerClass

在自身容器内挂载应用类。

`registerClass(appName, AppClass, options?): Promise<boolean>`

- **参数：** constructorArgs、回调和 standalone。
- **返回值：** 注册结果 Boolean。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-52"></span>

## vanilla.registerTemplate

注册包含数据及可选样式和脚本的 HTML 模板。

`registerTemplate(appName, template, options?): Promise<boolean>`

- **参数：** template 字符串；data、scripts、styles、回调和 standalone。
- **返回值：** 注册结果 Boolean。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-53"></span>

## 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 授权。
- **清理：** 所属组件卸载时释放订阅。

```js
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`.

<span class="section-anchor" id="section-54"></span>

## vanilla.useWuEvents

组合事件发布与订阅，不依赖 UI 框架。

`useWuEvents(scope?): EventsHelper`

- **参数：** 无参数。
- **返回值：** {emit,on,once,off,cleanup}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 卸载时调用 cleanup；once 尚未触发时保留其取消函数。

```js
import { useWuEvents } from 'wu-framework/adapters/vanilla';
const events = useWuEvents();
events.on('cart:changed', console.log);
events.cleanup();
```

参考：`src/adapters/vanilla/index.js`.

<span class="section-anchor" id="section-55"></span>

## vanilla.useWuStore

为 store 读取、写入和监听路径添加前缀。

`useWuStore(namespace?, scope?): StoreHelper`

- **参数：** 可选 namespace。
- **返回值：** {get,set,onChange}。
- **错误：** 需要框架运行时和可访问的 WU 实例；执行操作前检查可用性。
- **权限：**事件/store hooks 使用所属应用的 facade；注册和 slots 使用 host。在 manifest 中申请资源，并由 shell 授权。
- **清理：** 每次 onChange 返回独立 unsubscribe，helper 不会汇总保存。

```js
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`.

<span class="section-anchor" id="section-56"></span>

## 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。

```js
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`.

<span class="section-anchor" id="section-57"></span>

## 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。

```js
import { createUseWuAI } from 'wu-framework/adapters/react';
import React from 'react';
const useWuAI = createUseWuAI(React);
```

在组件外只创建一次 hook，在 render 内使用。send 使用流式输出，sendSync 请求完整响应。

参考：`src/adapters/react/index.js`.

<span class="section-anchor" id="section-58"></span>

## 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。

```js
import { createUseWuAI } from 'wu-framework/adapters/preact';
import * as hooks from 'preact/hooks';
const useWuAI = createUseWuAI(hooks);
```

使用与渲染组件相同 Preact 实例的 hooks。

参考：`src/adapters/preact/ai.js`.

<span class="section-anchor" id="section-59"></span>

## 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。

```js
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`.

<span class="section-anchor" id="section-60"></span>

## 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。

```js
import { useWuAI } from 'wu-framework/adapters/vue';
const chat = useWuAI({ namespace: 'help' });
```

此变体不创建 refs。初始复制的属性不构成内部状态的完整响应式视图；组件中优先使用 createUseWuAI(Vue)。

参考：`src/adapters/vue/ai.js`.

<span class="section-anchor" id="section-61"></span>

## 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。

```js
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`.

<span class="section-anchor" id="section-62"></span>

## 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。

```js
import { createWuAIService } from 'wu-framework/adapters/angular';
const chat = createWuAIService({ namespace: 'help' });
```

不是已装饰的 Injectable 类，也不是 RxJS Observable。需要将变更接入宿主的检测机制。

参考：`src/adapters/angular/ai.js`.

<span class="section-anchor" id="section-63"></span>

## 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。

```js
import { createUseWuAI } from 'wu-framework/adapters/solid';
const useWuAI = createUseWuAI();
const chat = useWuAI({ namespace: 'help' });
```

accessor 读取普通对象，实现不会创建 Solid signals。不要假定会自动触发响应式失效。

参考：`src/adapters/solid/ai.js`.

<span class="section-anchor" id="section-64"></span>

## 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。

```js
import { useWuAI } from 'wu-framework/adapters/vanilla';
const chat = useWuAI({ namespace: 'help' });
console.log(chat.getMessages());
```

clear 清空本地历史和关联对话；await send 后更新界面。

参考：`src/adapters/vanilla/ai.js`.

<span class="section-anchor" id="section-65"></span>

## 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。

```js
import { WuAIMixin } from 'wu-framework/adapters/lit';
class Card extends WuAIMixin(HTMLElement) {
  connectedCallback() { this.wuAISetNamespace('card'); }
}
```

不维护响应式消息，也不会自动添加 AbortController。

参考：`src/adapters/lit/ai.js`.

<span class="section-anchor" id="section-66"></span>

## qwik.adoptQwikStyles

将 Qwik 样式复制到对应 root 的 adoptedStyleSheets。

`adoptQwikStyles(container): () => void`

- **参数：** 含样式的 Container；需要 CSSStyleSheet.replaceSync 和 adoptedStyleSheets。
- **返回值：** 清理样式表和观察者的函数。
- **错误：** 不支持 constructable stylesheets 时返回空 cleanup。
- **权限：** 操作所提供容器的样式。
- **清理：** 销毁容器前调用返回的函数。

```js
import { adoptQwikStyles } from 'wu-framework/adapters/qwik';
const release = adoptQwikStyles(container);
release();
```

参考：`src/adapters/qwik/index.js`.

<span class="section-anchor" id="section-67"></span>

## qwik.ensureQwikLoader

加载并去重初始化文档的 Qwik loader。

`ensureQwikLoader(load?): Promise<boolean>`

- **参数：**可选 `load` 函数；默认导入 `@builder.io/qwik/qwikloader.js`。Qwik 注册会传入与其 runtime 匹配的 loader。
- **返回值：** 首次加载为 true，已经初始化为 false。
- **错误：** loader 模块无法导入时拒绝。失败 Promise 的恢复行为取决于版本。
- **权限：** loader 是宿主全局代码。
- **清理：** 没有撤销 loader 执行的公开 API。

```js
import { ensureQwikLoader } from 'wu-framework/adapters/qwik';
await ensureQwikLoader();
```

参考：`src/adapters/qwik/index.js`.

<span class="section-anchor" id="section-68"></span>

## shared.snapshot

创建浅副本，帮助响应式绑定检测变化。

`snapshot(value): unknown`

- **参数：** Array、对象或原始值。
- **返回值：** 新 Array、对象浅副本或原始值本身。
- **错误：** 复制对象时传播 getter 或属性错误。
- **权限：** 本身不访问 store。
- **清理：** 无持久资源。

```js
import { snapshot } from 'wu-framework/adapters/shared';
const next = snapshot(wu.store.get('cart'));
```

不是深克隆，也不验证数据。

参考：`src/adapters/shared.js`.

<span id="migrar-hooks-y-stores-a-40"></span>

<span class="section-anchor" id="section-69"></span>

## 将 hooks 和 stores 迁移到 4.0

未经授权的 emit 返回 `false`。无权限订阅会抛出 `WU_EVENT_SUBSCRIBE_DENIED`；无权限读取、观察或写入 store 会抛出 `WU_CAPABILITY_DENIED`。卸载会释放 facade listeners。之后事件 helpers 会警告并停止操作，store 调用会抛出 `WU_APP_SCOPE_REVOKED`。

```js
// 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。

```jsx
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 适配在卸载后仍保持有效。

<span class="section-anchor" id="section-70"></span>

## 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 导出。