成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

如何在 Vue 項目中,通過點擊 DOM 自動定位VSCode中的代碼行?下面本篇文章就來給大家分享一個插件,并聊聊實現原理,快來收藏吧!

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

現在大型的 Vue項目基本上都是多人協作開發,并且隨著版本的迭代,Vue 項目中的組件數也會越來越多,如果此時讓你負責不熟悉的頁面功能開發,甚至你才剛剛加入這個項目,那么怎么樣才能快速找到相關組件在整個項目代碼中的文件位置呢?想必大家都有采取過以下這幾種方法:

  • 【搜類名】,在工程文件里搜索頁面 DOM元素中的樣式類名
  • 【找路由】,根據頁面鏈接找到Vue路由匹配的頁面組件
  • 【找人】,找到當初負責開發該頁面的人詢問對應的代碼路徑

以上幾種方法確實能夠幫助我們找到具體的代碼文件路徑,但都需要人工去搜索,并不是很高效,那有沒有其它更高效的方式呢?

答案是有的。Vue官方就提供了一款 vue-devtools 插件,使用該插件就能自動在 VSCode 中打開對應頁面組件的源代碼文件,操作路徑如下:

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

使用vue-devtools插件可以很好地提高我們查找對應頁面組件代碼的效率,但只能定位到對應的組件代碼,如果我們想要直接找到頁面上某個元素相關的具體代碼位置,還需要在當前組件源代碼中進行二次查找,并且每次都要先選擇組件,再點擊打開按鈕才能打開代碼文件,不是特別快捷。

針對這個問題,我們開發了輕量級的頁面元素代碼映射插件,使用該插件可以通過點擊頁面元素的方式,一鍵打開對應代碼源文件,并且精準定位對應代碼行,無需手動查找,能夠極大地提高開發效率和體驗,實際的使用效果如下:

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

實現原理

整個插件主要分為3個功能模塊:client、server、add-code-location,client端發送特定請求給server端,server端接收到該請求后執行定位代碼行命令,而add-code-location模塊用于源碼的轉換。

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

1、client

client端這里其實就是指瀏覽器,我們在點擊頁面元素時,瀏覽器就會發送一個特定請求給server端,該請求信息包含了具體的代碼文件路徑和對應代碼行號信息。

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

function openEditor(filePath) {   axios     .get(`${protocol}//${host}:${port}/code`, {       params: {         filePath: `${filePath}`       }     })     .catch(error => {       console.log(error)     }) }

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?而監聽頁面元素的點擊事件則通過事件代理的方式全局監聽,給document綁定了點擊事件,監聽鍵盤和鼠標點擊組合事件來發起定位代碼行請求,避免和頁面原生的click事件發生沖突。

function openCode(e) {   if (isShiftKey || isMetaKey || e.metaKey || e.shiftKey) {     e.preventDefault()     const filePath = getFilePath(e.target)     openEditor(filePath)   }   ... }

2、server

server端是指本地起的一個服務器,可以監聽client端發送的特定請求,當接收到執行定位命令的請求時,執行VSCode打開代碼文件命令,并定位到對應的代碼行。

2.1 webpack devServer

如果是采用webpack構建的項目,webpack的devServer開發服務器已經提供了一個before屬性,可以通過它來監聽發送給開發服務器的請求。

before: function (app) {   app.get('/code', function (req, res) {     if (req.query.filePath) {       // 執行vscode定位代碼行命令       openCodeFile(req.query.filePath)       ...     }     ...   }) }

2.2 vite configureServer

如果是采用Vite構建的項目,可以使用Vite插件來實現server端監聽特定請求,Vite插件擴展于rollup插件接口,并且在原有的基礎上增加了一些特有的鉤子函數,例如configureServer鉤子,通過該鉤子函數可以用于配置開發服務器來監聽特定的請求。

const codeServer = () => ({   name: 'open-code-vite-server',   configureServer(server) {     server.middlewares.use((req, res, next) => {       ...       if (pathname == '/code') {         ...         if (filePath) {           openCodeFile(filePath) // 執行vscode定位代碼行命令           ...         }         res.end()       }       ...     })   } })

2.3 執行 VSCode 定位命令

當server端監聽到client端發送的特定請求后,接下來就是執行VSCode定位代碼行命令。實際上,VSCode編輯器是可以通過code命令來啟動,并且可以相應使用一些命令行參數,例如:

"code –reuse-window"或"code -r"命令可以打開最后活動窗口的文件或文件夾;"code –goto"或"code -g"命令后面可以拼接具體文件路徑和行列號,當使用"code -g file:line:column"命令時可以打開某個文件并定位到具體的行列位置。

利用 VSCode 編輯器的這個特性,我們就能實現自動定位代碼行功能,對應的代碼路徑信息可以從client端發送的請求信息當中獲得,再借助node的child_process.exec方法來執行VSCode定位代碼行命令。

const child_process = require('child_process') function openCodeFile(path) {   let pathBefore = __dirname.substring(0, __dirname.search('node_modules'))   let filePath = pathBefore + path   child_process.exec(`code -r -g ${filePath}`) }

另外,為了正常使用 VSCode 的 Code命令,我們需要確保添加VSCode Code命令到環境變量當中。Mac系統用戶可以在VSCode界面使用command+shift+p快捷鍵,然后搜索Code 并選擇install 'code' command in path;Windows用戶可以找到VSCode安裝位置的bin文件夾目錄,并將該目錄添加到系統環境變量當中。

3、add-code-location

通過前面的介紹,大家應該了解了client端和server端的執行機制,并且在執行定位命令時需要獲取到頁面元素的代碼路徑,而具體的代碼路徑是以屬性的方式綁定到了DOM元素上,這時候就需要用到add-code-location模塊在編譯時轉換我們的源碼,并給 DOM元素添加對應的代碼路徑屬性。

整個源碼轉換處理流程如下:

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

3.1 獲取文件路徑

源碼轉換過程的第一步是獲取代碼文件的具體路徑,對于webpack打包的項目來說,webpack loader用來處理源碼字符串再合適不過,loader的上下文this對象包含一個resourcePath資源文件的路徑屬性,利用這個屬性我們很容易就能獲得每個代碼文件的具體路徑。

module.exports = function (source) {   const { resourcePath } = this   return sourceCodeChange(source, resourcePath) }

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?對于Vite構建的項目來說,源碼的轉化操作也是通過插件來完成,Vite插件有通用的鉤子transform,可用于轉換已加載的模塊內容,它接收兩個參數,code參數代表著源碼字符串,id參數是文件的全路徑。

module.exports = function() {   return {     name: 'add-code-location',     transform(code, id) {       ...       return sourceCodeChange(code, id)     }   } }

3.2 計算代碼行號

接著在遍歷源碼文件的過程中,需要處理對應Vue文件template模板中的代碼,以“n”分割template模板部分字符串為數組,通過數組的索引即可精準得到每一行html標簽的代碼行號。

function codeLineTrack(str, resourcePath) {   let lineList =  str.split('n')   let newList = []   lineList.forEach((item, index) => {     newList.push(addLineAttr(item, index + 1, resourcePath)) // 添加位置屬性,index+1為具體的代碼行號   })   return newList.join('n') }

3.3 添加位置屬性

在獲取到代碼文件路徑和代碼行號以后,接下來就是對Vue template模板中分割的每一行標簽元素添加最終的位置屬性。這里采用的是正則替換的方式來添加位置屬性,分別對每一行標簽元素先正則匹配出所有元素的開始標簽部分,例如<div、<span、<img等,然后將其正則替換成帶有code-location屬性的開始標簽,對應的屬性值就是前面獲取的代碼路徑和對應標簽的行號。

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

function addLineAttr(lineStr, line, resourcePath) {   let reg = /<[w-]+/g   let leftTagList = lineStr.match(reg)   if (leftTagList) {     leftTagList = Array.from(new Set(leftTagList))     leftTagList.forEach(item => {       if (item && item.indexOf('template') == -1) {         let regx = new RegExp(`${item}`, 'g')         let location = `${item} code-location="${resourcePath}:${line}"`         lineStr = lineStr.replace(regx, location)       }     })   }   return lineStr }

聊聊在VSCode中怎么點擊DOM 自動定位到相應代碼行?

4、其他處理

4.1 源碼相對路徑

在給DOM元素添加對應的源碼位置屬性時,實際上采用的是相對路徑,這樣可以使得DOM元素上的屬性值更加簡潔明了。node_modules文件夾通常是在項目的根目錄下,而插件是以npm包的形式安裝在node_modules路徑下,利用node的__dirname變量可以獲得當前模塊的絕對路徑,因此在源碼轉換過程中就可以獲取到項目的根路徑,從而就能獲得Vue代碼文件的相對路徑。

let pathBefore = __dirname.substring(0, __dirname.search('node_modules')) let filePath = filePath.substring(pathBefore.length) // vue代碼相對路徑

在server端執行代碼定位命令時,再將對應的代碼相對路徑拼接成完整的絕對路徑。

4.2 外部引入組件

add-code-location雖然可以對本地的Vue文件進行代碼路徑信息的添加,但是對于外部引入或解析加載的組件目前是沒有辦法進行轉換的,例如element ui組件,實際上的代碼行信息只會添加在element ui組件的最外層。這時候client端在獲取點擊元素的代碼路徑時會做一個向上查找的處理,獲取其父節點的代碼路徑,如果還是沒有,會繼續查找父節點的父節點,直到成功獲取代碼路徑。

function getFilePath(element) {   if (!element || !element.getAttribute) return null   if (element.getAttribute('code-location')) {     return element.getAttribute('code-location')   }   return getFilePath(element.parentNode) }

這樣就可以在點擊后臺element ui搭建的頁面元素時,也能成功定位打開對應代碼文件。

接入方案

通過前面的介紹,想必大家對頁面元素代碼映射插件原理有了清晰的了解,接下來就介紹一下在項目中的接入方式。接入方式其實很簡單,并且可以選擇只在本地開發環境接入,不用擔心對我們的生產環境造成影響,放心使用。

1、webpcak構建項目

對于webpack構建的項目來說,首先在構建配置項vue.config.js文件中配置一下devServer和webpack loader,接著在main.js入口文件中初始化插件。

// vue.config.js const openCodeServe = require('@vivo/vue-dev-code-link/server') devServer: {   ...   before: openCodeServe.before },   if (!isProd) { // 本地開發環境   config.module     .rule('vue')     .test(/.vue/)     .use('@vivo/vue-dev-code-link/add-location-loader')     .loader('@vivo/vue-dev-code-link/add-location-loader')     .end() } // main.js import openCodeClient from '@vivo/vue-dev-code-link/client' if (process.env.NODE_ENV == 'development') {   openCodeClient.init() }

2、Vite構建項目

Vite構建項目接入該插件的方案和webpack構建項目基本上一致,唯一不一樣的地方在于打包配置文件里引入的是兩個Vite插件。

// vite.config.js import openCodeServer from '@vivo/vue-dev-code-link/vite/server' import addCodeLocation from '@vivo/vue-dev-code-link/vite/add-location' export default defineConfig({   plugins: [     openCodeServer(),     addCodeLocation()   ] }

總結

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产69囗曝吞精在线视频| 大象国精产品一品二品在线| 啊别插了视频高清在线观看| 成在人线AV无码免费看| 国产成人无码A区在线观看视频 | JIZZJIZZ丝袜老师| 厨房人妻HD中文字幕69XX| 国产精品麻豆成人AV电影| 国产在线看片无码人精品| 久久AV无码精品人妻糸列| 年轻的少妇A级伦理| 人妻少妇中文字幕久久| 天天综合网网欲色| 亚洲精品无码久久久久| [中文] [3D全彩H漫]新来| 内射人妻无码色AV麻豆| 人人妻人人澡人人爽欧美一区双 | 上课我穿超短裙被同桌摸出水| 挺进绝色老师的紧窄小肉六视频| 亚洲国产精品成人久久久| 在线观看免费AV网| 成人免费看WWW网址入口| 国产未成女YOUNV仙踪林| 久久久久亚洲精品中文字幕| 强奷漂亮少妇高潮麻豆| 无码中文字幕AV免费放| 亚洲中文无码成人片在线观看| A级毛片免费观看播放器| 国产超碰人人爽人人做| 久久精品国产亚洲AV果冻传媒| 欧美极品少妇XXXXⅩ高跟鞋| 无码精品人妻一区二区 | 亚洲AV综合色区无码一二三区| 在线观看亚洲AV每日更新无码| 潮喷大喷水系列无码久久精品| 国内一区二区三区香蕉AⅤ| 嫩草院一区二区乱码| 偷朋友人妻系列H文| 一級黃色毛片免費看| 动漫AV纯肉无码AV在线播放| 精品久久久久久无码人妻热| 全部孕妇毛片丰满孕妇孕交| 亚洲AV色香蕉一区二区三区| 1000部啪啪未满十八勿入不卡 | 久久久久黑人强伦姧人妻| 日韩无套内射视频6| 亚洲精品无码7777| 变态拳头交视频一区二区| 黑人上司好猛我好爽中文字幕| 欧美人与性囗牲恔配| 香蕉蕉亚亚洲AAV综合| 97久久超碰福利国产精品…| 国产猛男GAY1069视频| 欧美丰满熟妇乱XXXXX视频| 小雪被老外黑人撑破了视频| 147VT最大但人文艺术| 国产午夜片无码区在线观看爱情网| 欧美黑人成人www在线观看| 亚洲AV无码成人影片在线观看| 99久久国产宗和精品1上映| 国精品产露脸偷拍视频| 人与禽性视频77777| 亚洲午夜久久久影院伊人| 国产 | 欧洲野花视频欧洲1| 美丽的小蜜桃伦理美国| 学生妹流白浆喷水被草| 爆乳熟妇一区二区三区霸乳| 久久久99精品免费观看| 无码成人免费AV片在线观看| AV区无码字幕中文色| 精品深夜AV无码一区二区老年 | 国产人妻麻豆蜜桃色精品电影| 欧美黑人性暴力猛交高清| 亚洲精品无码久久一线| 丰满少妇被猛烈进AV毛片| 妺妺晚上扒我内裤吃我精子| 亚洲国产成人精品青青草原| 丰满少妇人妻XXXXX| 女人自慰喷水全过程免费观看| 日本熟少妇裸交ⅩXX视频| 无码专区永久免费AV网站| Z Z〇Z〇另类女人ZOZ〇| 精品欧洲AV无码一区二区| 撕开奶罩揉吮奶头免费视频| GOGO少妇无码肉肉视频| 久久午夜夜伦鲁鲁片无码免费 | 98人妻人人揉人人躁88Av| 精品推荐国产AV剧情| 我趁老师睡觉偷偷的脱她内裤| MM1313午夜视频在线观看| 久久亚洲精品无码爱剪辑| 亚洲成AV人最新无码| 国产精品毛片完整版视频| 日韩VS欧美VS亚洲VS无码| 51精产国品一二三产区区| 久久久久亚洲精品中文字幕| 亚洲AV永久无码精品三区在线4 | 国产成人AV无码永久免费| 秋霞国产午夜伦午夜无码灬| 在线A毛片免费视频观看| 精品国模一区二区三区| 亚洲 欧美 偷自乱 图片| 国产成人婷婷丁香在线| 日韩一卡2卡3卡4卡| YY8男人的天堂| 哦┅┅快┅┅用力啊┅┅| 中国少妇内射XXXXⅩHD| 久久青草免费福利资源站| 亚洲欧美在线人成最新| 狠狠色婷婷久久一区二区三区 | 国产无遮挡裸体美女视频| 挽起裙子迈开腿坐下去的图片高清| 成人综合色在线一区二区| 人人妻人人澡人人爽人人到DVD| 99精品国产成人综合| 妺妺窝人体色WWW精品| 在线天堂中文最新版WWW| 久久久久久伊人高潮影院| 亚洲精品AⅤ无码精品丝袜足| 国产成人无码免费视频79| 少妇又色又紧又爽又刺激视频| 成年片色大黄全免费网站久久| 人妻中文字系列无码专区| 八戒午夜理论片影院| 人人妻人人爽人人澡AV| 成人av在线网站| 色欲色欲天天天WWW亚洲伊 | 99国精产品灬源码168| 欧产日产国产精品| JIZZ成熟丰满| 日本熟妇色XXXXX| 丰满人妻一区二区三区无码AV| 色综合AV男人的天堂伊人| 国产白丝JK捆绑束缚调教视频 | 国产乱子伦农村XXXX| 香蕉大美女天天爱天天做| 黑人大雞巴XXOO视频| 亚洲国产成人综合精品| 九月婷婷人人澡人人添人人爽| 亚洲综合一区国产精品| 久久香蕉综合色一综合色88| 中国丰满少妇性BBBBBBBB| 女人下边水润紧致好处| 啊灬啊灬别停啊灬用力啊免费| 日本熟妇人妻XXXX| 国产精品JIZZ视频| 亚州AV综合色区无码一区| 精品少妇人妻AV无码专区| 曰本真人性做爰ⅩXX| 欧美大成色WWW永久网站婷| 波多野结衣一二三区AV高清| 少妇侧入内射一区二区| 国产免费AV片在线观看麻豆| 亚洲国产精品久久一线APP| 久久久综合香蕉尹人综合网| 2021国产麻豆剧传媒网站| 日本少妇人妻XXXXX18| 国产精品麻花传媒二三区别| 亚洲精品成人无码| 免费私人家庭影院| 成人区人妻精品一区二区不卡网站 | 久久夜色精品国产亚洲AV动态图 | 日韩精品一区二区三区中文| 国产精品V欧美精品V日韩精品| 亚洲AV永久无码一区| 老头握住校花的双乳| となりの家のネツト在线| 我和岳乱妇三级高清电影| 精品久久久久久无码国产| 50岁老熟女一級毛片| 少妇粉嫩小泬喷水视频在线观看| 国产艳妇AV在线出轨| 玉蒲团Ⅲ艳乳欲仙| 日本乱熟人妻精品乱码涩爱| 国产欧美日韩第一章午夜在线| 一本大道色婷婷在线| 日本WWW一道久久久免费| 国产午夜成人无码免费看不卡| 亚洲中文字幕日产无码成人片| 欧洲码和亚洲码的尺码区别 | 母与子之间的阴阳调和| 公交车上拨开她湿润的内裤| 亚洲精品无码AV专区最新| 欧美极品少妇做受| 国产老妇伦国产熟女老妇久| 樱桃空空人妻无码内射| 三级 丰满 人妻 少妇| 精品乱码一区内射人妻无码| chineSe老女人老熟妇hd| 吸咬奶头狂揉60分钟视频| 免费看片A级毛片免费看| 国产成人久久精品一区二区三区 | 成色好的Y31S标准版| 亚洲欧美V国产蜜芽TV| 欧洲乱码一卡2卡三卡4卡高清| 国产无人区二卡三卡四卡不见星空 | 久久久久久久久久久大尺度免费视| 办公室狂肉校花H陈舒| 亚洲精品欧美精品日韩精品| 人善交VIDEOS欧美3D|