正文
});
worker.onmessage =
(
e
) =>
{
if
(e.data.error) handleError(e.data.error);
else
handleData(e.data);
};
// plugin.js(Worker 线程)
self.onmessage =
(
e
) =>
{
try
{
// 无法访问 DOM,只能执行纯计算
const
result = process(e.data);
self.postMessage(result);
}
catch
(err) {
self.postMessage({
error
: err.message });
}
};
2. 特点
-
隔离级别
:物理线程隔离(无法访问 DOM 和主线程变量)。
-
-
-
适用场景
:高安全要求或计算密集型任务(如数据分析插件)。
Web Workers是浏览器提供的多线程机制,插件代码运行在独立的线程中,完全隔离于主线程,无法直接访问DOM或其他主线程资源。和Proxy的主要区别在于隔离的层次:Proxy是逻辑层面的隔离,而Web Workers是物理层面的线程隔离。此外,Proxy对性能的影响较小,但安全性不如Web Workers,因为恶意代码仍可能绕过代理或消耗主线程资源。Web Workers虽然更安全,但通信成本高,且无法直接操作DOM,需要消息传递。
三、iframe:浏览器级进程隔离
1. 实现原理
利用浏览器多进程架构,通过
sandbox
属性限制权限:
<iframe
sandbox="allow-scripts allow-same-origin"
src="third-party.html"
>iframe>
-
-
allow-same-origin
:保留同源策略。
2. 特点
-
隔离级别
:进程级隔离(独立渲染进程、JS 执行环境)。
-
-
-
适用场景
:完全不可信的第三方内容(如用户提交的 HTML)。
iframe虽然提供了浏览器级别的隔离,每个iframe有独立的渲染进程和JavaScript执行环境,但它的资源消耗较大,每个iframe需要加载完整的文档环境,对于需要频繁创建和销毁的场景不合适。此外,iframe之间的通信较为复杂,需要使用postMessage,且同源策略可能带来限制。在埋点SDK这种需要高性能和低资源占用的场景下,iframe的开销和复杂性可能成为瓶颈。
四、对比表格:三剑客的终极对决