自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文帶你了解什么是源代碼映射?

開(kāi)發(fā) 前端
今天,我們要談?wù)撛创a映射,這是現(xiàn)代 Web 開(kāi)發(fā)中非常重要的工具,可以顯著地簡(jiǎn)化調(diào)試過(guò)程。在本文中,我們將探討源代碼映射的基礎(chǔ)知識(shí),它們是如何生成的,以及它們?nèi)绾翁岣哒{(diào)試體驗(yàn)。

先看下本篇主要內(nèi)容:

本篇主要介紹源代碼映射,源代碼映射(Source maps)是以??.map???結(jié)尾的文件,例如??example.min.js.map???和??styles.css.map??。大多數(shù)構(gòu)建工具都可以生成源代碼映射文件,例如Vite、webpack、Rollup、Parcel、esbuild等,一些工具默認(rèn)包含源代碼映射,而其他工具則需要額外的配置才能生成它們。

使用源代碼映射可以方便地在開(kāi)發(fā)過(guò)程中進(jìn)行調(diào)試,因?yàn)樗鼈兲峁┝艘环N將壓縮、混淆和優(yōu)化的代碼還原為原始源代碼的方法。這對(duì)于診斷和修復(fù)錯(cuò)誤非常有幫助,特別是在生產(chǎn)環(huán)境中。源代碼映射還可以幫助你確定哪些代碼行負(fù)責(zé)執(zhí)行特定的功能,以及從哪里調(diào)用了特定的函數(shù)。

盡管源代碼映射非常有用,但是它們會(huì)增加文件大小并增加服務(wù)器的負(fù)載。因此,在生產(chǎn)環(huán)境中通常會(huì)禁用它們,而在開(kāi)發(fā)過(guò)程中啟用它們以便進(jìn)行調(diào)試。如果你使用的構(gòu)建工具不支持源代碼映射,則有可能需要手動(dòng)編寫(xiě)它們。

下面是正文~~~~

今天,我們要談?wù)撛创a映射,這是現(xiàn)代 Web 開(kāi)發(fā)中非常重要的工具,可以顯著地簡(jiǎn)化調(diào)試過(guò)程。在本文中,我們將探討源代碼映射的基礎(chǔ)知識(shí),它們是如何生成的,以及它們?nèi)绾翁岣哒{(diào)試體驗(yàn)。

需要源代碼映射

回到過(guò)去的美好時(shí)光,我們使用純HTML、CSS和JavaScript構(gòu)建Web應(yīng)用程序,并將相同的文件部署到Web上。

然而,隨著我們現(xiàn)在構(gòu)建更復(fù)雜的Web應(yīng)用程序,開(kāi)發(fā)工作流可能涉及使用各種工具。例如:

  • 模板語(yǔ)言和HTML預(yù)處理器:Pug,Nunjucks,Markdown
  • CSS 預(yù)處理器:SCSS、LESS、PostCSS
  • JavaScript 框架:Angular、React、Vue、Svelte
  • JavaScript元框架:Next.js,Nuxt,Astro
  • 高級(jí)編程語(yǔ)言:TypeScript、Dart、CoffeeScript

圖片

這些工具需要構(gòu)建過(guò)程將我們的代碼轉(zhuǎn)換為標(biāo)準(zhǔn)的 HTML、JavaScript 和 CSS,以便瀏覽器能夠理解。此外,為了優(yōu)化性能,通常會(huì)壓縮(例如使用 Terser 來(lái)縮小和混淆 JavaScript)和合并這些文件,減小它們的大小并使它們更適合于Web。

例如,使用構(gòu)建工具,我們可以將以下TypeScript文件轉(zhuǎn)換并壓縮為一行JavaScript代碼。

/* A TypeScript demo: example.ts */

document.querySelector('button')?.addEventListener('click', () => {
const num: number = Math.floor(Math.random() * 101);
const greet: string = 'Hello';
(document.querySelector('p') as HTMLParagraphElement).innerText = `${greet}, you are no. ${num}!`;
console.log(num);
});

一個(gè)壓縮版本將是:

/* A compressed JavaScript version of the TypeScript demo: example.min.js  */

document.querySelector("button")?.addEventListener("click",(()=>{const e=Math.floor(101*Math.random());document.querySelector("p").innerText=`Hello, you are no. ${e}!`,console.log(e)}));

然而,這種優(yōu)化可能會(huì)使調(diào)試變得更具挑戰(zhàn)性。將所有內(nèi)容壓縮到單行中并縮短變量名稱(chēng)的壓縮代碼可能會(huì)使問(wèn)題的源頭難以確定。這就是源映射的作用——它們將編譯后的代碼映射回原始代碼。

生成源代碼映射

源映射是以 .map 結(jié)尾的文件(例如, example.min.js.map 和 styles.css.map )。它們可以由大多數(shù)構(gòu)建工具生成,例如 Vite、webpack、Rollup、Parcel、esbuild 等等。

一些工具默認(rèn)包含源代碼映射,而其他一些工具可能需要額外的配置才能生成它們。

/* Example configuration: vite.config.js */
/* https://vitejs.dev/config/ */

export default defineConfig({
build: {
sourcemap: true, // enable production source maps
},
css: {
devSourcemap: true // enable CSS source maps during development
}
})

理解源代碼映射

這些源映射文件包含有關(guān)編譯代碼如何映射到原始代碼的基本信息,使開(kāi)發(fā)人員能夠輕松調(diào)試。這是一個(gè)源映射的示例。

{
"mappings": "AAAAA,SAASC,cAAc,WAAWC, ...",
"sources": ["src/script.ts"],
"sourcesContent": ["document.querySelector('button')..."],
"names": ["document","querySelector", ...],
"version": 3,
"file": "example.min.js.map"
}

源映射的最關(guān)鍵方面是 mappings 字段。它使用 VLQ 基于 64 編碼的字符串將編譯文件中的行和位置映射到相應(yīng)的原始文件。可以使用源映射可視化工具(如 source-map-visualization 和 Source Map Visualization)來(lái)可視化此映射。

圖片

左側(cè)生成的列顯示壓縮內(nèi)容,右側(cè)原始列顯示原始來(lái)源。可視化工具會(huì)為原始列中的每一行和生成列中對(duì)應(yīng)的代碼進(jìn)行著色編碼。

映射部分顯示了代碼的解碼映射。例如,條目 65-> 2:2 的意思是:

  • 生成的代碼:?jiǎn)卧~ const 在壓縮內(nèi)容中的位置為65。
  • 原始代碼:?jiǎn)卧~ const 在原始內(nèi)容中的第2行第2列開(kāi)始。

圖片

瀏覽器開(kāi)發(fā)者工具應(yīng)用這些源映射,幫助我們更快地定位調(diào)試問(wèn)題,直接在瀏覽器中進(jìn)行。

圖片

該圖顯示了瀏覽器開(kāi)發(fā)者工具如何應(yīng)用源映射,并顯示文件之間的映射關(guān)系。

源映射支持?jǐn)U展。擴(kuò)展是以 x_ 命名約定開(kāi)頭的自定義字段。一個(gè)例子是由 Chrome DevTools 提出的 x_google_ignoreList 擴(kuò)展字段。請(qǐng)參閱 x_google_ignoreList 以了解這些擴(kuò)展如何幫助您專(zhuān)注于我們的代碼。

它不完美

在我們的示例中,變量 greet 在構(gòu)建過(guò)程中被優(yōu)化掉了。該值直接嵌入到最終的字符串輸出中。

圖片

在這種情況下,當(dāng)我們調(diào)試代碼時(shí),開(kāi)發(fā)人員工具可能無(wú)法推斷和顯示實(shí)際值。這不僅是瀏覽器開(kāi)發(fā)人員工具的挑戰(zhàn),也使代碼監(jiān)視和分析更加困難。

圖片

當(dāng)然,這是一個(gè)可以解決的問(wèn)題。其中一種方法是像其他編程語(yǔ)言一樣,在源映射中包含范圍信息,以便進(jìn)行調(diào)試。

然而,這需要整個(gè)生態(tài)系統(tǒng)共同努力改進(jìn)源映射規(guī)范和實(shí)現(xiàn)。目前正在積極討論如何通過(guò)源映射來(lái)提高調(diào)試性能。

我們期待著改進(jìn)源代碼映射,使調(diào)試變得更加簡(jiǎn)單!

本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。


責(zé)任編輯:姜華 來(lái)源: 大遷世界
相關(guān)推薦

2025-01-15 09:06:57

servlet服務(wù)器Java

2022-09-29 13:09:38

DataClassPython代碼

2019-07-04 15:16:52

數(shù)據(jù)挖掘大數(shù)據(jù)算法

2022-09-06 11:21:49

光網(wǎng)絡(luò)光纖

2023-05-17 11:33:45

梯度下降機(jī)器學(xué)習(xí)

2022-03-14 08:01:06

LRU算法線程池

2019-04-19 14:03:52

APISDK接口

2023-11-20 08:18:49

Netty服務(wù)器

2018-10-22 08:14:04

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2019-11-14 09:16:56

物聯(lián)網(wǎng)技術(shù)路由器

2024-05-27 00:00:00

.NET游戲引擎C#

2022-02-24 07:34:10

SSL協(xié)議加密

2023-11-08 08:15:48

服務(wù)監(jiān)控Zipkin

2023-10-27 08:15:45

2020-02-02 15:14:24

HTTP黑科技前端

2020-10-08 14:32:57

大數(shù)據(jù)工具技術(shù)

2022-04-28 09:22:46

Vue灰度發(fā)布代碼

2022-02-18 10:13:07

SolrElasticSea開(kāi)源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)