2014-12-11 40 views
1

如果源和目標完全相同,如何生成源映射? 一種可能的方式是寫映射文件中的每一個字符,像如何生成1比1的源圖?

x in source == x in target 

它的工作原理,但由此產生的源地圖的大小是巨大的。有沒有更好的方法來做到這一點?

P.S.

爲什麼我需要這樣一個奇怪的東西?因爲我需要加入多個源地圖(批處理)。

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

在發展,我們不使用minifications(所以有對JS文件沒有初始源圖),但仍使用批,我需要源地圖(1to1將被罰款)生產批次源地圖(我使用特殊處理器後處理源映射,爲批源映射設置正確的偏移等,但它需要一個源映射來開始)。

+0

你用什麼來製作源地圖?你有沒有試過這個:https://github.com/mozilla/source-map/?我希望它比在這種情況下生成一個巨大的源圖更明智。 – bcr 2015-02-06 18:00:49

+0

我通過爲每行生成1to1來解決它,而不是爲每個符號生成。 – 2015-02-13 06:37:34

回答

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()); 
    
  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); 
    

兩個最後的也是如提供額外的功能用於將多個文件合併在一起。