importscripts 是 web worker 中加载外部脚本的唯一标准机制,必须同源、同步阻塞执行、仅支持 umd/iife 格式脚本,且 classic 与 module worker 互斥不可混用。

importScripts 是 Web Worker 环境中加载外部脚本的唯一标准机制,不是“可选方案”,而是规范强制要求的方式。它不提供异步能力、不返回值、不支持跨域直连,必须严格遵循同源策略和执行时序规则。
同源与路径解析规范
所有传入 importScripts 的 URL 必须与 Worker 脚本本身同源(协议、域名、端口完全一致)。相对路径以 Worker 文件所在位置为基准解析,而非 HTML 页面地址。例如 worker.js 位于 /js/worker.js,则 importScripts('./utils.js') 实际请求的是 /js/utils.js。
- 支持相对路径(./a.js、../lib/b.js)、绝对路径(/assets/c.js)
- 不支持跨域 URL(如 https://cdn.example.com/lib.js),即使服务端配了 CORS,也会因浏览器安全策略直接终止 Worker 初始化
- 不支持 data URL(Safari ≤16.4 明确拒绝;Chrome/Firefox 行为不一致,不应依赖)
执行模型与顺序约束
importScripts 是同步阻塞操作:浏览器会暂停 Worker 启动流程,依次下载、解析、执行每个脚本,全部完成才运行后续代码。后一个脚本可直接使用前一个定义的全局变量或函数。
- 参数支持多个字符串,按顺序执行:importScripts('a.js', 'b.js', 'c.js')
- 任一文件加载失败(404、MIME 类型错误、语法错误、网络中断),Worker 立即静默终止,不触发 try/catch,也不抛出可捕获异常
- 服务器必须返回 Content-Type: application/javascript,否则部分浏览器(尤其自建服务)会静默失败
脚本格式与作用域要求
被加载脚本必须能在 Worker 全局上下文中直接执行,即采用 UMD 或 IIFE 格式,将功能挂载到 self(等价于全局作用域),不能含 ES 模块语法(export/import)。
- ✅ 兼容:Lodash UMD 版、moment-timezone-with-data.min.js、自定义 IIFE 封装工具函数
- ❌ 不兼容:ESM 格式包(如 lodash-es)、含顶层 export 的 .mjs 文件、动态 import() 表达式
- 所有变量声明(var、function)自动进入 Worker 全局作用域,无需额外导出
与模块 Worker 的互斥关系
classic Worker(默认)和 module Worker 是两类互不兼容的运行模式,不可混用加载机制。
- classic Worker(new Worker('w.js'))→ 只能用 importScripts(),禁用 import 语句
- module Worker(new Worker('w.mjs', { type: 'module' }))→ 只能用顶层 import,调用 importScripts() 会报 ReferenceError
- 二者无法桥接:模块 Worker 中无法 fallback 到 importScripts,反之亦然











