SourceMap文件内部的mappings属性怎么利用VLQ编码将编译后坐标映射回原文件

舞姬之光

舞姬之光

2026-07-26

938人浏览

原创

mappings 是 sourcemap 最核心字段,采用 base64-vlq 编码的增量坐标流:以分号分隔行、逗号分隔段,每段最多 5 个 vlq 值,依次表示生成列偏移、源文件索引、源行偏移、源列偏移、名称索引(可选),所有坐标均从 0 开始,通过累加差值精准还原原始位置。

sourcemap文件内部的mappings属性怎么利用vlq编码将编译后坐标映射回原文件

mappings 是 SourceMap 文件中最核心的字段,它用一串紧凑的 Base64-VLQ 编码字符串,把编译后(生成)代码中的每个可调试位置,精确映射回原始源码的行列和变量名。这个过程不是靠“猜”,而是靠差值编码 + 逐段解码 + 累加还原

下面直接讲清楚它是怎么利用 VLQ 实现映射的:

mappings 的结构本质是“增量坐标流”

mappings 不是直接存绝对位置,而是按生成代码的行 → 列顺序,记录每一段映射关系的相对变化量(delta)。每一行以 ; 分隔,每行内用 , 分隔多个 mapping 段;每个段对应生成代码中一个 token(如变量、关键字、操作符)在源码中的归属。

例如:
"mappings":"AAAA,IACE,MAAMA,EAAMC,MAAQ,EACtB,CAAE,MAAOC,GACPC,QAAQC,IAAIF"
→ 第 0 行有 1 段 AAAA,第 1 行有 11 段,以此类推。

每段最多含 5 个 VLQ 编码数,依次表示:

  • 生成列偏移(相对于上一个 mapping 的列号,首段从 0 开始)
  • 源文件索引(在 sources 数组中的下标,如 sources: ["a.js", "b.ts"],则 0a.js
  • 源行号偏移(相对于上一个 mapping 所在源行,首段从 0 开始)
  • 源列偏移(相对于上一个 mapping 所在源列,首段从 0 开始)
  • 名称索引(在 names 数组中的下标,如 names: ["sum", "count"]0 对应 "sum";可省略)

注意:所有行列号在 SourceMap 规范中均从 0 开始计数(尽管浏览器控制台显示为 1-based,那是 UI 层转换)。

VLQ 编码如何压缩这些整数?

VLQ(Variable Length Quantity)是一种变长整数编码,专为小差值优化设计。它把一个有符号整数拆成若干 6-bit 组(Base64 字符),每组最高位(bit 5)作 continuation flag:

  • 若该字节的最高位为 1,说明还有下一个字节参与编码;
  • 最低位 bit 0 用于符号位(1 表示负数,0 表示正数);
  • 其余 5 位(bit 1–5)是有效数据位。

Base64 字符表(64 个):
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

例如 VLQ 字符 'A' → ASCII 65 → 二进制 1000001 → 取低 6 位 000001 = 1,且 continuation 位为 0 → 解码为 1
字符 'I' → ASCII 73 → 1001001 → 低 6 位 001001 = 9,continuation 位 09
字符 'S' → ASCII 83 → 1010011 → 低 6 位 100011 = 35?不对——实际查表得 'S' 是第 18 个(0-indexed),即 18,再按 VLQ 规则反推其代表的数值。

关键点在于:VLQ 解码必须按字节顺序读取,每次取 6 位,忽略 continuation 位,最后拼接并恢复符号

ApiPost接口调试与文档生成工具
ApiPost接口调试与文档生成工具

ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键

下载

举个真实片段还原例子

mappings 中一段:"IACE"
→ 拆成 4 个 VLQ:I, A, C, E

查 Base64 索引(A=0, B=1, ..., I=8, A=0, C=2, E=4):
[8, 0, 2, 4]

按 VLQ 解码规则(已知均为单字节、无 continuation):

  • 8 → 正数(最低位为 0),值 = 8 >> 1 = 4
  • 00 >> 1 = 0
  • 22 >> 1 = 1
  • 44 >> 1 = 2

所以 IACE 对应 [4, 0, 1, 2],含义是:

  • 生成代码当前 token 距上一个 mapping 的列偏移:+4
  • 属于 sources[0](第一个源文件)
  • 源码行号比上一个 mapping 多 +1 行
  • 源码列号比上一个 mapping 多 +2 列

如果这是该行第一个 mapping,且前面没有其他段,则默认生成位置为第 0 行第 0 列,那么它映射到:

  • 生成位置:第 0 行,第 4 列
  • 源位置:sources[0] 的第 1 行(0+1)、第 2 列(0+2)

浏览器或调试器怎么用它?

当 Chrome 在压缩代码第 0 行第 4 列抛出错误时:

  1. 它定位到 mappings 第 0 行(AAAA,IACE,... 这部分);
  2. 逐个解码 mapping 段,累加列偏移直到覆盖目标列(这里是第 2 段 IACE,累计列达 4);
  3. 根据 sources[0] 和解出的源行列(1,2),从 sourcesContent[0] 或网络加载的 sources[0] 中取出对应位置的原始代码;
  4. 把那一片源码高亮展示在 DevTools 的 Sources 面板里,完成“所见即所写”。

整个过程不依赖源码内容比对,纯靠坐标映射,因此即使变量名被混淆(如 sumo),只要 names 字段存在且 mapping 包含第 5 项,也能还原变量语义。

不复杂但容易忽略的是:所有 delta 都是累积式相对值,不是独立坐标。解码必须严格按顺序、维护上下文状态(上一个生成列、上一个源行列),跳段或乱序就会完全错位。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

vite

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2364

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

717

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

2181

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

637

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1166

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

2087

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

2367

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

1476

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

499

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习