0

我有寫在TypeScript中的依賴項。依賴包括源映射和NPM包中的原始源。如果我在代碼中設置斷點,然後進入依賴關係,它將正確地進入TypeScript而不是編譯的JavaScript。但是,如果我在TypeScript代碼中設置斷點,然後啓動我的應用程序,VSCode會說如何獲取VSCode爲NPM依賴關係加載源映射?

由於未找到生成的代碼(源圖問題?)而忽略了斷點。

如果我設置了一個斷點之後步進到依賴關係中一切正常。

我相信這裏的問題是源地圖是單向的,所以當我在TypeScript源文件中有一個斷點時,它不知道它在JavaScript中的位置(這是通過實際設置斷點節點調試器)。一旦JavaScript文件打開,VSCode就能匹配兩個現在和現在的斷點工作。

所以問題是,我怎樣才能讓這個我的TS斷點從啓動工作,而無需先一步進入文件?依賴是很多文件,並且每次運行都必須重置我的斷點,這是有問題的,尤其是因爲如果我花費太長時間(超過幾秒),我正在調試的特定問題將運行到套接字連接超時。

我想要的是一種告訴TypeScript的方法,「在調試器啓動時解析這些JavaScript文件並同步源映射,以便斷點匹配正確」。

我知道一般功能是可用的,因爲我可以通過TypeScript文件中的斷點成功調試依賴項本身(我是依賴項的維護者)。當它作爲NPM模塊加載時,似乎有些信息會丟失。

+0

我覺得這個混亂是由包的分發s我們的代碼。 在典型的情況下,它不應該。 如果你仔細想想,當你嘗試調試代碼時,這意味着你正在運行代碼。 通過運行代碼,這意味着您正在運行JavaScript代碼而不是TypeScript源代碼(因此您需要源代碼映射)。 通過在源代碼中放置斷點可能無法正常工作,因爲它沒有執行。 執行時(在調試模式下),您正在查看的「源代碼」與源地圖連接,因此它可以工作。 – unional

+0

我確實認爲這樣做不方便,也許VSCode可以做些什麼。 對於這個問題,您是否有更好的IDE經驗? – unional

+0

調試轉換後的源代碼,特別是如果原始源使用承諾並轉發到ES5時,可能是絕對的地獄。當你用C/C++編寫你的代碼時,它和調試彙編指令一樣有效。在大多數語言中,分佈式二進制文件是編譯好的,但調試工具經常(總是?)支持將源代碼與二進制文件一起分發以使其調試是理智的。這對於C#和Java以及一些C/C++工作是正確的。我懷疑Go和Rust也是一樣的? –

回答

1

這正是launch.json文件中outFiles屬性的用途 - 將其設置爲包含節點模塊(以及您自己的代碼)中的JavaScript文件的glob模式。調試適配器將查看這些文件的源映射引用,以便它可以立即解析TS文件中的斷點。

例子:

"outFiles": [ "${workspaceRoot}/myOutFiles/**/*.js", "${workspaceRoot}/node_modules/**/*.js" ]

如果你知道只是選擇一套包括sourcemaps節點模塊,可以改善這種性能:

"outFiles": [ "${workspaceRoot}/node_modules/{module_a,module_b}/**/*.js" ]

從這個問題: https://github.com/Microsoft/vscode-node-debug/issues/82#issuecomment-290642560

+0

這工作。你介意更新答案以包含細節,而不僅僅是鏈接出來,所以它保留在堆棧溢出(按規則)?特別是,關於如何在launch.json的'outFiles'中包含'node_modules'的說明對未來的讀者會有價值。大多隻是從GitHub問題複製/粘貼。 :)當你編輯過的時候在這裏留下評論,我會接受答案。 –

+1

好點,完成 –