---
title: "修复隐藏了消息、文件和行号的脚本错误"
description: "Script error. 加上第 0 行且没有堆栈，表示浏览器隐藏了来自其他源脚本的一个错误。加上 crossorigin 和 CORS 响应头就能拿回消息。"
canonical: "https://logbrew.co/zh-Hans/errors/script-error"
last_updated: "2026-11-10"
---

# 修复隐藏了消息、文件和行号的脚本错误

`Script error.` 加上第 0 行且没有堆栈，表示浏览器隐藏了来自其他源脚本的一个错误。加上 `crossorigin` 和 CORS 响应头就能拿回消息。

2026年11月10日 用 Chromium 152、@logbrew/browser 0.1.21和@logbrew/sdk 0.1.44 实测

作者 [Furkan Erday](https://github.com/furkanerday). Furkan Erday 是 LogBrew 的创始人，每天用 Claude Code 和 Codex 开发 LogBrew。

Canonical: https://logbrew.co/zh-Hans/errors/script-error

## 页面能从一个抛出错误的脚本中得知什么

| 脚本的加载方式 | 脚本是否运行 | 错误详情 |
| --- | --- | --- |
| 来自页面自己的源 | 已运行 | 完整 |
| 来自其他源 | 已运行 | `Script error.` |
| 其他源，加 `crossorigin` 和 CORS 响应头 | 已运行 | 完整 |
| 其他源，加 `crossorigin` 但无响应头 | 被阻止 | 无 |

1 个脚本，用 4 种方式加载。完整表示能读到消息、文件、第 1 行、第 7 列和堆栈，全部来自 `window` 上的 `error` 事件。

## 拿回完整的错误

### 用 crossorigin 属性加载脚本

这个属性让浏览器用 CORS 来获取文件。服务器允许后，浏览器就会把真实的消息、文件、行号和堆栈交给页面的错误监听器。

```bash
<script src="https://cdn.example.com/app.js" crossorigin="anonymous"></script>
```

### 让文件所在的服务器发送 CORS 响应头

托管脚本的服务器必须返回 `Access-Control-Allow-Origin`，值设为你页面的源，公开文件则设为 `*`。在我们的实测中，只加这一个响应头，`Script error.` 就变成了完整的消息。

```bash
Access-Control-Allow-Origin: *
```

### 确认文件仍能加载

设了 `crossorigin` 却没有响应头时，浏览器会阻止文件，脚本永远不会运行。这时控制台显示 `blocked by CORS policy` 和 `net::ERR_FAILED`，`script` 元素触发 `error` 事件。

输出

```text
Access to script at 'http://127.0.0.1:4874/plain/throws.js?scenario=script-cross-origin-attr-no-header' from origin 'http://127.0.0.1:4873' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Failed to load resource: net::ERR_FAILED
```

### 或者从你自己的源提供脚本

来自页面自己的源的脚本永远不会被隐藏错误。把文件和你的应用打包在一起，或者通过你的域名中转，就不需要任何响应头。

## 处理你仍会收到的静默错误

### 先计数，再找出脚本

`Script error.` 不带任何可供修复的信息。每一个都表示某个其他源的脚本抛出了错误。找出没有 `crossorigin` 的标签，先从每个页面都加载的那些开始。

### 在控制台读取真实消息

浏览器会把完整错误打印到控制台，即使它对你的监听器隐藏了错误。在我们的实测中，控制台显示 `Uncaught Error: Keg is empty`，而 `window.onerror` 只收到 `Script error.`。

### 决定如何处理第三方标签

没有 CORS 响应头的聊天挂件或分析标签给你留下 2 个选择。保持原样并接受静默错误，或者加上 `crossorigin`，让缺失的响应头阻止该标签，并以加载失败的形式显现。

## 我们实测看到的结果

我们把 1 个抛出错误的脚本，`throw new Error("Keg is empty: no beer left for order 42");`，放到 2 台本地服务器上。页面运行在 `http://127.0.0.1:4873`，使用安装了 `@logbrew/browser` 0.1.21 的 Chromium 152，第二台服务器在 `http://127.0.0.1:4874` 充当 CDN。我们用 4 种方式加载脚本，每次都读取 `window` 上的 `error` 事件。

从页面自己的源加载时，事件带有 `Uncaught Error: Keg is empty: no beer left for order 42`、文件 `/throws.js`、第 1 行、第 7 列，以及一个带堆栈的 `Error` 对象。从其他源加载且没有 `crossorigin` 时，事件带有 `Script error.`、空文件名、第 0 行、第 0 列，没有 `Error` 对象。控制台仍然打印了完整消息。

在 CDN 上加了 `crossorigin="anonymous"` 和 `Access-Control-Allow-Origin: *` 后，事件再次带上了完整详情。只有属性而没有响应头时，浏览器阻止了文件，脚本没有运行，`script` 元素触发了 `error` 事件。

## 浏览器为什么隐藏消息

HTML 标准会隐藏页面从其他源不经 CORS 加载的脚本的错误。它的算法在响应类型为 CORS-cross-origin 时把错误标记为静默，然后把错误报告为 `Script error.`，没有 URL，第 0 行，第 0 列，也没有错误对象。

浏览器把跨源脚本的错误内容视为该脚本的数据，所以页面什么也拿不到。MDN 关于 `crossorigin` 的页面用 1 句话说明了这一点。对这类脚本，通过 `window.onerror` 访问错误日志受到限制。

whatwg/html#2440 提议了一种不需要 CORS 就能拿到详情的方式。它在 2024 年 7 月被关闭，同一天 whatwg/html#10514 被打开，报告各浏览器对同一情况的静默处理并不一致。这个报告至今仍然开着。

## LogBrew 记录了什么

有完整详情时，浏览器 SDK 发送 1 个名为 `Browser error: Error` 的问题，带有指向 `/throws.js` 第 1 行第 7 列的一个堆栈帧、源码路径和聚合键 `browser.error:Error:/throws.js`。每个抛出错误的脚本都有自己的问题。

错误被静默时，问题名称相同，没有堆栈帧，第 0 行，第 0 列，聚合键为 `browser.error:Error`。所有静默错误共用这 1 个问题，所以它的发生次数告诉你还有多少错误你看不到。

两个事件都带有页面路径、`macOS` 上的 `Chromium 152` 运行时，以及一条 `page_view` 操作记录（breadcrumb）。两者都不带消息正文。SDK 把它标记为 `redacted`。

## 常见问题

### JavaScript 中的 Script error. 是什么意思？

某个其他源的脚本抛出了错误，而浏览器对页面隐藏了详情，因为文件不是通过 CORS 加载的。脚本本身已经运行了。

### Script error. 为什么是第 0 行且没有堆栈？

HTML 标准在隐藏错误时会替换掉消息、文件、行号、列号和错误对象。只剩下 `Script error.` 这个字符串。

### Script error. 是否表示脚本加载失败？

不是。加载失败的脚本会在它的 `script` 元素上触发 `error` 事件，并且永远不会运行。`Script error.` 表示脚本已经运行并抛出了错误。

### 不改服务器能看到消息吗？

在浏览器控制台里可以。在你的错误监控里不行。页面需要标签上有 `crossorigin`，服务器发送 CORS 响应头，或者脚本放在你自己的源上。

### 我该把 Script error. 从错误监控里过滤掉吗？

计数，不要过滤。这个数字告诉你还有多少错误你看不到，等所有跨源脚本都通过 CORS 加载时，它会降到 0。

## 统计你还看不到的错误

LogBrew 浏览器 SDK 把每个静默错误归入 1 个问题，并给每个真实错误标出文件、行号和堆栈。免费额度充足，无需绑卡。

[免费开始](https://logbrew.co/zh-Hans)

## 参考来源

- [MDN, Window: error event](https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event)
- [MDN, crossorigin attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/crossorigin)
- [HTML Standard, Runtime script errors](https://html.spec.whatwg.org/multipage/webappapis.html#runtime-script-errors)
- [whatwg/html#2440](https://github.com/whatwg/html/issues/2440)
- [whatwg/html#10514](https://github.com/whatwg/html/issues/10514)

## 更多 JavaScript 错误修复

- [修复 Failed to fetch 错误，分清它的 3 种原因](https://logbrew.co/zh-Hans/errors/failed-to-fetch)
- [我们复现过的 JavaScript 错误，以及每个错误的修复方法](https://logbrew.co/zh-Hans/errors)
