crossorigin 属性是触发浏览器 cors 校验的指令,非“打开跨域”开关;设为 anonymous 或 use-credentials 后,浏览器才发送 origin 头并校验响应头,从而暴露真实错误、启用 integrity 校验。

script 标签跨域加载 JS 文件时,crossorigin 属性不是“打开跨域”的开关,而是**触发浏览器执行 CORS 安全校验的显式指令**。它本身不解决跨域问题,但决定了错误能否被看清、资源能否被安全使用。
为什么需要 crossorigin 才能看到真实报错?
浏览器出于安全考虑,默认屏蔽跨域脚本的错误细节:哪怕 JS 在 CDN 上抛出 TypeError: Cannot read property 'xxx' of null,页面监听 window.onerror 也只能收到模糊的 "Script error." —— 这是硬性策略,与代码无关。
加了 crossorigin="anonymous" 后,浏览器会:
- 在请求头中带上
Origin字段(如Origin: https://your-site.com); - 要求服务端响应必须包含匹配的
Access-Control-Allow-Origin(例如https://your-site.com或*); - 校验通过后,才允许 JS 执行,并开放完整错误堆栈给前端监控捕获。
crossorigin 的取值和凭据行为
该属性只有两个有效值,语义明确:
-
crossorigin="anonymous":跨域请求不带 Cookie、HTTP 认证头等凭据,等价于fetch(..., { credentials: 'same-origin' }); -
crossorigin="use-credentials":跨域请求携带凭据(如 Cookie),但服务端必须同时返回Access-Control-Allow-Credentials: true,且Access-Control-Allow-Origin不能为*,必须是精确域名。
写成 crossorigin 或 crossorigin="" 会被当作 anonymous 处理,但建议显式写出值,避免歧义。
常见失效场景和关键检查点
加了属性却仍报 Script error. 或资源加载失败?重点排查:
- 服务端响应头是否真有
Access-Control-Allow-Origin,且值与当前页面协议+域名完全一致(https://a.com≠https://a.com/); - 若用了
use-credentials,确认服务端没返回*,且设置了Access-Control-Allow-Credentials: true; - 本地双击 HTML(
file://协议)时,crossorigin被完全忽略,必须用 HTTP(S) 服务访问; - 同域脚本加
crossorigin无意义,既不触发 CORS,也不影响错误捕获。
和 integrity 配合使用的必要性
integrity(子资源完整性校验)只在启用 CORS 流程后生效。也就是说:
- 没加
crossorigin,即使写了integrity,浏览器也会跳过哈希校验; - 正确组合是:
<script src="https://cdn.example.com/app.js" crossorigin="anonymous" integrity="sha384-xxx"></script>; - 这样既能防 CDN 资源被篡改,又能拿到可定位的错误堆栈。











