### [HTML 加载外部脚本时,crossorigin=”anonymous” 到底该怎么设](https://www.huociguo.com/article/1444)
**Published:** 2026-09-26T09:48:13
**Author:** 米了
**Excerpt:** 做前端监控的人大概都见过这个东西:错误平台上密密麻麻一片 ,message 就这十几个字符,source 是空…
做前端监控的人大概都见过这个东西:错误平台上密密麻麻一片 `Script error.`,message 就这十几个字符,source 是空字符串,lineno 和 colno 全是 0,error 对象是 null。你点进去,什么也看不到,不知道是哪个文件、哪一行、哪个变量炸了。
线上用户反馈”页面点了没反应”,你打开监控一看,满屏 `Script error.`,等于什么都没告诉你。于是本地复现,一切正常——因为本地复现时脚本多半就在同源,浏览器会把完整堆栈老实交出来。
差别就出在这个属性上。跨域脚本(CDN 上的 `app.js`、第三方 SDK)在执行中抛错时,浏览器出于安全考虑只给一个泛化的 “Script error.”,除非你在 `
```
就这么一个属性,把”什么都看不出来”变成”报错直接指到第 3 行第 12 列”。
## 它其实不是”跨域开关”
这是最容易搞混的地方,值得先掰正:**不加 crossorigin,跨域脚本照样能加载、能执行**。`
```
动态创建脚本时容易踩坑,注意顺序——**先设** `crossOrigin`**,再赋** `src`。属性名在 DOM 里是大写 O 的 `crossOrigin`,不是 `crossorigin`:
```
jsconst el = document.createElement('script');
el.crossOrigin = 'anonymous'; // 必须在 src 之前
el.src = 'https://cdn.example.com/app.js';
document.head.appendChild(el);
```
顺序写反了会怎样?赋 `src` 的那一刻浏览器可能就已经发起预加载了,此时还没带上 CORS 标记,等到执行时再补属性已经晚了——请求会以 no-cors 模式发出去,或者干脆发两次。
打包工具这边,webpack 可以统一给产物加:
```
js// webpack.config.js
module.exports = {
output: { crossOriginLoading: 'anonymous' },
};
// 或者交给 HtmlWebpackPlugin
new HtmlWebpackPlugin({ scriptLoading: 'defer', crossOriginLoading: 'anonymous' });
```
Vite 生成的 `index.html` 里,产物 script 默认就是带 crossorigin 的,自定义模板时别手抖删掉。另外动态 `import()` 拉下来的异步 chunk 也走同一套规则,配了主配置一般能覆盖到,上生产前打开 Network 面板扫一眼更稳。
## 服务端那一半必须跟上
标签只是单方面表态。要真正生效,三个条件得同时成立:
1. `