如果源和目标完全相同,如何生成源地图? 一种可能的方法是为文件中的每个字符编写映射,例如
x in source == x in target
它有效,但生成的源地图大小很大。有没有更好的方法呢?
P.S。
为什么我需要这么奇怪的东西?因为我需要加入多个源地图(批处理)。
a.js -- (possible) transformations --> |
... | -- join --> batch.js.map
x.js -- (possible) transformations --> |
在开发中我们不使用缩小(因此没有JS文件的初始源地图),但仍然使用批次,我需要源地图(1to1会很好)来生成批次的源地图(我发布 - 使用特殊处理器处理源映射,为批处理源映射等设置正确的偏移量,但它需要以源映射开始)。
答案 0 :(得分:1)
有几种方法可以创建身份源地图:
您可以使用generate-source-map package。它仅适用于javascript文件;它解析它们并为每个javascript令牌生成一个映射(运算符,标识符等)。最优质的地图,但代价是生成时间和地图大小。
var generate = require('generate-source-map');
var fs = require('fs');
var file = 'test.js';
var map = generate({
source: fs.readFileSync(file),
sourceFile: file
});
fs.writeFileSync(file + '.map', map.toString());
然后有更通用的source-list-map。它适用于任何文本文件并生成1对1行映射。不太详细,可能更快,更小的地图。
var SourceListMap = require('source-list-map').SourceListMap;
var fs = require('fs');
var file = 'test.js';
var sourceListMap = new SourceListMap();
var fileContents = fs.readFileSync(file).toString();
sourceListMap.add(fileContents, file, fileContents);
var map = sourceListMap.toStringWithSourceMap({ file: file });
fs.writeFileSync(file + '.map', JSON.stringify(map));
为了获得最大的灵活性,您可以使用source-map包并自行分割:
var sourceMap = require('source-map');
var sourceMapResolve = require('source-map-resolve');
var fs = require('fs');
var file = 'test.js';
var fileContents = fs.readFileSync(file).toString();
var chunks = [];
var line = 1;
fileContents.match(/^[^\r\n]*(?:\r\n?|\n?)/mg).forEach(function(token) {
if (!/^\s*$/.test(token)) {
chunks.push(new sourceMap.SourceNode(line, 0, file, token));
}
++line;
});
var node = new sourceMap.SourceNode(null, null, null, chunks);
node.setSourceContent(file, fileContents);
var result = node.toStringWithSourceMap({file: file});
fs.writeFileSync(file + '.map', result.map);
最后两个还提供了额外的功能,例如用于合并多个文件。