模块化 Worker 必须指定 { type: 'module' },使用 new URL('./worker.js', import.meta.url) 构造路径,脚本需符合 ESM 规范(带 .js 后缀、支持顶层 await),构建工具需适配同源限制与 CORS 要求。

在模块化项目中,Web Worker 导入外部脚本不能直接用 importScripts 加载 ES 模块文件(如 .mjs 或含 export 的脚本),也不能在 classic Worker 中使用 import。必须统一采用“模块化 Worker”方案,即显式启用 ESM 支持,并确保路径、构建工具和运行时协同工作。
必须传入 { type: 'module' }
创建 Worker 时需强制指定类型,否则即使脚本里写了 import 也会报语法错误:
-
new Worker('./worker.js', { type: 'module' })—— 浏览器原生支持(Chrome 120+、Firefox 119+、Safari 16.4+) - 路径必须是同源 URL:推荐用
new URL('./worker.js', import.meta.url)构造,避免打包后路径失效 - 不能用字符串内联方式(如
new Worker('data:text/javascript,...')),模块 Worker 不支持
Worker 脚本内用标准 import 语句
worker.js 文件本身要符合 ESM 规范,所有依赖通过 import 声明:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
-
import { calculate } from './math-utils.js'—— 相对路径需带.js后缀(浏览器 ESM 强制要求) -
import _ from 'https://cdn.skypack.dev/lodash-es@4.17.21'—— 支持裸模块标识符,但需构建工具或 CDN 支持解析 - 不支持
require()、global、window、document;self是全局对象,可用self.postMessage - 顶层
await可用,适合异步初始化,例如const mod = await import('./config.js')
构建工具适配要点
不同工具链对模块 Worker 的处理差异较大,需针对性配置:
-
Vite:开箱即用,开发/生产均支持;推荐写法:
new Worker(new URL('./worker.js', import.meta.url), { type: 'module' }) -
Webpack:需安装
worker-loader并配置.worker.js后缀,或升级到 Webpack 5+ 启用type: 'module'输出 -
Rollup / esbuild:不直接支持
new Worker(..., {type:'module'})的静态分析,建议改用 Blob URL 方式动态生成模块 Worker - 所有工具都需注意:ESM 模块路径在打包后可能被哈希重命名,硬编码
import './xxx.js'易出错,应优先走import.meta.url动态解析
跨域与资源加载限制
模块 Worker 的 import 遵守严格同源策略,跨域需额外处理:
- 同源脚本可直接
import;跨域模块必须满足 CORS(响应头含Access-Control-Allow-Origin) - CDN 上的 ESM 包(如 Skypack、esm.sh)通常已配置 CORS,可安全导入
- 不支持
importScripts的 data URL 或 blob URL 方式加载模块脚本——ESM 加载器不识别这些协议 - 若必须加载非模块化库(如 UMD 版 lodash),仍可用
importScripts('lodash.min.js'),但只能在 classic Worker 中,无法与import混用










