加了crossorigin才可能获取跨域脚本完整错误堆栈,否则仅显示“script error.”;但必须服务端返回匹配的access-control-allow-origin响应头,否则仍失效。

加了 crossorigin 才可能拿到跨域脚本的完整错误堆栈,否则永远只有 "Script error." —— 但这只是必要条件,不是充分条件;服务端没配对响应头,照样白搭。
为什么跨域脚本出错只显示 Script error.
浏览器为防止信息泄露,对跨域脚本的错误细节做了强制屏蔽。哪怕你在 window.onerror 里监听,message、filename、lineno 全是空或 null。这不是前端代码写错了,是浏览器安全策略硬性限制。
- 本地双击打开 HTML(
file://协议)时,crossorigin被完全忽略,错误照样被屏蔽 - 脚本与页面同域(比如都走
https://your-site.com),加不加crossorigin都不影响错误捕获 - 动态
import()加载的 chunk,默认不带crossorigin,Webpack/Vite 构建时得额外配置才生效
crossorigin="anonymous" 是什么,怎么配才有效
它告诉浏览器:用 CORS 模式加载这个脚本,但别带 Cookie 或认证头。这是绝大多数 CDN 场景的默认选择。
- HTML 中必须显式写
<script src="https://cdn.example.com/app.js" crossorigin="anonymous"></script>,不能只写crossorigin或crossorigin="" - CDN 或后端服务器响应中,必须返回
Access-Control-Allow-Origin: https://your-site.com(精确域名)或Access-Control-Allow-Origin: * - 如果服务端返回的是
*,但你用了crossorigin="use-credentials",请求会直接失败——*和凭据互斥
Webpack/Vite 项目里容易漏掉的点
静态 <script></script> 标签好办,但现代打包工具生成的异步 chunk(比如 import('./module.js') 加载的文件)默认不走 CORS 流程,错误监控照样收不到堆栈。
- Webpack:在
output.crossOriginLoading设为'anonymous',否则 chunk 加载不带crossorigin - Vite:需在
vite.config.ts的build.rollupOptions.output中设crossOrigin: 'anonymous',或用插件注入 script 标签属性 - 没配的话,控制台看不到具体报错位置,只看到
Script error.,排查成本陡增
常见失效场景和验证方式
加了属性却还是 Script error.?先看网络面板里那个 JS 请求的响应头有没有 Access-Control-Allow-Origin,再确认值是否匹配当前页面域名。
- 服务端返回
Access-Control-Allow-Origin: *,但页面用了crossorigin="use-credentials"→ 失效 - 服务端漏了
Access-Control-Allow-Origin,哪怕只差一个斜杠(https://a.comvshttps://a.com/)→ 请求失败,控制台报 CORS 错误 - CDN 缓存了旧响应头 → 清缓存或加版本参数(如
?v=20260523)绕过
最易被忽略的一点:错误监控逻辑本身要兼容 error.error(来自 error 事件),而不是只依赖 window.onerror 的老旧参数顺序;现代做法是用 window.addEventListener('error', e => e.error?.stack) 拿堆栈更可靠。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











