2014-01-08 148 views
1

我想實現我自己的格式化異常堆棧跟蹤,我知道Error.prepareStackTrace像一個魅力。訪問SourceMaps咖啡

當我通過coffee運行程序使用咖啡腳本時,出現了問題,但未保存中間* .js結果及其源文件映射文件。我想從.coffee文件中顯示正確的行號,而不是編譯後的.js

是否可以通過require在運行時動態加載咖啡腳本的內部運行時sourceMaps(或獲取相同的值)?我知道coffee-script.coffee內部有局部變量sourceMaps = {},它由咖啡腳本編譯器本身使用,但它在模塊閉包之外是不可訪問的。

有什麼想法?

回答

0

這是我在運行simplenested.coffee時得到的堆棧跟蹤,其中包含require 'simpleerror.coffee'。至少在1.6.3中,使用了兩個文件的sourceMaps。在之間是loadFile的行。如果事先編譯了任一文件,相關的框架行將引用Javascript代碼。

2011:~/myjs$ coffee simplenested.coffee 
ReferenceError: x is not defined 
    at foo (/.../simpleerror.coffee:4:7) 
    at Object.<anonymous> (/.../simpleerror.coffee:7:1) 
    at Object.<anonymous> (/.../simpleerror.coffee:2:1) 
    at Module._compile (module.js:456:26) 
    at Object.loadFile (/.../coffee-script/lib/coffee-script/coffee-script.js:182:19) 
    at Module.load (/.../coffee-script/lib/coffee-script/coffee-script.js:211:36) 
    at Function.Module._load (module.js:312:12) 
    at Module.require (module.js:364:17) 
    at require (module.js:380:17) 
    at Object.<anonymous> (/.../simplenested.coffee:2:8) 
    at Object.<anonymous> (/.../simplenested.coffee:1:1) 
    at Module._compile (module.js:456:26) 

simplenest.coffee

require 'coffee-script' 
nested=require './simpleerror' 

simpleerror.coffee

foo =() -> 
    y = 'testing' 
    y = x # expect ReferenceError 
    return y 

foo() 
+0

恐怕它不會幫助,因爲我沒有將咖啡編譯成js來加載和運行它。我試圖訪問正在運行的咖啡腳本的**當前**源地圖(可能通過可能動態評估的幾個「require」)。無論如何,謝謝 – Artazor

+0

使用當前的'coffeescript',它確實在編譯時,'prepareStackTrace'確實使用了適當的'sourceMap'。 – hpaulj

0

是的,你可以使用sourceMap通過要求 「源圖」。

然後你應該得到stackTrace中的filePath,行和列信息進行轉換。

Kevin寫了coffeestack庫。

npm install coffeestack 

用法:

{convertStackTrace} = require 'coffeestack' 

try 
    throw new Error('this is an error') 
catch error 
    console.error(convertStackTrace(error.stack)) 

的更多細節請參閱​​包。