Source Map入門教程

部署前端之前冠场,開發(fā)者通常會對代碼進行打包壓縮,這樣可以減少代碼大小,從而有效提高訪問速度爵政。然而仅讽,壓縮代碼的報錯信息是很難Debug的,因為它的行號和列號已經(jīng)失真钾挟。這時就需要Source Map來還原真實的出錯位置了洁灵。

fundebug-sourcemap.jpg

為啥變換代碼?

前端代碼越來越復(fù)雜的情況下等龙,開發(fā)者通常會使用webpack处渣、UglifyJS2等工具對代碼進行打包變換,這樣可以減少代碼大小蛛砰,有效提高訪問速度罐栈。關(guān)于變換代碼的原因,這里不妨引用一下大神阮一峰JavaScript Source Map 詳解:

  • 壓縮泥畅,減小體積荠诬。比如jQuery 1.9的源碼,壓縮前是252KB位仁,壓縮后是32KB柑贞。
  • 多個文件合并,減少HTTP請求數(shù)聂抢。
  • 其他語言編譯成JavaScript钧嘶。最常見的例子就是CoffeeScript。

如何變換代碼琳疏?

下面是一個簡單的“hello World”程序hello.js

function sayHello()
{
    var name = "Fundebug";
    var greeting = "Hello, " + Name;
    console.log(greeting);
}

sayHello();

使用UglifyJS2對源代碼進行壓縮變換:

uglifyjs hello.js \
         -m toplevel=true \
         -c unused=true,collapse_vars=true \
         -o hello.min.js

壓縮后的代碼hello.min.js

function o(){var o="Hello, "+Name;console.log(o)}o();

為啥需要Source Map?

使用Firefox執(zhí)行hello.js的報錯信息是這樣:

ReferenceError: Name is not defined
    sayHello file:///Users/fundebug/sourcemap-tutorial/hello.js:4:9
    <匿名> file:///Users/fundebug/sourcemap-tutorial/hello.js:8:1

hello.min.js的報錯信息是這樣:

ReferenceError: Name is not defined
    o file:///Users/fundebug/sourcemap-tutorial/hello.min.js:1:18
    <匿名> file:///Users/fundebug/sourcemap-tutorial/hello.min.js:1:59

對比壓縮前后的出錯信息有决,我們會發(fā)現(xiàn),錯誤行號和列號已經(jīng)失真空盼,且函數(shù)名也經(jīng)過了變換书幕。而對于真實的前端項目,開發(fā)者會將數(shù)十個源文件壓縮為一個文件揽趾,這時台汇,錯誤的列號可能多達數(shù)千,且出錯的真實文件名也是很難確定的篱瞎,這樣的話苟呐,壓縮代碼的報錯信息是很難Debug的。

而Source Map則可以用于還原真實的出錯位置俐筋,幫助開發(fā)者更快的Debug掠抬。

什么是Source Map?

使用UglifyJS2時指定source-map選項即可生成Source Map:

uglifyjs hello.js \
         -m toplevel=true \
         -c unused=true,collapse_vars=true \
         --source-map hello.min.js.map \
         --source-map-include-sources \
         --source-map-root \
         -o hello.min.js

各種主流前端任務(wù)管理工具,打包工具都支持生成Source Map校哎,具體可以查看生成Source Map - Fundebug文檔

生成的hello.min.js多了sourceMappingURL,表示Source Map文件的位置闷哆。

function o(){var o="Hello, "+Name;console.log(o)}o();
//# sourceMappingURL=hello.min.js.map

生成的Source Map為hello.min.js.map:

{
    "version": 3,
    "sources": ["hello.js"],
    "names": ["sayHello", "greeting", "Name", "console", "log"],
    "mappings": "AAAA,QAASA,KAEL,GACIC,GAAW,UAAYC,IAC3BC,SAAQC,IAAIH,GAGhBD",
    "file": "hello.min.js",
    "sourceRoot": "",
    "sourcesContent": ["function sayHello()\n{\n    var name = \"Fundebug\";\n    var greeting = \"Hello, \" + Name;\n    console.log(greeting);\n}\n\nsayHello();\n"]
}

hello.min.js.map可知腰奋,Source Map是一個JSON文件,而它包含了代碼轉(zhuǎn)換前后的位置信息抱怔。也就是說劣坊,給定一個轉(zhuǎn)換之后的壓縮代碼的位置,就可以通過Source Map獲取轉(zhuǎn)換之前的代碼位置屈留,反過來也一樣局冰。Source Map各個屬性的含義如下:

  • version:Source Map的版本號。
  • sources:轉(zhuǎn)換前的文件列表灌危。
  • names:轉(zhuǎn)換前的所有變量名和屬性名康二。
  • mappings:記錄位置信息的字符串,經(jīng)過編碼勇蝙。
  • file:(可選)轉(zhuǎn)換后的文件名沫勿。
  • sourceRoot:(可選)轉(zhuǎn)換前的文件所在的目錄。如果與轉(zhuǎn)換前的文件在同一目錄味混,該項為空产雹。
  • sourcesContent:(可選)轉(zhuǎn)換前的文件內(nèi)容列表,與sources列表依次對應(yīng)翁锡。

Source Map真正神奇之處在于mappings屬性蔓挖,它記錄了位置是如何對應(yīng)的。JavaScript Source Map 詳解已經(jīng)有很好的解釋馆衔,這里不再贅述瘟判。

怎樣使用Source Map?

主流瀏覽器均支持Source Map功能,不過Chrome與Firefox需要一些簡單的配置哈踱,具體步驟請參考How to enable source maps荒适。下面以MacBook上的Chrome瀏覽器為例,介紹一下配置方法:

1. 開啟開發(fā)者工具

使用快捷鍵option + command + i开镣;或者在菜單欄選擇視圖->開發(fā)者->開發(fā)者工具

chrome-sourcemap1.png

2. 打開設(shè)置

使用快捷鍵fn + F1刀诬;或者點擊右上角的三個點的圖標(biāo),選擇Settings

chrome-sourcemap2.png

3. 開啟Source Map

在Sources中邪财,選中Enable JavaScript source maps

chrome-sourcemap3.png

為了測試陕壹,我寫了一個簡單的HTML文件hello.min.html

<head>
    <script type="text/javascript" src="hello.min.js"></script>
</head>

使用Chrome打開hello.min.html,在控制臺看到的錯誤如下:

Uncaught ReferenceError: Name is not defined
    at o (hello.min.js:1)
    at hello.min.js:1

報錯的文件仍然為hello.min.js树埠,需要刷新一下Source Map才有作用:

Uncaught ReferenceError: Name is not defined
    at o (hello.js:4)
    at hello.js:8

注意糠馆,Chrome的報錯信息沒有列號,因此4為錯誤的行號怎憋。Chrome不僅可以通過Source Map還原真實的出錯位置又碌,還可以根據(jù)Source Map的sourcesContent還原出錯的源代碼九昧。點擊出錯位置,即可跳轉(zhuǎn)到源碼毕匀,這樣Debug將非常方便铸鹰。

chrome-sourcemap4.png

參考鏈接

關(guān)于Fundebug

Fundebug專注于JavaScript、微信小程序皂岔、微信小游戲蹋笼、支付寶小程序、React Native躁垛、Node.js和Java實時BUG監(jiān)控剖毯。 自從2016年雙十一正式上線,F(xiàn)undebug累計處理了6億+錯誤事件教馆,得到了Google逊谋、360、金山軟件等眾多知名用戶的認可活玲。歡迎免費試用涣狗!

版權(quán)聲明

轉(zhuǎn)載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/03/13/sourcemap-tutorial/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舒憾,隨后出現(xiàn)的幾起案子镀钓,更是在濱河造成了極大的恐慌,老刑警劉巖镀迂,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丁溅,死亡現(xiàn)場離奇詭異,居然都是意外死亡探遵,警方通過查閱死者的電腦和手機窟赏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箱季,“玉大人涯穷,你說我怎么就攤上這事〔爻” “怎么了拷况?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掘殴。 經(jīng)常有香客問我赚瘦,道長,這世上最難降的妖魔是什么奏寨? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任起意,我火速辦了婚禮,結(jié)果婚禮上病瞳,老公的妹妹穿的比我還像新娘揽咕。我一直安慰自己悲酷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布心褐。 她就那樣靜靜地躺著舔涎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逗爹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天嚎于,我揣著相機與錄音掘而,去河邊找鬼。 笑死于购,一個胖子當(dāng)著我的面吹牛袍睡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肋僧,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼斑胜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嫌吠?” 一聲冷哼從身側(cè)響起止潘,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辫诅,沒想到半個月后凭戴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡炕矮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年么夫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肤视。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡档痪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邢滑,到底是詐尸還是另有隱情腐螟,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布殊鞭,位于F島的核電站遭垛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏操灿。R本人自食惡果不足惜锯仪,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趾盐。 院中可真熱鬧庶喜,春花似錦小腊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至斥扛,卻和暖如春入问,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稀颁。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工芬失, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匾灶。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓棱烂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阶女。 傳聞我的和親對象是個殘疾皇子颊糜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)秃踩,斷路器衬鱼,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 訪問http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquer...
    老夫的天閱讀 675評論 1 4
  • 1. 新建一個文件夾,命名為 webpack-cli , webpack-cli 就是你的項目名,項目名建議使用小...
    魯大師666閱讀 1,463評論 1 3
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看吞瞪,也希望更多的人看到...
    小小字符閱讀 8,140評論 7 35
  • “五一”假期一過馁启,我剛進校門,就被自家花園里的一朵好大的朱頂紅扣住了眼球芍秆。它有點像蓮花惯疙,都有一根筆直的莖。不一樣的...
    一木一風(fēng)閱讀 724評論 1 3