生产环境应使用 hidden-source-map 或 nosources-source-map 生成 SourceMap,配合 Nginx/CDN 拦截 .map 请求,并将 .map 文件上传至 Sentry 等受控平台;验证需确认 Sources 面板无源码、JS 末尾无 sourceMappingURL 注释、Network 中无 .map 成功请求。

核心思路是“生成但不暴露”——让 SourceMap 文件留在构建产物中,却不让浏览器自动加载或用户轻易访问。既保留内部错误定位能力,又切断源码还原路径。
用 hidden-source-map 或 nosources-source-map 生成安全映射
这两个选项是生产环境首选:
-
hidden-source-map:Webpack/Vite 生成
.map文件,但不在 JS 末尾写//# sourceMappingURL=xxx.map注释,浏览器不会发起请求 -
nosources-source-map:生成的 .map 文件包含原始文件路径和行号(
sources字段),但清空所有源码内容(sourcesContent为空),即使被拿到也无法还原逻辑
两者都避免了 inline-source-map 或 eval-source-map 这类把映射直接塞进 JS 的高风险方式。
服务端拦截 .map 文件访问路径
光靠不写注释不够,攻击者仍可能通过猜测路径(如 /static/js/app.xxxx.js.map)下载文件。必须从部署层阻断:
立即学习“Java免费学习笔记(深入)”;
- Nginx 配置:
location ~* \.map$ { deny all; } - CDN 规则:对所有
*.map请求返回403或404 - 上线后手动测试:
curl -I https://yoursite.com/assets/main.xxxx.js.map,确认响应状态不是200
把 .map 文件转为内部资产,不随前端发布
构建完成后,不再把 .map 文件放在静态资源目录,而是上传到受控平台:
- 自动上传至 Sentry、Bugsnag 等监控平台,并绑定 release 版本号
- 前端报错时,SDK 发送压缩后堆栈,服务端用私有 .map 反解出
src/login.ts:45:12 - 也可上传到带权限的内部服务(如私有 MinIO),供 QA 或运维按需下载,JS 文件全程零关联
验证是否真正生效的三步检查
上线后打开 Chrome DevTools 快速确认:
- Sources 面板里展开 JS 文件,不应出现可读的原始
.ts或.js内容 - 查看 JS 文件源码,末尾没有
sourceMappingURL注释行 - Network 标签页过滤
.map,刷新页面后无成功加载的请求(状态非 200)


















