摘要:多個(gè)文件合并,減少請(qǐng)求數(shù)。生成的多了,表示文件的位置。轉(zhuǎn)換前的所有變量名和屬性名。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,得到了金山軟件等眾多知名用戶的認(rèn)可。
部署前端之前,開發(fā)者通常會(huì)對(duì)代碼進(jìn)行打包壓縮,這樣可以減少代碼大小,從而有效提高訪問速度。然而,壓縮代碼的報(bào)錯(cuò)信息是很難Debug的,因?yàn)樗男刑?hào)和列號(hào)已經(jīng)失真。這時(shí)就需要Source Map來還原真實(shí)的出錯(cuò)位置了。
為啥變換代碼?前端代碼越來越復(fù)雜的情況下,開發(fā)者通常會(huì)使用webpack、UglifyJS2等工具對(duì)代碼進(jìn)行打包變換,這樣可以減少代碼大小,有效提高訪問速度。關(guān)于變換代碼的原因,這里不妨引用一下大神阮一峰的JavaScript Source Map 詳解:
如何變換代碼?壓縮,減小體積。比如jQuery 1.9的源碼,壓縮前是252KB,壓縮后是32KB。
多個(gè)文件合并,減少HTTP請(qǐng)求數(shù)。
其他語言編譯成JavaScript。最常見的例子就是CoffeeScript。
下面是一個(gè)簡(jiǎn)單的“hello World”程序hello.js
function sayHello() { var name = "Fundebug"; var greeting = "Hello, " + Name; console.log(greeting); } sayHello();
使用UglifyJS2對(duì)源代碼進(jìn)行壓縮變換:
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的報(bào)錯(cuò)信息是這樣:
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的報(bào)錯(cuò)信息是這樣:
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
對(duì)比壓縮前后的出錯(cuò)信息,我們會(huì)發(fā)現(xiàn),錯(cuò)誤行號(hào)和列號(hào)已經(jīng)失真,且函數(shù)名也經(jīng)過了變換。而對(duì)于真實(shí)的前端項(xiàng)目,開發(fā)者會(huì)將數(shù)十個(gè)源文件壓縮為一個(gè)文件,這時(shí),錯(cuò)誤的列號(hào)可能多達(dá)數(shù)千,且出錯(cuò)的真實(shí)文件名也是很難確定的,這樣的話,壓縮代碼的報(bào)錯(cuò)信息是很難Debug的。
而Source Map則可以用于還原真實(shí)的出錯(cuò)位置,幫助開發(fā)者更快的Debug。
什么是Source Map?使用UglifyJS2時(shí)指定source-map選項(xiàng)即可生成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() { var name = "Fundebug"; var greeting = "Hello, " + Name; console.log(greeting); } sayHello(); "] }
由hello.min.js.map可知,Source Map是一個(gè)JSON文件,而它包含了代碼轉(zhuǎn)換前后的位置信息。也就是說,給定一個(gè)轉(zhuǎn)換之后的壓縮代碼的位置,就可以通過Source Map獲取轉(zhuǎn)換之前的代碼位置,反過來也一樣。Source Map各個(gè)屬性的含義如下:
version:Source Map的版本號(hào)。
sources:轉(zhuǎn)換前的文件列表。
names:轉(zhuǎn)換前的所有變量名和屬性名。
mappings:記錄位置信息的字符串,經(jīng)過編碼。
file:(可選)轉(zhuǎn)換后的文件名。
sourceRoot:(可選)轉(zhuǎn)換前的文件所在的目錄。如果與轉(zhuǎn)換前的文件在同一目錄,該項(xiàng)為空。
sourcesContent:(可選)轉(zhuǎn)換前的文件內(nèi)容列表,與sources列表依次對(duì)應(yīng)。
Source Map真正神奇之處在于mappings屬性,它記錄了位置是如何對(duì)應(yīng)的。JavaScript Source Map 詳解已經(jīng)有很好的解釋,這里不再贅述。
怎樣使用Source Map?主流瀏覽器均支持Source Map功能,不過Chrome與Firefox需要一些簡(jiǎn)單的配置,具體步驟請(qǐng)參考How to enable source maps。下面以MacBook上的Chrome瀏覽器為例,介紹一下配置方法:
1. 開啟開發(fā)者工具使用快捷鍵option + command + i;或者在菜單欄選擇視圖->開發(fā)者->開發(fā)者工具
2. 打開設(shè)置使用快捷鍵fn + F1;或者點(diǎn)擊右上角的三個(gè)點(diǎn)的圖標(biāo),選擇Settings
3. 開啟Source Map在Sources中,選中Enable JavaScript source maps
為了測(cè)試,我寫了一個(gè)簡(jiǎn)單的HTML文件hello.min.html
使用Chrome打開hello.min.html,在控制臺(tái)看到的錯(cuò)誤如下:
Uncaught ReferenceError: Name is not defined at o (hello.min.js:1) at hello.min.js:1
報(bào)錯(cuò)的文件仍然為hello.min.js,需要刷新一下Source Map才有作用:
Uncaught ReferenceError: Name is not defined at o (hello.js:4) at hello.js:8
注意,Chrome的報(bào)錯(cuò)信息沒有列號(hào),因此4為錯(cuò)誤的行號(hào)。Chrome不僅可以通過Source Map還原真實(shí)的出錯(cuò)位置,還可以根據(jù)Source Map的sourcesContent還原出錯(cuò)的源代碼。點(diǎn)擊出錯(cuò)位置,即可跳轉(zhuǎn)到源碼,這樣Debug將非常方便。
參考鏈接JavaScript Source Map 詳解
Source Map Revision 3 Proposal
How to enable source maps
關(guān)于FundebugFundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了6億+錯(cuò)誤事件,得到了Google、360、金山軟件等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用!
版權(quán)聲明轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/03/13/sourcemap-tutorial/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86949.html
摘要:這是局部安裝局部安裝的使用要帶路徑哇,要寫路徑,好麻煩哦,沒事,那就全局安裝吧。如果該值是一個(gè)相對(duì)路徑,它將相對(duì)于包含的文件。就相當(dāng)于就相當(dāng)于就相當(dāng)于后面帶有意味著要完全匹配如果,因?yàn)闆]完全匹配,那么加載的是下文件夾里的使用教程二 Webpack是什么,我就不過多介紹了,大家都有耳聞,不過還是配張圖讓大家體會(huì)下。showImg(https://segmentfault.com/img/...
摘要:入門什么是是一個(gè)廣泛使用的轉(zhuǎn)碼器,可以將代碼轉(zhuǎn)為代碼,從而在現(xiàn)有環(huán)境執(zhí)行。 babel6 入門 什么是babel Babel是一個(gè)廣泛使用的轉(zhuǎn)碼器,可以將ES6代碼轉(zhuǎn)為ES5代碼,從而在現(xiàn)有環(huán)境執(zhí)行。 因?yàn)閑s6比es5的代碼更為適合編寫程序,但是因?yàn)闅v史的原因,現(xiàn)在普遍的瀏覽器并不支持es6代碼(普遍支持es5),即如果你寫es6代碼之后,在瀏覽器上運(yùn)行出錯(cuò),因?yàn)闉g覽器的javas...
摘要:相關(guān)鏈接詳細(xì)教程,從無到有搭建腳手架一詳細(xì)教程,從無到有搭建腳手架二詳細(xì)教程,從無到有搭建腳手架三管理打包后目錄結(jié)構(gòu)打包結(jié)構(gòu)如下修改配置通過相對(duì)目錄對(duì)資源命名前加上目錄名,效果后面的步驟在這里需要安裝一個(gè)大型的包,以為例安裝為第三 相關(guān)鏈接 webpack4詳細(xì)教程,從無到有搭建react腳手架(一) webpack4詳細(xì)教程,從無到有搭建react腳手架(二) webpack4詳細(xì)...
摘要:先展示一下文件目錄結(jié)構(gòu)先把相關(guān)的依賴給裝好注意一下注釋只是為了解釋,在中不能寫注釋插件加載器預(yù)編譯語法跨平臺(tái)環(huán)境用來設(shè)置命令行安裝預(yù)編譯語法的配置中的對(duì)象,用于處理目錄的對(duì)象,提高開發(fā)效率。 Foreword 之前三篇大致介紹了webpack的用法,正如這個(gè)系列標(biāo)題而言 從webpack 到 vue Component,所以最后一篇文章當(dāng)然是要講 component, 不對(duì)應(yīng)該說是結(jié)合...
摘要:先展示一下文件目錄結(jié)構(gòu)先把相關(guān)的依賴給裝好注意一下注釋只是為了解釋,在中不能寫注釋插件加載器預(yù)編譯語法跨平臺(tái)環(huán)境用來設(shè)置命令行安裝預(yù)編譯語法的配置中的對(duì)象,用于處理目錄的對(duì)象,提高開發(fā)效率。 Foreword 之前三篇大致介紹了webpack的用法,正如這個(gè)系列標(biāo)題而言 從webpack 到 vue Component,所以最后一篇文章當(dāng)然是要講 component, 不對(duì)應(yīng)該說是結(jié)合...
閱讀 2935·2021-10-14 09:42
閱讀 1285·2021-09-24 10:32
閱讀 3003·2021-09-23 11:21
閱讀 2877·2021-08-27 13:10
閱讀 3359·2019-08-29 18:41
閱讀 2223·2019-08-29 15:16
閱讀 1240·2019-08-29 13:17
閱讀 915·2019-08-29 11:22