如何生成1对1源地图?

时间:2014-12-11 01:45:12

标签: source-maps

如果源和目标完全相同,如何生成源地图? 一种可能的方法是为文件中的每个字符编写映射,例如

x in source == x in target

它有效,但生成的源地图大小很大。有没有更好的方法呢?

P.S。

为什么我需要这么奇怪的东西?因为我需要加入多个源地图(批处理)。

a.js -- (possible) transformations --> |
...                                    | -- join --> batch.js.map
x.js -- (possible) transformations --> |

在开发中我们不使用缩小(因此没有JS文件的初始源地图),但仍然使用批次,我需要源地图(1to1会很好)来生成批次的源地图(我发布 - 使用特殊处理器处理源映射,为批处理源映射等设置正确的偏移量,但它需要以源映射开始)。

1 个答案:

答案 0 :(得分:1)

有几种方法可以创建身份源地图:

  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());
    
  2. 然后有更通用的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));
    
  3. 为了获得最大的灵活性,您可以使用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);
    
  4. 最后两个还提供了额外的功能,例如用于合并多个文件。