你真的懂webpack devtool source-map吗

137 阅读2分钟

webpack devtool配置

eval

当mode为development时且devtool没有设置时,默认为eval-source-map

生成代码和Source Map内容混淆在一起,通过eval输出。

 // index.tsx
import { add, getName } from "./math";

add(1, 2);
编译后的文件

一个文件有一个sourcemap

image.png

点击打印信息

可以直接跳转到源码

image.png

hidden

编译后的文件

没有sourcemap

点击打印信息

可以直跳转到编译过的代码

image.png

inline

Source Map内容通过base64放在js文件中引入。

// index.tsx
import { add, getName } from "./math";

add(1, 2);
编译后的文件

只有最后的一个sourcemap

image.png image.png

点击打印信息

可以直接跳转到源码

image.png

nosources

使用这个关键字的Source Map不包含sourcesContent,调试时只能看到文件信息和行信息,无法看到源码。

// index.tsx
import { add, getName } from "./math";

add(1, 2);
编译后的文件

没有sourceMap

点击打印信息

无法看到源码

image.png

cheap

// index.tsx
import { add, getName } from "./math";

add(1, 2);
编译后的文件

只有最后的一个sourcemap

image.png

点击打印信息

不包含列信息(光标不会定位到具体位置,eval和inline会),并且源码是进过loader处理过的

image.png

cheap-module

// index.tsx
import { add, getName } from "./math";

add(1, 2);
编译后的文件

只有最后的一个sourcemap

image.png

点击打印信息

不包含列信息,源码是开发时的代码

image.png

浏览器与source-map

浏览器加载source-map是通过js文件中的sourceMappingRUL来加载的,而且sourceMapping支持两种形式:文件路径或base64格式。

加载source-map之后,在浏览器dev tool中的Sources tab就能看到对应的信息了。

Source Map 的工作原理

执行打包后,生成 dist 文件夹,打开 dist/main.js

image.png

可以看到尾部有这句注释: //# sourceMappingURL=main.js.map

正是因为这句注释,标记了该文件的 Source Map 地址,浏览器才可以正确的找到源代码的位置。 sourceMappingURL 指向 Source Map 文件的 URL

除了这种方式之外,MDN中指出,可以通过 response headerSourceMap: <url> 字段来表明。

SourceMap: /path/to/file.js.map

dist 文件夹中,除了 main.js 还有 main.js.map ,这个文件才是 Source Map 文件,也是 sourceMappingURL 指向的 URL

image.png

Source Map规范

根据Source Map v3规范,推荐的格式是:

{
    "version" : 3,
    "file": "out.js",
    "sourceRoot": "",
    "sources": ["foo.js", "bar.js"],
    "sourcesContent": [null, null],
    "names": ["src", "maps", "are", "fun"],
    "mappings": "A,AAAB;;ABCDE;"
}
复制代码

下面来解释一下每个属性代表的含义。

属性掘力值下限
versionSource Map文件版本
file该Source Map对应文件的名称
sourceRoot源文件根目录,这个值会加在每个源文件之前
sources源文件列表,用于mappings
sourcesContent源代码字符串列表,用于调试时展示源文件,列表每一项对应于sources
names源文件变量名和属性名,用于mappdings
mappings位置信息