借助 ignoreList 源代码映射扩展程序,改善 Chrome 开发者工具中的调试体验。
Chrome 开发者工具会解析源映射中的 ignoreList 字段,以帮助改善开发者调试体验。请查看控制台中的以下堆栈轨迹。开发者工具会自动隐藏所有第三方框架,仅显示与您的代码相关的框架。
ignoreList 之前和之后的堆栈轨迹。后者会隐藏不相关的第三方框架,以便您在调试期间更快地找出问题。
什么是 ignoreList?
Source Map 扩展程序是用于存储 Source Map 补充信息的其他字段。此类字段带有 x_ 前缀。
Chrome 开发者工具会使用 ignoreList 字段(如果提供)过滤掉生成的代码,让 Web 开发者只专注于自己编写的代码。例如,请查看以下源映射。
/* demo.js.map */
{
"version": 3,
"mappings": "AAAAA, ..."
"sources": [
"app.js",
"components/Button.ts",
"node_modules/.../framework.js",
"node_modules/.../library.js",
...
],
"ignoreList": [2, 3],
...
}
sources 字段会显示 mappings 条目使用的原始来源列表。观看什么是源代码映射?,了解映射的工作原理。
鉴于 node_modules/…/frameworks.js 和 node_modules/.../library.js 这两个文件是第三方脚本,您可以指定 ignoreList 字段来指明它们在 sources 字段中的位置。Chrome 开发者工具会应用这些信息,隐藏来自这些被忽略文件的帧。
这也适用于断点调试期间来源面板中的调用堆栈。
在后台,开发者工具默认启用了一项额外设置:自动将已知的第三方脚本添加到忽略列表。您可以在“开发者工具”>设置 > 忽略列表中找到该功能。
借助 ignoreList 源代码映射字段,您可以选择在来源面板中隐藏忽略的文件,以便专注于您的代码。

如何填充 ignoreList
好消息是,Angular 和 Nuxt 等框架已在其源映射中配置了 ignoreList。升级到最新版本后,即可直接使用。您无需费力即可获得堆栈轨迹改进。
另一方面,Vite 和 Rollup 等构建工具提供了用于配置该功能的设置。此外,还有一个 webpack 插件可用于此目的。
如果您是框架或库维护者,请务必了解如何实现这些设置,以改善用户的调试体验。请参阅以下部分,了解 Angular 和 Nuxt 是如何在后台实现这一点的。
如果您喜欢的框架和构建工具尚不支持该功能,该怎么办?
我们正积极与框架和构建工具合作,以落地这些新设置。您也可以向维护人员告知此功能,为我们提供帮助。例如,您可以在其代码库中提交问题。
或者,您也可以直接在“开发者工具”>来源 > 页面窗格中的文件树中手动将不相关的脚本添加到忽略列表,以实现类似的结果。
案例研究:Nuxt 和 Angular 实现
请查看以下两个案例研究。
Nuxt 中的 ignoreList
从 Nuxt v3.3.1 开始,node_modules 和 Nuxt buildDir 的内容已被标记为“要被调试程序忽略”。
这是通过使用 Vite 和 Rollup 更改 Nuxt 的 build 配置实现的:
/* vite.config.ts */
const ctx: ViteBuildContext = {
config: vite.mergeConfig(
build: {
rollupOptions: {
output: {
sourcemapIgnoreList: (relativeSourcePath) => {
return relativeSourcePath.includes('/node_modules/') || relativeSourcePath.includes(ctx.nuxt.options.buildDir)
},
}
})
DevTools 团队衷心感谢 Vite 和 Nuxt 团队,是他们的努力让这一切成为可能。感谢您的努力和协作,这对此次成功实施至关重要。再次感谢 Vite 和 Nuxt 团队的贡献!
Angular 中的 ignoreList
从 Angular v14.1.0 开始,node_modules 和 webpack 文件夹的内容已被标记为“忽略”。
这是通过更改 angular-cli 实现的,具体方法是创建一个插件,该插件会挂接到 webpack 的 Compiler 模块。
我们的工程师创建的 webpack 插件会挂接到 PROCESS_ASSETS_STAGE_DEV_TOOLING 阶段,并使用 webpack 生成且浏览器加载的最终资源填充源映射中的 ignoreList 字段。
const map = JSON.parse(mapContent) as SourceMap;
const ignoreList = [];
for (const [index, path] of map.sources.entries()) {
if (path.includes('/node_modules/') || path.startsWith('webpack/')) {
ignoreList.push(index);
}
}
map[`ignoreList`] = ignoreList;
compilation.updateAsset(name, new RawSource(JSON.stringify(map)));
如需详细了解开发者工具中的其他 Angular 调试改进,请参阅案例研究:使用开发者工具更好地调试 Angular。
Chrome 开发者工具团队衷心感谢 Angular 团队为成功实现此功能做出的宝贵贡献。您的努力和协作至关重要,我们非常感谢您的辛勤付出。感谢 Angular 团队让这一切成为可能!