HTML5中可通过Blob对象实现内联Worker:1.将自包含脚本写为字符串并绑定self.onmessage;2.用Blob封装后生成application/javascript类型的URL;3.以此URL创建Worker,通过postMessage通信;4.使用后需terminate并revokeObjectURL。

HTML5 中无法直接用字符串创建 Worker,但可以通过 Blob 对象绕过同源限制,动态生成并执行内联脚本——这是实现“内联 Worker”的标准且兼容性良好的方式。
1. 构造 Worker 脚本内容
把 Worker 的逻辑写成字符串(注意:不能直接引用外部变量或闭包,需完全自包含):
- 使用普通函数语法或箭头函数均可,但必须显式调用 self.onmessage 或监听事件
- 避免使用 document、window 等主线程专属对象
- 如需传参,统一走 postMessage 和 onmessage
示例脚本字符串:
const workerCode = `
self.onmessage = function(e) {
const data = e.data;
const result = data.map(x => x * 2);
self.postMessage(result);
};`;2. 创建 Blob 并生成 URL
Blob 将脚本字符串封装为二进制对象,再用 URL.createObjectURL() 生成可被 Worker 加载的有效地址:
立即学习“前端免费学习笔记(深入)”;
- MIME 类型必须是 "application/javascript"(部分浏览器对
text/javascript兼容,但推荐前者) - 生成的 URL 是一次性有效链接,Worker 实例销毁后应主动 URL.revokeObjectURL() 释放内存
代码片段:
const blob = new Blob([workerCode], { type: 'application/javascript' });
const url = URL.createObjectURL(blob);3. 初始化 Worker 并通信
用上一步生成的 URL 实例化 Worker,并建立双向消息通道:
- 主线程调用 worker.postMessage() 发送数据(支持结构化克隆,可传数组、对象等)
- Worker 内通过 self.postMessage() 回传结果
- 主线程监听 worker.onmessage 接收响应;也可用 worker.addEventListener('message', ...)
完整调用示例:
const worker = new Worker(url);
<p>worker.onmessage = (e) => {
console.log('Worker result:', e.data);
};</p><p>worker.postMessage([1, 2, 3, 4]); // 触发计算</p><p>// 使用完毕后清理
worker.terminate();
URL.revokeObjectURL(url);4. 注意事项与优化建议
该方式虽灵活,但有实际约束需留意:
- 脚本字符串中不能使用 importScripts 加载外部 JS(会因跨域或路径失败),如需模块化,应提前拼接或改用 import(仅现代浏览器支持 ES module Worker)
- 调试困难:Chrome DevTools 的 Sources 面板中 Blob URL 可见,但断点需手动添加;建议开发期配合 console.log 定位逻辑
- 高频创建时建议缓存 Blob URL(相同脚本内容可复用),避免重复生成和 revoke 开销
不复杂但容易忽略。


















