前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Worker 脚本同源与 CORS 限制
浏览浏览器Worker 与线程协作

加载 Worker 脚本文件时受哪些同源或 CORS 限制?

Worker脚本默认与调用页面同源,跨域加载则需服务器返回CORS允许头,且一般不能从file://加载。

前端进阶之旅 · 一题精讲更新于 2026.09.05
浏览器#Worker 与线程协作#HTTP#并发编程
先看核心答案
理解线索

同源与CORS限制

  1. 同源脚本同页面源下,直接使用相对路径或绝对路径均可。
  2. 跨域脚本需资源带Access-Control-Allow-Origin并匹配请求源。
  3. file协议浏览器通常禁止file加载Worker脚本。

无论经典还是模块脚本,CORS检查都发生在拉取资源时。

核心回答

先记住这个答案

创建Worker时传入的脚本URL受同源策略约束。同源脚本直接可用;跨域脚本需响应携带Access-Control-Allow-Origin,否则浏览器拒绝创建。同时,脚本不能来自file协议,本地测试需用HTTP服务器。经典脚本和模块脚本的CORS检查一致,但模块脚本还要求正确的MIME类型为JavaScript。Worker的全局作用域不受此影响,但脚本本身加载失败会触发error事件。

  • Worker脚本默认须同源,跨域需CORS允许头。
  • file://协议一般不能创建Worker,须用HTTP服务。
  • 模块Worker还要求MIME正确为JavaScript。

Worker脚本的同源与CORS加载流程

调用new Worker(url)时,浏览器基于页面的源对URL发起请求。若URL同源,请求直接放行;若跨源,则进入CORS流程,要求资源响应头Access-Control-Allow-Origin匹配页面源或为*。缺少该头或值不匹配,浏览器会终止Worker创建并触发error事件。

脚本类型不改变上述规则,但模块脚本额外要求Content-Type为JavaScript MIME(如text/javascript),否则即便CORS通过也会因MIME不匹配加载失败。此外,对跨域请求,浏览器会发送Origin头,服务器需正确回应,否则控制台显示“无法加载”错误。

从CDN加载远程Worker的工程场景

假设站点https://app.example.com需要从https://cdn.example.com/workers/calc.js创建Worker。由于跨源,CDN必须配置Access-Control-Allow-Origin: https://app.example.com或*。代码中写new Worker('https://cdn.example.com/workers/calc.js'),若该头缺失,浏览器拒绝创建并输出CORS报错。

处理方式是在CDN管理后台为资源添加CORS规则,并验证响应头。若无法改动CDN,可将脚本下载到同源目录或通过后端代理转发。生产环境建议使用具体源而非*,以避免后续携带凭证的请求被拒绝。

file协议与嵌套加载的失效边界

file://页面下,即使脚本位于同一本地目录,浏览器也视其为不透明源,通常禁止创建Worker。Chrome和Firefox会在控制台报错,因此本地开发必须通过HTTP服务(如localhost)访问页面。

跨域Worker脚本内若再通过importScripts或ES模块import加载其他脚本,每个子资源请求都必须独立满足同源或CORS规则。如果主脚本已跨域加载,子脚本的同源检查仍基于页面源,而非Worker所在源。此外,no-cors模式不会暴露错误详情,调试需借助服务端日志。

回答前,多想一步

容易答错的地方

认为脚本URL可访问就能加载
错误。即使URL能被浏览器直接打开,Worker构造器仍强制同源或CORS。若响应头不含允许来源,浏览器会拒绝创建Worker,并报“Script at ... cannot be accessed from origin ...”。
混淆模块Worker与经典Worker的CORS差异
实际上两者同源限制相同,都是要求CORS头。不同在于模块Worker有额外MIME检查,经典脚本若MIME错误也可能被拒绝,但模块要求更严格。
试着用自己的话回答

面试官还会怎么问?

如何在本地快速测试Worker脚本?

使用HTTP服务器,如Python的python -m http.server,通过http://localhost:8000访问页面,避免file://。确保脚本路径与页面同源,否则需配置CORS。

Module Worker跨域需要什么额外的头?

除了Access-Control-Allow-Origin,还要求响应Content-Type是JavaScript的MIME(如text/javascript)。否则即使CORS通过,浏览器也会因MIME类型错误而拒绝加载。

跨域脚本无法改CORS头,是否有其他创建方式?

可以先在主线程用fetch获取脚本文本,再通过URL.createObjectURL生成Blob URL传给Worker。此方式受页面CSP策略限制,且Blob URL仍被视为同源,但需注意CSP的worker-src指令。

从一道题,走向一组知识

把知识连起来

Worker 与线程协作

在 Web Worker 环境里能访问哪些 Window 对象上的 API,哪些不能?

同属「Worker 与线程协作」专题,接着看 Web Worker 可访问的 API 与 DOM 限制 在具体场景中的处理方式。

Worker 与线程协作

创建一个专用 Worker 时,它的全局作用域和主线程有什么不同?

同属「Worker 与线程协作」专题,接着看 DedicatedWorkerGlobalScope 全局作用域差异 在具体场景中的处理方式。

参考资料

  • Using Web Workers

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. Worker脚本的同源与CORS加载流程
  3. 从CDN加载远程Worker的工程场景
  4. file协议与嵌套加载的失效边界
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑