【茶包射手日記】奇妙的TypeScript編譯Bug

同事報案: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,結案。

歡迎推文分享:
Published 04 February 2015 10:23 PM 由 Jeffrey
Filed under: ,
Views: 3,723



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<February 2015>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication