2014-02-11 52 views
22

我已經爲我的web應用程序編寫了兩步編譯過程。首先,我將CoffeeScript文件編譯成JavaScript文件[1]。然後,JavaScript文件(來自CoffeeScript的文件和外部的文件,如從AngularJS模板生成的grunt-angular-templates)由Google Closure Compiler [2]編譯爲單個最小化文件。合併兩個編譯步驟的源映射

CoffeeScript ---[1]---> JavaScript --[2]--\ 
              \-> 
AngularJS templates --> JavaScript ----------> single minimized JS file 
              /-> 
        other JS files -------/ 

步驟[1]和[2]都產生源圖。

是否可以將這些源地圖組合成一個單獨的源地圖,使我可以從運行最小化JS文件的Web瀏覽器調試CoffeeScript文件?

換句話說:讓說源地圖[1]由函數表示:

g(position in JavaScript) = position in minimized JS 

I:

f(position in CoffeeScript) = position in JavaScript 

和源地圖[2]由函數表示'd想要得到由功能組合表示的源地圖:

h(position in CoffeeScript) = g(f(position in CoffeeScript)) = 
          = position in minimized JS 

回答

3

盡我所能從源映射規範(和其它話題),多級映射尚未定義

https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#heading=h.e8hx254xu4sa

源地圖版本3; 多級映射註釋

有人可能已經開發了一些工具來解決這個問題,可能在Github存儲庫中。當然,你有兩種工具可以生成這樣的地圖,以及可以使用它們的瀏覽器。

https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/ https://github.com/fitzgen/source-map

+0

那麼,在我的使用案例中,我並不關心中間文件,它只是一個副產品......無論如何,你的回答至少告訴我,這個想法在技術上是可行的,目前實現源地圖,沒有任何工具可以完全執行此操作。謝謝。 – liori

+0

看起來像'Grunt'可以處理2階段映射,至少在通過'uglify'傳遞單個編譯的'Coffeescript'的情況下 - https://github.com/gruntjs/grunt-contrib-uglify – hpaulj

+1

從側邊欄:http://stackoverflow.com/questions/15964826 – hpaulj

15

嘗試sorcery - 它的設計出於這樣的目的(我是作者,我來到這裏尋找的相關工具的信息)。只要.map文件位於正確的位置(或以數據URI內聯),您只需在生成的文件上運行sorcery,它將找到中間源映射並將其組合。

+0

Hello Rich,could你請提供一些例子來說明如何使用你的工具,例如吞嚥?因爲從github上的文檔來看,它不是很明顯。先謝謝你。 – VladosJS

2

Closure編譯器現在實現了--apply_input_source_maps(和--parse_inline_source_maps引導)。這應該做到你想要達到的目標,不需要額外的工具。

+1

僅當代碼轉換隻有兩個階段時才需要額外的工具。 – liori

+0

@liori是的,沒有工具需要在這個問題中描述的設置。但通常,只要所有工具都保持所有源代碼內聯,並且所有工具都支持閱讀內聯源代碼地圖(我知道不是所有的都可以,但這似乎是一個合理的目標),但這應該是全部工作(tm)。 –

-1

combine-source-map包,一個Mozilla [source-map]包裝看起來像[sorcery]更受歡迎的替代品,如Rich Harris had recommended(2M vs. 32k下載)。

通過產品頁面自己的描述,結合源地圖將:

的多個文件添加源地圖,抵消它們,然後將它們合併爲一個源地圖。

評估合併源 - 圖後,它看起來很有希望,儘管它只能處理基於文件系統的源源的地圖。它在使用內聯源時崩潰(可能是來自閉包編譯器的原始代碼的限制)。通過一些更改,也可以正確處理內聯源。