我非常习惯跨浏览器 Web API 拥有由标准机构拥有的规范文档,例如W3C 的 WebRTC 规范,或 Khronos 的 WebGL 规范。
另一个 Web API 是“Source Maps”,在本文中进行了非正式描述,并在 Chrome、Firefox 和其他地方实现。
但是,这个API/功能似乎没有权威规范!所有文章/实现都只是链接到这个 Google 文档 URL,其中仅显示“我们很抱歉。您无法访问此项目,因为它违反了我们的服务条款。”
这个被删除的 Google 文档真的是 Source Maps 的权威来源吗?如果是这样,这个功能是如何逃脱任何合理的标准化过程的?如果没有,权威规范在哪里?
我尝试阅读它,但我无法理解它在说什么。这就像学生写的东西是为了向老师证明他们知道一些东西,但没有为试图学习该东西的人提供解释力。
webpack间接依赖生成神秘
"mappings":";;;AAAA,6BAA+B;..."
的实际代码位于mozilla/source-map github项目:
_serializeMappings() {
let previousGeneratedColumn = 0;
let previousGeneratedLine = 1;
let previousOriginalColumn = 0;
let previousOriginalLine = 0;
let previousName = 0;
let previousSource = 0;
let result = "";
let next;
let mapping;
let nameIdx;
let sourceIdx;
const mappings = this._mappings.toArray();
for (let i = 0, len = mappings.length; i < len; i++) {
mapping = mappings[i];
next = "";
if (mapping.generatedLine !== previousGeneratedLine) {
previousGeneratedColumn = 0;
while (mapping.generatedLine !== previousGeneratedLine) {
next += ";";
previousGeneratedLine++;
}
} else if (i > 0) {
if (
!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])
) {
continue;
}
next += ",";
}
next += base64VLQ.encode(
mapping.generatedColumn - previousGeneratedColumn
);
previousGeneratedColumn = mapping.generatedColumn;
if (mapping.source != null) {
sourceIdx = this._sources.indexOf(mapping.source);
next += base64VLQ.encode(sourceIdx - previousSource);
previousSource = sourceIdx;
// lines are stored 0-based in SourceMap spec version 3
next += base64VLQ.encode(
mapping.originalLine - 1 - previousOriginalLine
);
previousOriginalLine = mapping.originalLine - 1;
next += base64VLQ.encode(
mapping.originalColumn - previousOriginalColumn
);
previousOriginalColumn = mapping.originalColumn;
if (mapping.name != null) {
nameIdx = this._names.indexOf(mapping.name);
next += base64VLQ.encode(nameIdx - previousName);
previousName = nameIdx;
}
}
result += next;
}
return result;
}