同事報案:Visual Studio 2013不知何時起無法編譯TypeScript,存檔或編譯都不會產生JavaScript檔。嘗試重啟VS2013、Windows依然無法解決,灰心喪志之餘,已經萌生重灌VS2013的念頭。
茶包射手出動。SOP第一步為判斷災難範圍,盡可能將事故現場縮到最小,用最少條件或步驟重現問題,封鎖線的範圍愈小,搜索調查的困難度愈低。
另開一個簡單Web專案,加入Hello World等級的TypeScript,測試編譯功能正常。故排除VS2013 TypeScript完全損壞的可能性,改將問題聚焦到導致TypeScript編譯故障的專案,要找出害VS2013 TypeScript中毒身亡的鬼東西。
依先前的理解,當專案包含TypeScript,Web Essentials會在背後啟動node.js執行編譯作業,負責SCSS、TypeScript、LESS等檔案的編譯工作。當TypeScript編譯有錯,Visual Studio輸出視窗可以看到Something went wrong reaching: httq://127.0.0.1:nnnn/?service=TSLint&source=…之類的訊息,便與背後node.js執行的TypeScript編譯服務有關。我觀察到VS2013只要一開啟問題專案,工作管理員的node.exe會無故消失,服務掛點,之後TypeScript編譯功能停擺也就合情合理。
註:對這段運作細節有興趣的朋友,在C:\Users\your_user_name\AppData\Local\Microsoft\VisualStudio\12.0\Extensions資料夾找到WebEssentials2013.dll,其子資料夾Resources\nodejs\tools裡的檔案可以為你解答所有疑惑,May the force (and source) be with you!
偵辦方向明確,同事回頭檢視最近做的修改,很快找到埋在程式碼裡的炸彈!
有個TypeScript使用了JavaScript "use strict" 嚴格模式,但寫法有誤,將"use strict"放在module內第一列(正確位置應在整個檔案或function內的第一列)還忘了加上分號。就是這個看似不嚴重的錯誤,讓TypeScript編譯服務崩潰~我猜這個罕見的情境組合踩中TsLint node.js程式碼未料想到的邏輯路徑形成Bug,加上缺少容錯防呆,造成程序中止。
以下是精簡示範,將"use strict"後方的分號移除並存檔,node.exe瞬間消失,下方輸出視窗則出現錯誤訊息。
移除無效"use strict"寫法,問題排除!順手把這個大概不會有其他人踩到的Bug回報到Web Essential Github,結案。