source map 源码地图

  1. 前端发展到现阶段,很多时候都不会直接运行源代码,可能需要对源代码进行合并、压缩、转换等操作,真正运行的是转换后的代码,这就给调试带来了困难,因为当运行发生错误的时候,希望能看到源代码中的错误,而不是转换后代码的错误;
  2. 为了解决这一问题,chrome 浏览器率先支持了 source map ,其他浏览器纷纷效仿,目前,几乎所有新版浏览器都支持了 source map
    source map 实际上是一个配置,配置中不仅记录了所有源码内容,还记录了和转换后的代码的对应关系,下面是浏览器处理 source map 的原理

Source Map 的配置

module.exports = {
  entry: './src/main.js',
  output: {
    filename: 'bundle.js',
    path: path.join(__dirname, 'dist')
  },
  devtool: 'eval',  // 配置 source map
  module: {
    // ......
  },
  plugins: [
    // ......
  ]
}

webpack devtool 配置对比

看似配置项很多,其实只有以下五个关键字的任意组合:

关键字 描述
eval 使用 eval 包裹模块代码
source-map 产生 .map 文件
cheap 不包含列信息,也不包含 loadersource-map
module 包含 loadersource-map (比如 jsx to js、babel 的 source-map) 否则无法定位源文件
inline .map 作为 DataURL 嵌入,不单独生成 .map 文件

eval

每个模块被转化为字符串,在尾部添加 //# souceURL (指明 eval 前文件) 后,被 eval 包裹起来;

source-map

最原始的 source-map 实现方式,打包代码的同时生成一个 source map 文件,并在打包文件的末尾添加 //# souceURL,注释会告诉 JS 引擎原始文件位置,暴露源码;

hidden-source-map

打包结果与 source-map 一致,但是 map 文件结尾不显示 //# sourceMappingURL

inline-source-map

为打包前的每个文件添加 source mapdataUrl ,追加到打包后文件内容的结尾;此处,dataUrl 包含一个文件完整 soure map 信息的 Base64 格式化后的字符串;

eval-source-map

将每个模块转化为字符串,使用 eval 包裹,并将打包前每个模块的 source map 信息转换为 Base64 编码,拼接在每个打包后文件的结尾,可以缓存 source-map 文件;

cheap-source-map

source-map 但不包含列信息,不包含 loadersourcemap(譬如 babelsourcemap);

cheap-module-source-map

不包含列信息,同时 loadersourcemap 也被简化为只包含对应行的,最终的 source map 只有一份,它是 webpackloader 生成的 source map 进行简化,然后再次生成的;

最佳实践

  1. 在开发环境中使用 cheap-module-eval-source-map 虽然不提供列信息,只提供行信息,但是一般都能很快找到问题,代码经过 loader 转换后的差异较大,首次打包速度较慢,重写打包相对较快;

  2. 在生产环境中使用 none 或者 nosources-source-map 或者 cheap-module-source-map

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. source map 源码地图
  2. 2. Source Map 的配置
  3. 3. webpack devtool 配置对比
    1. 3.1. eval
    2. 3.2. source-map
    3. 3.3. hidden-source-map
    4. 3.4. inline-source-map
    5. 3.5. eval-source-map
    6. 3.6. cheap-source-map
    7. 3.7. cheap-module-source-map
  4. 4. 最佳实践