摘要:由于現在構建工具盛行,前端部署的代碼都是經過編譯,壓縮后的,于是乎,就扮演了一個十分重要的角色,用來作為源代碼和編譯代碼之間的映射,方便定位問題。源代碼的標識,如果無法獲取,返回。
摘要: Source Map還是很神奇的。
原文:線上出bug了?別怕,這么定位!
公眾號:前端小苑
Fundebug經授權轉載并修改,版權歸原作者所有。
工作中,生產環境代碼是編譯后代碼,搜集到報錯信息的行和列無法在源碼中對應,很多時候只能靠“經驗”去猜,本文針對這種情況,開發了一個npm命令行小工具,幫助快速定位報錯的源碼位置,提升效率。
由于現在構建工具盛行,前端部署的代碼都是經過編譯,壓縮后的,于是乎,SoueceMap就扮演了一個十分重要的角色,用來作為源代碼和編譯代碼之間的映射,方便定位問題。
測試SourceMap功能首先全局安裝reverse-sourcemap
npm install --global reverse-sourcemap
選擇編譯后的代碼進行測試,下面是vue項目編譯生成的代碼。
在命令行執行命令,將main.js反編譯回源碼,并輸出到sourcecode目錄下。
reverse-sourcemap -v dist/main.a8ebc11c3f03786d8e3b.js.map -o sourcecode
上面是執行命令輸出的sourcecode目錄,生成的目錄結構和源碼目錄一致,打開一個文件,和源碼做下對比:
可以看出,反編譯出的代碼無論目錄結構還是具體代碼都和源碼一致。
生產環境代碼報錯如何定位源碼位置如果使用了Fundebug的Source Map功能的話,則可以很方便的定位出錯位置:
如果沒有使用監控工具的話,生產環境的代碼,經過壓縮、編譯,很不利于Debug。針對這個問題,需要準備一份生產環境代碼的map文件,為了方便,可以在項目的package.json增加debug命令用來生成map文件。這條命令除了開啟sourcemap,其他的具體webpack配置和生產環境配置相同。
"scripts": { "start": "vue-cli-service serve --mode dev", "stage": "vue-cli-service build --mode staging", "online": "vue-cli-service build", "debug": "vue-cli-service build --mode debug" }
有了map文件,通過SourceMap提供的API就可以定位到源碼的位置。下面是實現的核心代碼。
// Get file content const sourceMap = require("source-map"); const readFile = function (filePath) { return new Promise(function (resolve, reject) { fs.readFile(filePath, {encoding:"utf-8"}, function(error, data) { if (error) { console.log(error) return reject(error); } resolve(JSON.parse(data)); }); }); }; // Find the source location async function searchSource(filePath, line, column) { const rawSourceMap = await readFile(filePath) const consumer = await new sourceMap.SourceMapConsumer(rawSourceMap); const res = consumer.originalPositionFor({ "line" : line, "column" : column }); consumer.destroy() return res }
最重要的就是使用SourceMap提供的 originalPositionFor API。 SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
originalPositionFor API的參數為一個包含line和column屬性的對象
line 編譯生成代碼的行號,從1開始
column 編譯生成代碼的列號,從0開始
這個方法會返回一個具有以下屬性的對象
{ "source": "webpack:///src/pages/common/403.vue?c891", // 源代碼文件的位置,如果無法獲取,返回null。 "line": 4, // 源代碼的行號,從1開始,如果無法獲取,返回null。 "column": 24, // 源代碼的列號,從0開始,如果無法獲取,返回null。 "name": "get" // 源代碼的標識,如果無法獲取,返回null。 }源碼定位工具
為了使用方便,我將這個功能做成了一個命令行小工具。全局安裝后,不需要做任何配置就可以使用。
安裝npm install --global source-location參數介紹
Usage: sl [options] Options: -v, --version output the version number -p, --source-flie-path The generated source file 編譯后的map文件 -l, --ine The line number in the generated source 編譯后代碼行號 -c, --column The column number in the generated source 編譯后代碼列號 -h, --help output usage information使用案例
終端執行命令:
sl -p dist/1.f47efcb58028826c7c05.js.map -l 1 -c 34
命令行將會輸出:源碼的文件路徑:path,源碼行號:line,源碼標識:name。
項目的github地址: github.com/front-end-y… 如有錯誤歡迎指出。
最后,推薦大家使用Fundebug,一款很好用的BUG監控工具,支持Source Map功能~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104317.html
摘要:每周都會舉行嘉賓分享,話題討論等活動。本期,我們邀請了測試技術社區聯合創始人陳曄,為大家分享移動互聯網測試到質量的轉變。分享內容簡介在移動互聯網越來越快的迭代項目中,很多測試人員和測試團隊都開始覺得力不從心。 本文來自于騰訊bugly開發者社區,非經作者同意,請勿轉載,原文地址:http://dev.qq.com/topic/57ee0... Dev Club 是一個交流移動開發技術,...
摘要:大交通研發質量體系建設為了幫助用戶更好地完成消費決策閉環,馬蜂窩上線了大交通業務,為用戶提供購買機票火車票等服務。 質量是決定產品能否成功、企業能否持續發展的關鍵因素之一。如何做好質量體系建設,這是個比較大的話題,包含的范圍很廣,也沒有固定的衡量標準。 打開一個互聯網公司招聘網站,搜索「測試工程師」崗位時,你會發現幾乎全部 JD 都包含一條要求「建設或者參與建設所負責業務的質量體系」。...
摘要:大交通研發質量體系建設為了幫助用戶更好地完成消費決策閉環,馬蜂窩上線了大交通業務,為用戶提供購買機票火車票等服務。 質量是決定產品能否成功、企業能否持續發展的關鍵因素之一。如何做好質量體系建設,這是個比較大的話題,包含的范圍很廣,也沒有固定的衡量標準。 打開一個互聯網公司招聘網站,搜索「測試工程師」崗位時,你會發現幾乎全部 JD 都包含一條要求「建設或者參與建設所負責業務的質量體系」。...
摘要:一直以來,前端的線上問題很難定位,因為它發生于用戶的一系列操作之后。當然,這些問題并非不能克服,讓我們來一起看看如何去定位線上的問題吧。地址參考一步一步搭建前端監控系統錯誤監控篇一步一步搭建前端監控系統接口請求異常監控篇 摘要: 記錄用戶行為,排查線上BUG。 作者:一步一個腳印一個坑 原文:如何定位前端線上問題(如何排查前端生產問題) Fundebug經授權轉載,版權歸原作者所...
摘要:因為涉及業務敏感話題,本文只記錄我們學習的歷程。我由衷的感謝團隊的小伙伴們,感謝你們的堅韌不拔,感謝你們的持續成長。這個變化只是在每天的堅持和刻意練習中發生的,是那么的神奇。 因為涉及業務敏感話題,本文只記錄我們學習的歷程。 關于堅持 ??從2016年起,我們團隊堅持每天早晨8:50-10:30的100分鐘早晨討論,到現在已經兩年了,期間沒有中斷過。我由衷的感謝團隊的小伙伴們,感謝你們...
閱讀 720·2023-04-25 20:32
閱讀 2267·2021-11-24 10:27
閱讀 4520·2021-09-29 09:47
閱讀 2241·2021-09-28 09:36
閱讀 3633·2021-09-22 15:27
閱讀 2756·2019-08-30 15:54
閱讀 370·2019-08-30 11:06
閱讀 1271·2019-08-30 10:58