### [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. `