一文看懂 webpack 的所有 source map !🤔

一直以来对source map 都懵懵懂懂, 被webpack 所提供的多样的source 给乱花了眼。 这次就决定来一一尝试一下各种source map的区别

什么是source map

现代的前端开发总是伴随的各种框架, 在使用这些框架开发的代码需要经过编译才可以在生产环节使用, 编译后就伴随着可读性的降低,也会影响我们的错误调试。
那source map就是为了解决这个问题。

Source map可以理解为一个地图, 通过它可以获知编译后的代码 对应编译前的代码位置。这样当代码遇到异常, 我们就可以通过报错信息定位至准确的位置。 同时在浏览器 sources 也可以查看到源码。

编译后的代码内只需要包含这样一句

// @ sourceMappingURL=map文件路径

就可以关联上 source map文件了

devtool

webpack 通过 devtool 控制需要生成的 source map 类型

我们来看一下 devtool 的支持的属性devtool, 可以看到 source map 同时也分为很多种,但大体上都是加载形式的区别, 本质的核心还是相同的。

把它们罗列出来居然有这么多

  • eval
  • eval-cheap-source-map
  • eval-cheap-module-source-map
  • eval-source-map
  • cheap-source-map
  • cheap-module-source-map
  • source-map
  • inline-cheap-source-map
  • inline-cheap-module-source-map
  • inline-source-map
  • eval-nosources-cheap-source-map
  • eval-nosources-cheap-module-source-map
  • eval-nosources-source-map
  • inline-nosources-cheap-source-map
  • inline-nosources-cheap-module-source-map
  • inline-nosources-source-map
  • nosources-cheap-source-map
  • nosources-cheap-module-source-map
  • nosources-source-map
  • hidden-nosources-cheap-source-map
  • hidden-nosources-cheap-module-source-map
  • hidden-nosources-source-map
  • hidden-cheap-source-map
  • hidden-cheap-module-source-map
  • hidden-source-map

看到这么多,已经开始慌了。 不过不用怕, 其实我们理解核心的几个关键字就可以了。

file

来看一下文档上对这些命名的解释,

  • eval-* :使用eval 生成source map , 不会生成额外的 .map 文件, 而是在eval 函数内附加 source map 。 推荐用于开发环境, 因为* 相对来说构建和热更新都比较快。
  • inline-* : 将SourceMap内联到原始文件中,同样 不会生成额外的 .map 文件。
  • hidden-* :addition会生成source map 但是不会将其关联, 也就是不会在编译后的代码内添加上面提到的那个映射语句。
  • nosources-* :sourcemap 中不带源码, 但会有准确的错误行列信息, 避免源码泄露。
  • cheap-* : 忽略列信息,source map 只有行映射,可以加快打包速度
  • cheap-module-* : moudle 关键子一定是跟 cheap 一起使用的, 表示所映射的阶段, 如果没有 module 映射的是 loader 处理前的代码信息,如果加了 module 那就是 loader 处理后的源码, 举个例子, const a = 1 这行, 如果没加 module 那拿到的就是转为 es5 的 var a = 1, 如果加了module , 那拿到的就是 const a = 1

理解了这些之后,再来看上面这一堆不同类型的 source map 也就能看懂了。

什么? 还不懂? 那我们来动手尝试一下几个典型的!

我们在代码内故意打印未定义的变量 c, 看看不同的 source map 下的错误信息结果

file

注意: 行号为 9

eval

修改配置

file

首先我们在 devtool 填写 eval 。

运行构建

进行一次 run build 构建看看。

可以看到生成的结果, 上方注释写明了这是来自哪个文件的编译结果, 当然这个是 webpack 的加载逻辑, 我们这里可以不用太过关系, 往内部看, 内部是一个 eval 函数, 内部是编译后的代码。

file

然后我们看到末尾, eval 的末尾有 sourceURL=webpack:///./src/views/About.vue?

file

错误信息

然后我们运行一下项目, 看看他的报错信息如何。

file

可以看到其实并不是非常清晰的, 瞅一眼大概能明白是哪个文件爆的错, 但行号之类的完全不对,而且点击进去的也是编译后的信息

查看详情:

file

完全是编译后的代码。

这就是 eval 模式下的 source map 方式, 他不会生成实际的 .map 文件, 但会在 eval 函数末尾添加对原本文件的映射语句, 指向源文件本地地址, 同时调试体验也较差。 因此也就无法在生产环境使用了。

如果想要更清晰的错误信息还是需要使用 eval-source-map

source-map

最标准的 source-map 打包形式

修改配置:

file

运行构建:

file

可以看到生成了很多 .map 文件

file

进入一份js文件, 我们可以看到代码的末尾关联了一份 .map 文件

错误信息:

file

可以看到错误定位还是比较准确的, 找到了正确的 9 行,然后我们点进去看看

file

很完美,是我们正确的源码信息, 并且成功定位到具体列。

inline-source-map

运行构建:

file

没有 .map 文件的产出

file

source map 数据直接内联

错误信息:

file

能定位到 行号

查看详情:

file

完美展示,同样也能够定位至列

nosources-source-map

运行构建:

file

有 .map 文件

file

有路径映射

错误信息:

file

行号准确

查看详情:

file

没有源码信息, 无法加载

hidden-source-map

运行构建:

file

有 .map 文件

file

没有映射路径

错误信息:

file

错误信息模糊

查看详情:

file

完全是编译后的代码

cheap-source-map

运行构建:

file

有 .map 文件

file

有映射路径

错误信息:

file

行号不正确

查看详情:

file

是被处理过的代码,并且没有定位到具体列

cheap-module-source-map

运行构建:

file

有 .map 文件

file

有映射路径

错误信息:

file

行号正确

查看详情:

file

正确的源码,但无法定位到具体列。

结尾

搞清楚 source map 这些区别的关键就在于先要弄懂关键字所表示的含义,其余的都是 “组装” 。

本文由博客一文多发平台 OpenWrite 发布!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容