加了crossorigin="anonymous"仍是“script error.”,因该属性仅启动cors协商流程,需服务端返回匹配的access-control-allow-origin响应头才生效;缺头、值不精确、协议/路径不一致、use-credentials与*冲突、动态import未配置crossoriginloading、file://协议下忽略等均会导致失败。

为什么加了 crossorigin="anonymous" 还是 “Script error.”
因为 crossorigin 不是错误捕获开关,它只是启动 CORS 协商流程的“请求声明”。浏览器发请求时带上 Origin 头,但能否拿到完整堆栈,全看服务端是否返回匹配的 Access-Control-Allow-Origin 响应头。缺这个头、值不精确(比如多一个斜杠)、协议不一致(https://a.com/ vs https://a.com),或者用了 crossorigin="use-credentials" 但服务端返回了 *,都会导致协商失败,错误继续被屏蔽。
script 标签加了 crossorigin,但动态 import() 的 chunk 仍报 “Script error.”
静态 <script></script> 标签加了属性,只管它自己;Webpack/Vite 打包生成的异步 chunk(比如 import('./utils.js') 加载的文件)默认**不带** crossorigin 属性,也不会自动继承主 script 的配置。
- Webpack:必须在
webpack.config.js的output中显式设crossOriginLoading: 'anonymous' - Vite:需在
vite.config.ts中配置build.rollupOptions.output.crossOrigin: 'anonymous',或用插件在 runtime 注入 script 标签属性 - 漏配后 Network 面板能看到 JS 请求发出,但响应头里没有
Access-Control-Allow-Origin,控制台只报 “Script error.”
本地开发时 file:// 协议下 crossorigin 完全失效
所有浏览器都忽略 file:// 下的 crossorigin 属性——无论 <script></script>、<img> 还是 <link rel="stylesheet">。此时跨域脚本出错,必定是 “Script error.”,且无法绕过。
- 验证是否真生效,必须用 HTTP 服务启动页面(如
npx serve、vite preview、webpack-dev-server) - 部分构建工具(如 Vite)在 dev 模式下会自动注入本地代理,但上线部署到 CDN 后若没配
crossOrigin,问题立刻复现 - 别依赖本地双击 HTML 文件测试跨域错误捕获逻辑
<link> 上加 crossorigin 对脚本错误监控毫无作用
<link rel="stylesheet"> 或 <link rel="icon"> 加了 crossorigin,既不会影响 window.onerror 捕获 JS 错误,也不会让 “Script error.” 变成真实堆栈。这类标签加载的资源(CSS、字体、图标)出错,根本不会触发脚本执行错误回调。
-
window.onerror只监听<script></script>执行异常和资源加载失败(如 script/img 加载 404),不监听 CSS 加载失败 - 给
<link rel="icon">或<link rel="manifest">加crossorigin,浏览器直接忽略,不发 CORS 请求,也不报错,纯属冗余 - 真正要盯的是所有跨域
<script></script>标签 + 构建工具对动态 import 的配置,其他地方加了也白加
实际线上问题最常卡在服务端响应头缺失和动态 chunk 配置遗漏这两处,而且它们往往同时存在——前端写了 crossorigin 就以为万事大吉,结果监控平台里全是 “Script error.”,排查时容易反复在代码层打转,忽略网络链路和构建配置。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











