生产环境的 JS 被压缩、合并、转换过,报错堆栈里只有「a.min.js:1:48273」这种位置,毫无调试价值。Source map 是一份 JSON 记录「产物位置 → 源码位置」的映射(mappings 字段用 VLQ 编码),浏览器/错误监控平台(Sentry)据此还原出源码位置与原始堆栈。
生产环境的安全讲究:不应该把 .map 直接公开(等于泄露源码)。三种做法:彻底不输出 map(彻底无法定位到源码)、仅本地保留不给浏览器加载(构建报错但能定位)、上传到错误监控平台(线上定位最佳实践)。开发环境用 eval-cheap-module-source-map 重编译最快。
// webpack 配置 module.exports = { // dev 模式:eval 包裹 + 模块级映射,重编译最快 devtool: isDev ? 'eval-cheap-module-source-map' : false, production: { // 生产常见做法:生成 map 但不写到公开目录 devtool: 'hidden-nosources-source-map', }, }; // vite.config.js export default defineConfig({ build: { sourcemap: true }, // 或 'hidden'(不写 sourceMappingURL 注释) }); /* 单独的产物 foo.js 最后一行带注释: * //# sourceMappingURL=foo.js.map * 浏览器/监控平台读到该注释加载 map 还原堆栈 */