同源
仅能同源窗口之间传递数据
LocalStorage / SessionStorage
看起来不是什么正经方案,唯一想到的用途是页面明暗主题切换
window.localStorage.setItem('key', 'hello world')
window.addEventListener('storage', event => {
console.log(event)
})
MessagePort
点对点双向通讯,MessagePort 是可转移对象
const { port1, port2 } = new MessageChannel()
const worker = new Worker('worker.js')
worker.postMessage({ port: port1 }, [port1])
port2.onmessage = event => {
console.log('Received from worker:', event.data)
}
port2.postMessage('hello world')
self.onmessage = event => {
const { port } = event.data
port.onmessage = event => {
console.log('Received from main thread:', event.data)
}
port.postMessage('hello world')
}
BroadcastChannel
多个窗口或标签页之间的广播通信
const channel = new BroadcastChannel('name')
channel.postMessage('hello world')
const channel = new BroadcastChannel('name')
channel.onmessage = event => {
console.log(event.data)
}
SharedWorker
多个窗口或标签页共享同一个后台线程
const worker = new SharedWorker('worker.js')
worker.port.onmessage = event => {
console.log('Received from worker:', event.data)
}
worker.port.postMessage('hello world')
const ports = []
self.onconnect = event => {
const port = event.ports[0]
ports.push(port)
port.onmessage = event => {
console.log(event.data)
}
port.postMessage('hello world')
}
不同源
不同源窗口之间也能传递数据
PostMessage
window.postMessage('hello world', '*')
window.addEventListener('message', event => {
console.log(event.data)
})