Script Error(脚本错误)是浏览器在加载或执行 JavaScript 时遇到异常,但因安全限制或其他原因无法提供具体错误信息(如错误类型、位置)的一种模糊提示。它通常表现为仅显示 Script Error 而无详细堆栈,给调试带来困难。
一、产生 Script Error 的核心原因
Script Error 的本质是浏览器的跨域安全限制导致错误信息被屏蔽,具体场景如下:
跨域脚本执行错误
当页面中加载了来自不同域名 / 协议 / 端口的 JavaScript 文件(跨域脚本),且该脚本执行时发生错误,浏览器为保护隐私会隐藏具体错误信息,仅返回 Script Error。
例:https://a.com 的页面加载 https://b.com/script.js,若 script.js 出错,会触发 Script Error。
错误捕获方式不当
即使脚本同域,若使用 window.onerror 捕获错误时未正确处理参数,也可能导致错误信息被简化为 Script Error。
注:window.onerror 对跨域错误的参数(如 message、filename)会返回 null 或空值。
浏览器安全策略限制
部分浏览器(如 Chrome、Firefox)对 file:// 协议(本地文件)的脚本错误也会限制信息显示,导致 Script Error。
二、解决 Script Error 的具体方法
根据原因,可通过以下步骤逐步排查和解决:
1. 解决跨域脚本的错误屏蔽(核心方案)
若错误来自跨域脚本,需同时配置服务器跨域头和脚本标签属性:
步骤 1:服务器添加 Access-Control-Allow-Origin 头
让跨域脚本的服务器返回允许当前域名访问的响应头,例如:
Access-Control-Allow-Origin: https://your-domain.com # 允许指定域名
# 或允许所有域名(不推荐生产环境)
# Access-Control-Allow-Origin: *
若脚本放在 CDN,需在 CDN 控制台配置该响应头。
步骤 2:为跨域脚本标签添加 crossorigin 属性
在页面引入跨域脚本时,添加 crossorigin 属性(值为 anonymous 或 use-credentials),告知浏览器该脚本需要跨域权限:
anonymous:无需发送 Cookie 等凭据(推荐);use-credentials:需要发送凭据(需服务器头配合 Access-Control-Allow-Credentials: true)。
2. 正确捕获错误信息
避免因错误捕获方式不当导致信息丢失:
使用 window.addEventListener('error') 替代 window.onerror
window.onerror 对跨域错误的兼容性较差,建议改用 error 事件监听,并处理事件对象:
window.addEventListener('error', (event) => {
const error = event.error;
console.log('错误信息:', error.message);
console.log('错误堆栈:', error.stack);
// 上报错误...
}, true); // 第三个参数设为true,捕获冒泡阶段的错误
捕获 Promise 未处理的错误
若错误来自 Promise(如未使用 catch),需额外监听 unhandledrejection 事件:
window.addEventListener('unhandledrejection', (event) => {
console.log('Promise错误:', event.reason);
event.preventDefault(); // 阻止浏览器默认提示
});
3. 本地开发环境的特殊处理
若在本地 file:// 协议下开发时遇到 Script Error:
改用本地服务器运行项目(如 http://localhost),避免直接打开本地 HTML 文件。示例:使用 vue-cli 的 npm run serve、webpack-dev-server 或 Python 的 python -m http.server 启动本地服务。
4. 其他补充方案
三、验证是否解决
复现错误场景,检查控制台是否显示具体错误信息(如 Uncaught TypeError)而非 Script Error。若使用错误监控工具(如 Sentry、Fundebug),确认工具能捕获完整的错误堆栈和来源。
总结
Script Error 主要由跨域安全限制引起,解决核心是:
跨域脚本需配置 Access-Control-Allow-Origin 头和 crossorigin 属性;使用正确的错误监听方式(addEventListener);避免本地 file:// 协议开发。