PostMsg Builder
PostMsg Builder 是一个用于构建和处理 postMessage 通信的工具包,提供了类型安全和便捷的 API。
特性
- 支持 iframe 和 window.open 通信
- 支持父子窗口通信
- 支持自定义通信渠道
- 支持批量设置监听器
- 支持动态加载 iframe 内容
- 支持自动清理资源
安装
npm install @kazura/postmsg-builder
使用方法
基本使用
import PostMsgBuilder from '@kazura/postmsg-builder'
// 创建构建器
const builder = new PostMsgBuilder()
// 设置接收者
builder.setReceiver(window.parent)
// 设置监听器
builder.setListener('message', (data) => {
console.log('Received:', data)
})
// 构建 WebPostMsg 实例
const postMsg = builder.build()
iframe 通信
// 父窗口
const parentBuilder = new PostMsgBuilder()
// 创建子 iframe
parentBuilder.createChildIFrameReceiver({
container: document.body,
className: 'my-iframe',
url: 'https://child.example.com',
})
// 加载 URL
parentBuilder.loadURL('https://child.example.com')
// 子窗口
const childBuilder = new PostMsgBuilder()
childBuilder.createParentIFrameReceiver()
window.open 通信
// 父窗口
const parentBuilder = new PostMsgBuilder()
// 打开子窗口
parentBuilder.createChildOpenerReceiver({
url: 'https://child.example.com',
features: 'width=800,height=600',
})
// 子窗口
const childBuilder = new PostMsgBuilder()
childBuilder.createParentOpenerReceiver()
批量设置监听器
const builder = new PostMsgBuilder()
// 批量设置监听器
builder.setListeners(
new Map([
['message', (data) => console.log('Message:', data)],
['error', (error) => console.error('Error:', error)],
])
)
// 设置单个监听器
builder.setListener('custom', (data) => console.log('Custom:', data))
// 删除监听器
builder.deleteListener('custom')
API 参考
PostMsgBuilder
constructor
constructor(options?: Partial<PostMsgAPIOptions>)
创建一个 PostMsgBuilder 实例。
参数:
options
: 可选的配置选项
setChannel
private setChannel(channel: string): void
设置通信渠道。
参数:
channel
: 渠道名称
setReceiver
setReceiver(receiver: Window): PostMsgBuilder
设置接收者。
参数:
receiver
: 接收者窗口
返回值:
- PostMsgBuilder 实例
setIFrameReceiver
setIFrameReceiver(iframe: HTMLIFrameElement): PostMsgBuilder
设置 iframe 接收者。
参数:
iframe
: iframe 元素
返回值:
- PostMsgBuilder 实例
setListeners
setListeners(listeners: Map<string, Listener>): PostMsgBuilder
批量设置监听器。
参数:
listeners
: 监听器映射
返回值:
- PostMsgBuilder 实例
setListener
setListener(type: string, listener: Listener): PostMsgBuilder
设置单个监听器。
参数:
type
: 消息类型listener
: 监听器函数
返回值:
- PostMsgBuilder 实例
deleteListener
deleteListener(type: string): PostMsgBuilder
删除监听器。
参数:
type
: 消息类型
返回值:
- PostMsgBuilder 实例
setReceiveAllChannel
setReceiveAllChannel(receiveAllChannel: boolean): PostMsgBuilder
设置是否接收所有渠道的消息。
参数:
receiveAllChannel
: 是否接收所有渠道的消息
返回值:
- PostMsgBuilder 实例
build
build(): WebPostMsg
构建 WebPostMsg 实例。
返回值:
- WebPostMsg 实例
createChildIFrameReceiver
createChildIFrameReceiver(iframe: HTMLIFrameElement): PostMsgBuilder
createChildIFrameReceiver(options: ParentIFrameReceiverOptions): PostMsgBuilder
创建子 iframe 接收者。
参数:
iframe
: iframe 元素或配置选项
返回值:
- PostMsgBuilder 实例
loadURL
loadURL(url: string): PostMsgBuilder
加载 iframe URL。
参数:
url
: 要加载的 URL
返回值:
- PostMsgBuilder 实例
createParentIFrameReceiver
createParentIFrameReceiver(): PostMsgBuilder
创建父 iframe 接收者。
返回值:
- PostMsgBuilder 实例
createChildOpenerReceiver
createChildOpenerReceiver(receiver: Window, name: string): PostMsgBuilder
createChildOpenerReceiver(options: ParentOpenerReceiverOptions): PostMsgBuilder
创建子 opener 接收者。
参数:
receiver
: 接收者窗口或配置选项name
: 渠道名称(当使用 receiver 参数时)
返回值:
- PostMsgBuilder 实例
open
open(url: string, features?: string): PostMsgBuilder
打开新窗口。
参数:
url
: 要打开的 URLfeatures
: 窗口特性
返回值:
- PostMsgBuilder 实例
createParentOpenerReceiver
createParentOpenerReceiver(): PostMsgBuilder
创建父 opener 接收者。
返回值:
- PostMsgBuilder 实例
destroy
destroy(): PostMsgBuilder
销毁实例,清理资源。
返回值:
- PostMsgBuilder 实例
注意事项
- 确保正确设置通信渠道
- 注意处理跨域通信的安全限制
- 及时清理不需要的监听器
- 使用 destroy 方法清理资源
- 注意处理通信错误和异常情况
示例
父子窗口通信
// 父窗口
const parentBuilder = new PostMsgBuilder()
// 创建子 iframe
parentBuilder
.createChildIFrameReceiver({
container: document.body,
className: 'child-iframe',
url: 'https://child.example.com',
})
.setListener('message', (data) => {
console.log('Received from child:', data)
})
.build()
// 子窗口
const childBuilder = new PostMsgBuilder()
.createParentIFrameReceiver()
.setListener('message', (data) => {
console.log('Received from parent:', data)
})
.build()
窗口通信
// 父窗口
const parentBuilder = new PostMsgBuilder()
// 打开子窗口
parentBuilder
.createChildOpenerReceiver({
url: 'https://child.example.com',
features: 'width=800,height=600',
})
.setListener('message', (data) => {
console.log('Received from child:', data)
})
.build()
// 子窗口
const childBuilder = new PostMsgBuilder()
.createParentOpenerReceiver()
.setListener('message', (data) => {
console.log('Received from parent:', data)
})
.build()
批量监听器
const builder = new PostMsgBuilder()
// 批量设置监听器
builder
.setListeners(
new Map([
['message', (data) => console.log('Message:', data)],
['error', (error) => console.error('Error:', error)],
['custom', (data) => console.log('Custom:', data)],
])
)
.build()
// 删除不需要的监听器
builder.deleteListener('custom')