package.json查看配置

image-20220302232428278

事实上,因为安装的时候什么都选了,所以在package.json里有dev的配置

可以先点击调试按钮,选择Run Script:dev

image-20220303101006462

但是一开始我没调出来(可能是要先添加source-map?),先用[1]的方法配置lauch.json折腾了一番

后来发现根本不需要配?【知识增加.jpg】

source-map

参考的文章中还写了要在webpack.main.config.js里添加

1
devtool : 'source-map'

image-20220302233701808

我照做了,不然好像打不了断点

什么是source-map

source-map也是一种针对JavaScript的debug工具[2]

为什么用source-map

JavaScript 脚本正变得越来越复杂。大部分源码(尤其是各种函数库和框架)都要经过转换,才能投入生产环境。

常见的源码转换,主要是以下三种情况:

  • 压缩,减小体积
  • 多个文件合并,减少 HTTP 请求数
  • 其他语言编译成 JavaScript

这三种情况,都使得实际运行的代码不同于开发代码,除错( debug )变得困难重重,所以才需要 Source Map 。结合上面的例子,即使打包过后的代码,也可以找到具体的报错位置,这使得我们 debug 代码变得轻松简单,这就是 Source Map 想要解决的问题。

如何生成 Source Map

各种主流前端任务管理工具,打包工具都支持生成 Source Map[2:1] 中提到了各种各样的包,包括了安装环境时常见的gulp

Webpack 是前端打包工具(本文案例都会使用该打包工具)。在其配置文件 webpack.config.js 中设置**devtool[13]**即可生成 Source Map 文件:

1
2
3
4
5
6
7
8
9
10
const path = require('path');

module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
devtool: "source-map"
};
  • devtool有 20 多种不同取值,分别生成不同类型的Source Map,可以根据需要进行配置。下文会详细介绍,这里不再赘述。

(这就是为什么要在webpack.main.config.js添加它的原因)

source-map大致原理

打开了souce-map后调试,会在dist/electron底下生成.map文件

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

image-20220302235331692

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

main.js.mapmappings 属性的值是:AAAA; AACA, c ,它的组成结构分成三层:

第一层是行对应,以分号(;)分隔,分号间的内容对应一行线上代码。例如我们上面的例子里,没有分号(可以认为是省略了末尾的分号),则是因为线上代码被压缩成了一行。

第二层是位置对应,以逗号(,)分隔,逗号间的内容对应该行线上代码的某个位置。

第三层是位置映射,以VLQ编码表示,代表该位置对应的源代码位置。

通过进一步的解析,AAAAAAcA 以及 c 都是代表了位置,正常来说,每个位置最多由 5 个字母组成,5 个字母的含义分别是:

  • 第一位,表示这个位置在(转换后的代码的)的第几列。
  • 第二位,表示这个位置属于 sources 属性中的哪一个文件。
  • 第三位,表示这个位置属于转换前代码的第几行。
  • 第四位,表示这个位置属于转换前代码的第几列。
  • 第五位,表示这个位置属于 names 属性中的哪一个变量。

具体分析可以看参考文件[2:2]

总结

总之,可以知道source-map通过形成生成的JS代码对于源文件之间的映射,让我们可以对应到每一行、每一个变量,进行断点调试。


  1. https://juejin.cn/post/6847902221426917389 ↩︎

  2. 弄懂 SourceMap,前端开发提效 100% - 知乎 (zhihu.com) ↩︎ ↩︎ ↩︎