在 web worker 中正确处理模块化脚本需统一使用 es 模块:主线程创建 worker 时必须指定 { type: 'module' },worker 脚本中禁用 importscripts、只用 import 或 import(),路径相对于自身位置,支持顶层 await 和作用域隔离。

在 Web Worker 中正确处理模块化脚本,关键在于区分加载机制与执行上下文——不能混用 importScripts 和 ES 模块语法,必须统一采用模块化方案并显式声明类型。
必须指定 type: "module" 创建 Worker 实例
主线程中创建 Worker 时,需传入 { type: 'module' } 选项,否则默认按 classic 模式加载,无法识别 import 语句:
-
new Worker('./worker.js', { type: 'module' })是启用模块支持的必要前提 - 不加该选项,即使 worker.js 内写了
import,浏览器会直接报语法错误 - 该配置要求服务运行在 HTTPS 或
localhost,file://协议下无效
在 Worker 脚本中只用 import,禁用 importScripts
启用模块模式后,整个加载链必须基于 ES 模块规范,importScripts 不再可用:
- 静态
import放在文件顶部,如import { calc } from './utils.js' - 动态
import()可在函数内按需调用,返回 Promise,适合条件加载或拆包 - 若混用
importScripts('a.js'),浏览器会抛出TypeError: importScripts is not available in module workers
确保模块路径可解析且符合同源策略
模块导入路径不是相对 HTML,而是相对于 worker 脚本自身位置:
-
import './math.js'表示与 worker.js 同目录下的math.js - 使用
import.meta.url构造绝对路径更可靠,例如const base = new URL('.', import.meta.url); import(base + 'config.js') - 所有模块资源必须同源,跨域需服务端配 CORS,否则触发网络错误
注意模块作用域与顶层 await 的可用性
模块化 Worker 提供了干净的作用域隔离和现代语言特性支持:
- 每个
import的模块拥有独立作用域,不会污染self全局,避免变量冲突 - 支持顶层
await,可用于异步初始化,比如等待配置加载完成再启动主逻辑 - 导出必须显式声明(
export),不可依赖全局挂载;未导出的变量对外不可见
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











