Chrome開(kāi)發(fā)工具 調(diào)試 JavaScript 腳本

2018-03-01 18:49 更新

調(diào)試 JavaScript 腳本

隨著 JavaScript 應(yīng)用的復(fù)雜性逐漸提高,開(kāi)發(fā)者需要有力的調(diào)試工具來(lái)幫助他們快速發(fā)現(xiàn)問(wèn)題的原因,并且能高效地修復(fù)它。Chrome DevTools 提供了一系列實(shí)用的工具使得調(diào)試 JavaScript 應(yīng)用不再是一件痛苦的事。

在這個(gè)部分,我們會(huì)通過(guò)調(diào)試 Google Closure hovercard demo 以及其他的動(dòng)態(tài)示例來(lái)讓你了解怎么去使用這些工具。

注意:如果你是 Web 開(kāi)發(fā)者并且希望獲得最新版的 DevTools,你應(yīng)該使用 Chrome Canary

源面板

源面板允許你調(diào)試 JavaScript 代碼。它提供了 V8 調(diào)試器的圖形化接口。請(qǐng)通過(guò)以下步驟來(lái)使用源面板:

  • 打開(kāi)一個(gè)站點(diǎn),比如 Google Closure hovercard demo page 或者 TodoMVC 的應(yīng)用程序。
  • 打開(kāi) DevTools 窗口。
  • 如果沒(méi)有選中 Sources,則手動(dòng)選中。

javascript-debugging-overview

源面板允許你查看正在瀏覽的頁(yè)面上所有的腳本。面板底部的圖標(biāo)按鈕分別提供了標(biāo)準(zhǔn)的暫停、恢復(fù)以及逐條語(yǔ)句運(yùn)行等操作。窗口底部還有一個(gè)按鈕,在出現(xiàn)異常時(shí)可以強(qiáng)制暫停。在不同選項(xiàng)卡中,Sources 都是可見(jiàn)的,而且只要點(diǎn)擊 show-file-navigator 就可以打開(kāi)文件定位并且顯示全部腳本。

執(zhí)行控制

執(zhí)行控制相關(guān)的按鈕就在側(cè)面板的頂端,它們使得你能夠單步執(zhí)行代碼??捎玫陌粹o有:

  • continue Continue:繼續(xù)執(zhí)行代碼,直至遇到另一個(gè)斷點(diǎn)。
  • step-over Step over(逐語(yǔ)句):逐行執(zhí)行,以了解每一行如何操作當(dāng)前的變量。當(dāng)你的代碼調(diào)用另一個(gè)函數(shù)的時(shí)候,調(diào)試器不會(huì)跳到那個(gè)函數(shù)的代碼中去,其焦點(diǎn)還是當(dāng)前的函數(shù),而 Step into 則相反。
  • step-into Step into(逐過(guò)程):和逐語(yǔ)句類(lèi)似,但是點(diǎn)擊逐過(guò)程會(huì)在函數(shù)調(diào)用時(shí),令調(diào)試器將執(zhí)行轉(zhuǎn)到所調(diào)用的函數(shù)聲明中去。
  • step-out Step out:當(dāng)使用逐過(guò)程進(jìn)入某個(gè)函數(shù)內(nèi)部后,點(diǎn)擊該按鈕會(huì)跳過(guò)該函數(shù)聲明的剩余部分,調(diào)試器會(huì)將執(zhí)行過(guò)程移動(dòng)到其父函數(shù)中。
  • tonggle breakpoint Toggle breakpoints:切換斷點(diǎn)啟用、禁用狀態(tài),同時(shí)保證各自的啟用狀態(tài)不會(huì)受到影響。

在源面板中,有許多相關(guān)的快捷鍵可用:

  • Continue:在Mac上使用 F8 或者 Command + \,其他平臺(tái)上為 Ctrl+ \。
  • Step over:在Mac上為 F10 或者 Command + ',在其他平臺(tái)上為 Ctrl + '。
  • Step into:在Mac上為 F11 或者 Command + ;,在其他平臺(tái)上為 Ctrl + ;。
  • Step out:在Mac上為 Shift + F11 或者 Shift + Command + ;,在其他平臺(tái)上為 Shift+ Ctrl + ;。
  • Next call frame:Ctrl + .。(適用于全平臺(tái))
  • Previous call frame: Ctrl + ,。(適用于全平臺(tái))

如果想要查看其他支持的快捷鍵,請(qǐng)參考 Shortcuts。

使用斷點(diǎn)來(lái)調(diào)試

斷點(diǎn)是在腳本中處于某種目的而停止或者暫停代碼運(yùn)行的地方。在 DevTools 中使用斷點(diǎn)可以調(diào)試 JavaScript 代碼, DOM 更新以及網(wǎng)絡(luò)調(diào)用。

添加及刪除斷點(diǎn)

源面板中,打開(kāi)一份 JavaScript 文件用于調(diào)試。在下面的例子中,我們調(diào)試了來(lái)自 AngularJS version of TodoMVC 中的 todoCtrl.js 文件。

sources-select-todoCtrl-js

點(diǎn)擊行號(hào)前的空格來(lái)在那一行設(shè)置斷點(diǎn)。之后一個(gè)藍(lán)色的標(biāo)記將會(huì)出現(xiàn),這說(shuō)明斷點(diǎn)已經(jīng)被設(shè)置好了:

sources-view-region

你可以添加多個(gè)斷點(diǎn)。點(diǎn)擊其他行行號(hào)前的空格就可以繼續(xù)設(shè)置斷點(diǎn),你所設(shè)置的全部斷點(diǎn)都會(huì)在右邊的側(cè)欄下 Breakpoints 選項(xiàng)中顯示出來(lái)。

斷點(diǎn)前的復(fù)選框可以選擇是否啟用斷點(diǎn),如果斷點(diǎn)被禁用了,那么藍(lán)色的標(biāo)簽會(huì)變色。

點(diǎn)擊斷點(diǎn)的入口可以跳轉(zhuǎn)到源文件中的對(duì)應(yīng)行:

multiple-breakpoints-region

點(diǎn)擊藍(lán)色的標(biāo)簽可以刪除斷點(diǎn)。

右擊藍(lán)色標(biāo)簽會(huì)打開(kāi)一個(gè)菜單,其中包括:Continue to Here,Remove Breakpoint,Edit Breakpoint 以及 Disable Breakpoint。

continue-to-here-region

想要設(shè)置條件斷點(diǎn),選擇 Edit Breakpoint ,或者,右鍵點(diǎn)擊行號(hào)前的空白然后選擇 Add Conditional Breakpoint。在輸入域中,可以輸入任何能夠返回 true 或者 false 的表達(dá)式。當(dāng)條件返回 true 的時(shí)候,斷點(diǎn)會(huì)中斷代碼的執(zhí)行。

conditional-breakpoint-region

在你想要分析循環(huán)或者經(jīng)常觸發(fā)的回調(diào)事件的代碼時(shí),條件斷點(diǎn)是非常有用的。

注意:有時(shí)候你可能不需要從 DevTools 接口來(lái)設(shè)置斷點(diǎn)。此時(shí)你希望從代碼中來(lái)啟動(dòng)調(diào)試器,那么你可以使用 debugger 關(guān)鍵字來(lái)實(shí)現(xiàn)這一操作。

使用暫停斷點(diǎn)

當(dāng)你設(shè)置了一個(gè)或多個(gè)斷點(diǎn)的時(shí)候,返回到瀏覽器窗口并且與頁(yè)面進(jìn)行交互。在下面的例子中,我們?cè)?removeTodo() 方法中加入了斷點(diǎn)?,F(xiàn)在任何想要在 TodoMVC 應(yīng)用中刪除 todo 選項(xiàng)的行為都將觸發(fā)斷點(diǎn):

breakpoint-paused-app

要恢復(fù)代碼的運(yùn)行,在 DevTools 窗口中點(diǎn)擊 Continue continue 按鈕或者使用 F8 鍵盤(pán)快捷鍵。

當(dāng)腳本暫停運(yùn)行的時(shí)候,你可以使用右邊側(cè)欄中的 Watch Expressinos, Call Stack 以及 Scope Variables 面板。

調(diào)用棧面板

調(diào)用棧面板展示了代碼到暫停處的完整執(zhí)行路徑,這讓我們能夠深入代碼去找出導(dǎo)致錯(cuò)誤的原因。

callstack-region

如果要查看包括計(jì)時(shí)器和 XHR 事件在內(nèi)的異步 JavaScript 回調(diào)函數(shù)的執(zhí)行路徑,請(qǐng)點(diǎn)擊 Async 復(fù)選框。

enable-async-toggle

更多關(guān)于異步調(diào)用棧的信息和示例請(qǐng)參考 HTML5Rocks.com 網(wǎng)頁(yè)上的 Debuggin Asynchtonous JavaScript with Chrome DevTools

將 JavaScript 文件置于黑盒中

當(dāng)你把一個(gè) JavaScript 源文件放到黑盒中時(shí),你在調(diào)試代碼的時(shí)候無(wú)法跳轉(zhuǎn)到那個(gè)文件中了。你可以在你感興趣的代碼嘗試一下。

blackboxing-expanded

你可以使用設(shè)置面板來(lái)將腳本文件放入黑盒,或者右鍵點(diǎn)擊 sources 面板中的文件然后選擇 Blackbox Script。

blackboxing-dialog

更多關(guān)于黑盒的信息請(qǐng)參考 Blackboxing JavaScript file

控制臺(tái)

DevTools 中的 consle drawer 允許你在調(diào)試器當(dāng)前暫停的位置附近進(jìn)行試驗(yàn)。點(diǎn)擊 Esc 鍵在視圖中打開(kāi)控制臺(tái),再次按 Esc 鍵就會(huì)關(guān)閉該控制臺(tái)。

console

動(dòng)態(tài) JavaScript 中的斷點(diǎn)

  • Load dynamic script
  • 在 Sources 面板中腳本的下拉選項(xiàng)中找到 "dynamicScript.js" 然后在第二行設(shè)置斷點(diǎn)。
  • Call function from dynamic script
  • 此時(shí)程序應(yīng)該在斷點(diǎn)處暫停
  • 在 DevTools 窗口中點(diǎn)擊 Continue continue 或者按 F8 來(lái)繼續(xù)執(zhí)行

dynamic-script

提示:注意 dynamicScript.js 文件結(jié)尾處的 "//# sourceURL=dynamicScript.js" 這一行。這種方式可以給由 eval 函數(shù)創(chuàng)建的腳本命名,更多的信息會(huì)在 Source Maps 這一節(jié)中說(shuō)明。只有當(dāng)用戶為動(dòng)態(tài)的 JavaScript 文件提供了名稱(chēng)時(shí)才能為其設(shè)置斷點(diǎn)。

在下一條 JavaScript 語(yǔ)句暫停執(zhí)行

  • 點(diǎn)擊 Pause pause 按鈕
  • 將你的鼠標(biāo)移動(dòng)到下圖中的區(qū)域
  • 你的鼠標(biāo)應(yīng)該停在 onMouseOver 函數(shù)上
  • 點(diǎn)擊 Continue continue 按鈕或者按 F8** 來(lái)繼續(xù)執(zhí)行

continue-to-resume

在出現(xiàn)異常處暫停

  • 點(diǎn)擊窗口底部的 Pause on exceptions pause-gray 按鈕來(lái)切換到在異常處暫停模式
  • 勾選 Pause On Caught Exceptinos 復(fù)選框
  • Raise exception!
  • 程序應(yīng)該在 raiseAndCatchException 函數(shù)中停止
  • 點(diǎn)擊 Continue continue 按鈕或者按 F8 來(lái)繼續(xù)執(zhí)行

append-child

在未捕獲的異常處暫停

  • 點(diǎn)擊 Pause on exceptions pause 按鈕
  • 取消勾選 Pause On Caught Exceptions 復(fù)選框
  • Raise exception!
  • 此時(shí)若捕獲了異常,程序應(yīng)該不會(huì)在 raiseAndCatchExcep 函數(shù)處停止
  • Raise uncaught exception!
  • 此時(shí)應(yīng)該在 raiseException 函數(shù)處停止
  • 點(diǎn)擊 Continue continue 按鈕或者按 F8 來(lái)繼續(xù)執(zhí)行

raise-exception

在 DOM 變化事件上的斷點(diǎn)

  • 右鍵點(diǎn)擊下面的 "Parent Element" 并且從文本菜單中選擇 Inspect Element(審查元素)

    function appendChildButtonClicked() {var parentElement = document.getElementById("parent");var childElement = document.createElement("div");childElement.setAttribute("style", "border: 2px solid; padding: 5px; margin: 5px; text-align: center; width: 120px");childElement.textContent = "Child Element";parentElement.appendChild(childElement);}
    Parent Element
  • 右鍵點(diǎn)擊 Elements 面板元素然后選擇 Break on Subtree Modifications
  • Append child!
  • 此時(shí)應(yīng)該會(huì)在 appendChild 函數(shù)調(diào)用處停止
  • 點(diǎn)擊 Continue continue 按鈕或者按 F8 來(lái)繼續(xù)執(zhí)行

append-child-element

XHR 上的斷點(diǎn)

  • 點(diǎn)擊 Sources面板右側(cè)的 XHR Breakpoints 邊欄上的 Add plus 按鈕
  • 在文本輸入去輸入 "data.txt" 然后單擊回車(chē)
  • Retrieve data.txt by XHR
  • 此時(shí)應(yīng)該在send 函數(shù)調(diào)用處停止
  • 右鍵點(diǎn)擊新創(chuàng)建的斷點(diǎn)然后選擇 Remove Breakpoint
  • 點(diǎn)擊Devtools 窗口中的 Continue continue 按鈕或者按 F8 來(lái)繼續(xù)執(zhí)行

request-send

提示:要編輯 URL 過(guò)濾器,雙擊 XHR Breakpoints 邊欄的 XBR 斷點(diǎn),具有空的 URL 過(guò)濾器的 XHR 斷點(diǎn)會(huì)匹配任何 XHR。

JavaScript 事件監(jiān)聽(tīng)器上的斷點(diǎn)

  • 打開(kāi)右邊 Scripts 面板的 Event Listener Breakpoints 邊欄
  • 展開(kāi) Mouse 選項(xiàng)
  • 選中 mouseout 前的復(fù)選框可以設(shè)置 mouseout 事件監(jiān)聽(tīng)器斷點(diǎn)

resumed

  • 將你的鼠標(biāo)移動(dòng)到下面的的盒子中
window.addEventListener("load", onLoad, true);function onLoad() { var hovermeElement = document.getElementById("hoverme"); hovermeElement.addEventListener("mouseover", hovermeMouseOver, true); hovermeElement.addEventListener("mouseout", hovermeMouseOut, true);}function hovermeMouseOver(event) { event.target.style.backgroundColor = "grey";}function hovermeMouseOut(event) { event.target.style.backgroundColor = "white";}
Hover me!
  • 此時(shí)應(yīng)該在 mouseout 事件處理器處停止
  • 點(diǎn)擊 Continue continue 按鈕或者按 F8 來(lái)繼續(xù)執(zhí)行

continue-to-resume-1

提示:下列事件是支持的
 Keyboard:松開(kāi)按鍵,按下按鍵,輸入文字
 Mouse:點(diǎn)擊,雙擊,鼠標(biāo)鍵按下,鼠標(biāo)鍵松開(kāi),鼠標(biāo)懸浮,鼠標(biāo)移動(dòng),鼠標(biāo)從元素上離開(kāi)。
 Control:重新設(shè)置大小,滾動(dòng),縮放,焦點(diǎn),失焦,選擇,變化,重置 Clipboard:復(fù)制,剪切,粘貼,beforecopy,beforecut,beforepaste Load:加載,卸載,廢除,出錯(cuò)。 DOM Mutation:DOMActivate,DOMFocusin,DOMAttrModified,DOMCharacterDataModified,DOMNodeInserted,DOMNodeInsertedIntoDocument,DOMNodeRemoved,DOMNodeRemovedFromDocument,DOMSubtreeModified,DOMContentLoaded Device:面向設(shè)備,設(shè)備運(yùn)動(dòng)。

長(zhǎng)按恢復(fù)執(zhí)行

當(dāng)暫停的時(shí)候,點(diǎn)擊并且不放開(kāi)恢復(fù)按鈕可以讓 ”所有的暫停都阻塞 500 毫秒后恢復(fù)“。這會(huì)讓所有的斷點(diǎn)在半秒內(nèi)都無(wú)法使用,可以使用該方法進(jìn)入到下一個(gè)循環(huán)中,這樣就可以避免為了退出循環(huán)而不斷讓斷點(diǎn)繼續(xù)執(zhí)行。

專(zhuān)業(yè)建議:當(dāng)使用 DevTools 啟動(dòng)“刷新”的時(shí)候(焦點(diǎn)在 DevTools 的時(shí)候使用 Ctrl + R),全部暫停都會(huì)被禁用,直到新的頁(yè)面開(kāi)始加載(或者作為備用方案,直到用戶按下 “Pause” 按鈕)。然而,如果你從瀏覽器的按鈕來(lái)啟動(dòng)刷新操作的時(shí)候(或者當(dāng)焦點(diǎn)在 DevTools 之外的時(shí)候使用 Ctrl + R),將會(huì)命中所有剩余的斷點(diǎn)。這實(shí)際上可對(duì)那些對(duì)頁(yè)面卸載過(guò)程感興趣的人非常有用。

long-resume

實(shí)時(shí)編輯

創(chuàng)作和工作流章節(jié)中,我們討論了怎么通過(guò) Source 面板來(lái)對(duì)腳本進(jìn)行修改。在斷點(diǎn)處,同樣也可以通過(guò)點(diǎn)擊主編輯面板來(lái)做出修改,并且能夠?qū)崟r(shí)修改腳本文件。

  • 定位到 Google Closure hovercard demo
  • 在源面板中,打開(kāi) “mouse.js” 然后使用 Ctrl/Cmd + Shift + O 來(lái)定位到 onMouseOut() 函數(shù)

houseMouseOut

  • 點(diǎn)擊暫停按鈕來(lái)暫停調(diào)試
  • 修改函數(shù),在末尾加入 console.log('Moused out')
  • 使用 Cmd + S 或者 Ctrl + S 快捷鍵可以保存更改,記得確認(rèn)是否保存
  • 點(diǎn)擊 pause/resume 按鈕來(lái)恢復(fù)執(zhí)行
  • 當(dāng)你的鼠標(biāo)離開(kāi)相關(guān)位置的時(shí)候,控制臺(tái)會(huì)輸出信息

pause-resume-mouseout

這允許你在不退出瀏覽器的情況下通過(guò)使用 DevTools 來(lái)保存修改的內(nèi)容。

異常

讓我們現(xiàn)在來(lái)看一下怎么處理異常以及如何利用 Chrome 的 DevTools 使用堆棧追蹤。異常處理是對(duì)于出現(xiàn)的異常的響應(yīng) - 除了有些需要特定處理過(guò)程的情況 - 并且一般會(huì)改變 JavaScript 代碼執(zhí)行的正常流程。

注意:如果是 Web 開(kāi)發(fā)者并且希望獲得最新版的 DevTools,你需要使用 Chrome Canary

追蹤異常

當(dāng)程序出現(xiàn)異常的時(shí)候,你可以打開(kāi) DevTools 控制臺(tái)(Ctrl + Shift + J/Cmd + Option + J),然后你會(huì)發(fā)現(xiàn)有許多 JavaScript 出錯(cuò)信息。每條信息都指出了相應(yīng)的文件名以及行號(hào),你可以通過(guò)這些信息來(lái)定位到源代碼中的相關(guān)位置。

tracking-exceptions

查看異常追蹤棧

導(dǎo)致出錯(cuò)的執(zhí)行路徑可能會(huì)有多條,并且究竟是哪一條出現(xiàn)了錯(cuò)誤并不明顯。只要 DevTools 窗口是打開(kāi)的,控制臺(tái)中出現(xiàn)的異常狀況都會(huì)伴隨著完整的 JavaScript 調(diào)用堆棧而出現(xiàn)。你可以展開(kāi)這些控制臺(tái)信息來(lái)查看堆棧信息并定位到代碼中的相應(yīng)位置:

exception-stack-trace

在 JavaScript 出現(xiàn)異常時(shí)暫停

你可能希望下一次 JavaScript 發(fā)生異常的時(shí)候能夠暫停 JavaScript 的執(zhí)行并查看它的調(diào)用堆棧、范圍變量以及應(yīng)用程序的狀態(tài)。Script 面板底部的暫停按鈕(pause-gray-1)允許你在不同的異常處模式之間切換,且該按鈕具有三種狀態(tài):你可以選擇在所有的異常發(fā)生時(shí)都暫停程序運(yùn)行或者只是在未捕獲的異常發(fā)生時(shí)暫停程序運(yùn)行或者是忽視所有的異常。

pause-execution

打印堆棧信息

在 DevTools 中輸出的日志信息對(duì)于理解應(yīng)用程序的執(zhí)行過(guò)程非常有幫助,你可以在日志信息中包括相關(guān)聯(lián)的堆棧跟蹤信息來(lái)使它更加有用。想要做到這一點(diǎn)有多種方式。

Error.stack

每個(gè) Error 對(duì)象都有一個(gè)名為 stack 的字符串屬性,該字符串包含了堆棧跟蹤信息:

error-stack

console.trace()

你可以使用 concole.trace() 方法來(lái)輸出當(dāng)前 JavaScript 調(diào)用堆棧,這種方法可以用于檢測(cè)代碼:

console-trace

console.assert()

將 assertion 加入到你的代碼中也是一種不錯(cuò)的方法。只要調(diào)用 console.assert() 方法并將錯(cuò)誤情況作為第一個(gè)參數(shù)即可,每當(dāng)表達(dá)式的計(jì)算結(jié)果為 false 時(shí)你就會(huì)看到相應(yīng)的控制臺(tái)記錄:

console-assert

在運(yùn)行時(shí)使用 window.onerror 來(lái)處理異常

Chrome 支持將一個(gè)處理函數(shù)設(shè)置為 window.onerror。每當(dāng)一個(gè) JavaScript 異常在窗口上下文中拋出并且沒(méi)有被任何的 try/catch 塊捕獲的時(shí)候,該方法就會(huì)被調(diào)用。同時(shí),異常信息、拋出異常的文件 URL 以及出現(xiàn)異常的位置在文件中的行號(hào)會(huì)按照上面的順序作為三個(gè)參數(shù)傳給該方法。你可能覺(jué)得像這樣設(shè)置一個(gè)能夠收集未捕獲異常信息并且能將其報(bào)告給服務(wù)器的錯(cuò)誤處理器非常方便。

window-

美化輸出格式

如果你在閱讀以及調(diào)試某些過(guò)于簡(jiǎn)化的 JavaScript 代碼有麻煩的時(shí)候,有一個(gè)美化輸出格式的選項(xiàng)可以讓這些過(guò)程更輕松。下面是一份簡(jiǎn)化過(guò)頭的腳本文件在 DevTools 中可能顯示出的樣子:

pretty-print-off

如果點(diǎn)擊左邊底部的花括號(hào) prettyprint-icon 圖標(biāo),該 JavaScript 就會(huì)轉(zhuǎn)換為更具可讀性的格式。這種格式對(duì)調(diào)試和設(shè)置斷點(diǎn)也相當(dāng)方便。

pretty-print-on

源映射(Source Maps)

你是否期望過(guò)你的客戶端代碼能夠保持可讀性并且適合調(diào)試,甚至是你在合并以及縮小代碼之后也能這樣嗎?那么,現(xiàn)在你可以感受源映射的魔力了。

一個(gè)基于 JSON 格式的源映射創(chuàng)建了一種縮小后的代碼和源代碼之間的關(guān)系。

下面一種簡(jiǎn)單的源映射的示例:


  {
    version : 3,
    file: "out.min.js",
    sourceRoot : "",
    sources: ["foo.js", "bar.js"],
    names: ["src", "maps", "are", "fun"],
    mappings: "AAgBC,SAAQ,CAAEA"
  }

源映射是指,當(dāng)你為了構(gòu)建產(chǎn)品而縮小及合并 JavaScript 文件的時(shí)候,產(chǎn)生擁有源文件信息的一種映射。源映射會(huì)讓 DevTools 去加載你的源文件,而不是縮小后的文件。于是你可以使用源文件來(lái)設(shè)置斷點(diǎn)以及調(diào)試代碼。同時(shí),Chrome 實(shí)際運(yùn)行的是縮小后的代碼。這就讓你感覺(jué)像是在運(yùn)行源文件一般。

使用源映射

使用正確的縮小器

你需要使用能夠創(chuàng)建源映射的縮小器來(lái)縮小你的代碼。Closure 編譯器以及 UglifyJS 2.0 就是兩款這樣的工具,當(dāng)然,也有其他的很多支持 CoffeeScript, SASS 等源映射的工具。具體可以參考維基百科的頁(yè)面 Source maps: languages, tools and other info。

設(shè)置 DevTools

默認(rèn)情況下,資源映射(Sourcemap)是啟用的(Chrome 39 就是這樣),如果你想仔細(xì)檢查或者單獨(dú)啟用它,先打開(kāi) DevTools 然后點(diǎn)擊設(shè)置圖標(biāo) gear。在 Sources 選項(xiàng)下,查看 Enable javaScript source maps。你也可以檢查 Enable CSS source maps,不過(guò)在這個(gè)例子中你并不需要這么做。

source-maps

讓源映射(Source Map)可訪問(wèn)

如果要讓 DevTools 知道某個(gè)源映射是可用的,請(qǐng)驗(yàn)證縮小后的文件最后一行的代碼是不是下面這樣。

//# sourceMappingURL=/path/to/file.js.map

這一行通常是由生成映射的工具添加的,并且能夠讓 DevTools 建立縮小后的文件和源文件之間的聯(lián)系。在 CSS 中,這一行可能是這樣的: /# sourceMappingURL=style.css.map /.

如果你不希望文件中有額外的注釋?zhuān)憧梢允褂?JavaScript 文件中的 HTTP 頭來(lái)告訴 DevTools 源文件在哪里。這需要設(shè)置或者自定義 web 服務(wù)器,并且該內(nèi)容超出了本篇教程的目標(biāo)。

X-SourceMap: /path/to/file.js.map

和注釋類(lèi)似,該代碼同樣告訴 DevTools 到哪里去尋找源文件并和相應(yīng) JavaScript 文件建立關(guān)聯(lián)。這個(gè)頭部信息也用于解決引用源映射的語(yǔ)言并不支持單行注釋的問(wèn)題。

你也應(yīng)該檢查你的 web 服務(wù)器是否設(shè)置好了對(duì)資源映射的支持。有些服務(wù)器,需要對(duì)每種文件都做出明確的配置,比如 Google App Engine。在這種情況下,你的源映射應(yīng)該設(shè)置將 MIME 類(lèi)型設(shè)置為 application/json,不過(guò) Chrome 瀏覽器會(huì)接受任何類(lèi)型的類(lèi)容聲明,比如 application/octet-stream

請(qǐng)看一下 Chrome 中特別構(gòu)建的 font dragr tool,當(dāng)源映射啟用的時(shí)候,你將會(huì)注意到 JavaScript 文件并沒(méi)有被編譯,并且你可以看到所有被引用的 JavaScript 文件。這使用了源映射,但是后臺(tái)實(shí)際運(yùn)行的是編譯后的代碼。任何的錯(cuò)誤、日志以及斷點(diǎn)都會(huì)映射到開(kāi)發(fā)代碼中,這使得調(diào)試變得更為容易。實(shí)際上你的感覺(jué)就像是你在運(yùn)行開(kāi)發(fā)中的代碼一樣。

活動(dòng)中的 @sourceURL 以及 displayName

源映射聲明的下列部分,并不會(huì)令你在使用 evals 函數(shù)來(lái)開(kāi)發(fā)時(shí)有多輕松。

這個(gè)幫助器(@sourceURL)看起來(lái)類(lèi)似于 //# sourceMappingURL 屬性,并且實(shí)際上是在源映射 V3 規(guī)范中提及的。在你的代碼中包含下面這些特殊的注釋?zhuān)憧梢詾?eval 函數(shù)及內(nèi)嵌的腳本和樣式命名,這樣他們?cè)谀愕拈_(kāi)發(fā)工具中顯示的時(shí)候就可以擁有邏輯名稱(chēng)。

//# sourceURL=source.coffee

使用 sourceURL

  • 定位到 demo
  • 打開(kāi) DevTools 并找到 Sources 面板
  • 輸入一個(gè)名稱(chēng)來(lái)為你的代碼命名
  • 點(diǎn)擊 compile 按鈕
  • CoffeeScript 源文件會(huì)計(jì)算總值并且通過(guò)警告來(lái)輸出
  • 如果你打開(kāi) Sources 的子面板,你將會(huì)看到一個(gè)擁有你之前輸入的文件名的新文件。如果你雙擊該文件來(lái)查看詳細(xì)內(nèi)容,會(huì)發(fā)現(xiàn)該文件中含有初始源文件編譯后的 JavaScript。在最后一行會(huì)有 // @sourceURL 注釋?zhuān)撟⑨尡砻髁嗽次募鞘裁?。這在通過(guò)語(yǔ)言抽象來(lái)調(diào)試時(shí)具有很大的幫助。

coffeescript

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)