nosources-source-map 的核心作用是保留错误堆栈的行号、列号和文件名映射,但完全不包含原始源码内容(sourcesContent 字段为空或缺失),实现“可定位、不可读”的平衡。

nosources-source-map 的核心作用是:保留错误堆栈的行号、列号和文件名映射,但完全不包含原始源码内容(即 sourcesContent 字段为空或缺失)。它不是“混淆”或“脱敏”,而是通过剥离源码本身,实现“可定位、不可读”的平衡。
文件路径与位置映射仍可用
它依然生成标准的 Source Map JSON 结构,包含:
-
version、file、sources(如["src/index.ts"]) -
mappings(Base64 VLQ 编码的位置映射,精确到行列) - 但 不写入
sourcesContent数组,也不在.map文件里嵌入任何一行源码
因此浏览器或 Sentry 解析堆栈时,能准确告诉你:
“错误发生在
src/index.ts第 42 行第 5 列”
但点击跳转或展开源码面板时,只会看到空白、<source not available>或提示“源码未提供”。
构建配置上如何启用
Webpack 中直接设置:
devtool: 'nosources-source-map'
Vite 中等效配置:
build: {
sourcemap: true,
// 并确保 rollupOptions 中未启用 sourcesContent
}注意:该模式会生成独立 .map 文件(非内联),且 .map 文件体积小(仅含路径+映射,无源码)。
它不解决什么,需额外配合
- ❌ 不隐藏文件路径(
sources仍是src/xxx.ts)→ 需用output.devtoolModuleFilenameTemplate: '[resource-path]'转为相对路径 - ❌ 不过滤上报中的敏感参数(如 URL、用户输入)→ 必须在 SDK 的
beforeSend中清洗stacktrace.frames - ❌ 不影响构建产物(
.js文件)是否压缩或变量名是否混淆 → 混淆由 Terser 等单独控制
对比其他常见模式
-
source-map:含sourcesContent,源码全量内嵌,最完整也最危险 -
hidden-source-map:生成.map文件但不加//# sourceMappingURL=注释,需手动加载,适合内部错误平台 -
nosources-source-map:有注释、可自动加载,映射可用,源码彻底不发,适合公开生产环境
不复杂但容易忽略


















