type
status
date
slug
summary
tags
category
icon
password
Edited
Sep 30, 2024 03:14 AM
Created
Aug 6, 2024 03:04 PM
在前端开发的世界中,调试源码是一项不可或缺的技能。特别是当我们使用如 Solid 这样的现代 JavaScript 框架时,深入理解其内部机制对于优化应用性能和解决问题至关重要。
对于 JavaScript 文件,我们可以直接在浏览器的开发者工具中进行调试。然而,Solid 是使用 TypeScript 编写的,在浏览器中直接调试 TypeScript 源码暂时是没办法的。TypeScript 代码在运行前需要被编译成 JavaScript,而这一过程往往伴随着代码的压缩和混淆,使得源码与执行代码之间的直接对应关系变得模糊。
为了解决这个问题,我们需要一种方法来在编译后的 JavaScript 文件和源码之间建立联系。这就是
sourcemap 的关键作用所在:它作为一个桥梁,允许我们在浏览器的开发者工具中查看和调试源码,即使实际运行的是编译后的 JavaScript 代码。在本文中,我们将深入探讨如何有效地利用
sourcemap 进行 Solid 源码的调试,并探索一些通用的调试技巧,这些技巧同样适用于其他现代 JavaScript 框架。Source Map
Source map 是一种映射文件,它记录了转换后代码与原始源代码之间的对应关系。这种映射使得开发者能够在浏览器中直接调试原始的 JavaScript/TypeScript 代码,而不是压缩混淆后的 JavaScript 代码。通过
sourcemap 文件,当进行打印或报错提示时,会显示源码的位置信息,而不是转换后代码的位置。当然,这也是得利于 Chrome 浏览器的支持,我们可以在控制台的设置中看到
JavaScript source maps 的选项,来启用该功能(默认是开启的)。
Source Map 的启用
在编译过程中生成
sourcemap 文件,并在打包后的 JavaScript 文件尾部中通过以下注释指定其位置:这个路径既可以是本地路径,也可以是网络上的资源路径。
Source Map 格式
Source map 文件通常包含以下属性:version:sourcemap 版本
file:编译后文件
sources:源文件数组
sourcesContent:源代码
names:源代码中的变量数组
mappings:映射段字符串
sourceRoot:源文件根目录(如果与转换前的文件在同一目录,该项为空)
mappings
mappings 属性是 sourcemap 中最关键的部分,它使用一种特殊的编码方式(VLQ编码)来压缩表示映射信息。这种编码方式可以有效地减少文件大小,同时保持映射信息的准确性。关于
mappings 的映射原理,我简单的讲述一下。以上面这个为例,一个位置用五位符号表示,分别的含义是:
- 编译后文件的第几列
- 对应源文件(
sources)
- 源文件的第几行
- 源文件的第几列
- 源代码变量名(
names)(可选)
即:
编译后文件的第几列 | 对应源文件 | 源文件的第几行 | 源文件的第几列 | 源代码变量名同时,我们通过
;去区分编译后文件的第几行
,编译后文件的对应源文件一个位置的内容
而且,如果直接用文件路径、第几列、第几行表示,会非常的占空间,所以这里使用了
VLQ编码 进行压缩精简表示。如果想更深入地理解
sourcemap 和 VLQ编码,推荐以下两篇文章给大家。在 Solid 中添加 Source Map
要在 Solid 项目中添加
sourcemap,我们需要在构建过程中包含它。虽然 Solid 本身不直接提供这个功能,但我们可以通过构建工具来实现。- 首先,确认您的项目使用的构建工具。以 Solid 库为例,我们查看
package.json文件来确定使用的是rollup。

- 接下来,我们需要修改
rollup的配置来生成sourcemap。这可以通过修改rollup.config.js文件或在package.json的脚本中添加相应参数来完成。

为了简单起见,我们选择在
package.json 的脚本中添加参数。更新您的 scripts 部分如下:然后直接进行脚本进行打包即可。
- 构建完成后,检查
dist目录,可以看到sourcemap文件已经添加进来了。

查看 solid.js 文件的尾部,也可以看到
sourcemap 文件的映射。
在 Solid 进行调试
接下来,我们就利用编译后的 Solid 文件及其
sourcemap 文件,我们可以开始调试过程。由于 Solid 没有提供现成的案例,我们将自己创建一个。
示例
- 在项目根目录下创建一个
example目录(与dist目录同级)。
- 在
example目录中创建一个index.html文件,内容如下:
/example/index.html
- 使用 Live Server 或其他工具启动一个本地文件服务,以便访问编译后的文件并进行调试。

- 打开浏览器的开发者工具,即可进行调试了。


总结
其实调试很简单,而且它不仅适用于 Solid,也适用于其他框架:
- 利用打包工具生成编译后文件和
sourcemap文件。
- 创建一个测试环境(html 文件),引入编译后文件。
- 启用本地服务器(Live Server),即可在浏览器中访问和调试代码。
参考链接
- 作者:JinSo
- 链接:https://jinso.top/article/6584423b-75f0-43b3-b552-cbcbe1fa27db
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。





.webp?table=block&id=106cee95-0faf-8024-b4d9-cef5935e9f79&t=106cee95-0faf-8024-b4d9-cef5935e9f79&width=800&cache=v2)







