搜尋
首頁開發工具VSCode聊聊在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)
    })
}

而監聽頁面元素的點擊事件則透過事件代理的方式全域監聽,給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)
}

对于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模板中分割的每一行标签元素添加最终的位置属性。这里采用的是正则替换的方式来添加位置属性,分别对每一行标签元素先正则匹配出所有元素的开始标签部分,例如

聊聊在VSCode中怎麼點選DOM 自動定位到對應程式碼行?

function addLineAttr(lineStr, line, resourcePath) {
  let reg = / {
      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()
  ]
}

总结

以上就是对页面元素代码映射插件核心原理和接入方案的介绍,实现的方式充分利用了项目代码打包构建的流程,实际上无论是哪个打包工具,本质上都是对源码文件的转换处理,当我们理解了打包工具的运行机制后,就可以做一些自己认为有意义的事。就拿页面元素代码映射插件来说,使用它可以极大提升开发效率,不再需要花费时间在寻找代码文件上,特别是页面数和组件数比较多的项目,只需点击页面元素,即可一键打开对应代码文件,精准定位具体代码行,无需查找,哪里不会点哪里,so easy!

更多关于VSCode的相关知识,请访问:vscode教程

以上是聊聊在VSCode中怎麼點選DOM 自動定位到對應程式碼行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
Visual Studio:探索定價和許可選項Visual Studio:探索定價和許可選項Apr 13, 2025 am 12:03 AM

VisualStudio提供三種版本:Community免費版適用於個人和小型團隊,Professional付費版適合專業開發者和中小型團隊,Enterprise旗艦版面向大型企業和復雜項目。

Visual Studio的價值:權衡成本與其收益Visual Studio的價值:權衡成本與其收益Apr 12, 2025 am 12:06 AM

VisualStudio在.NET开发中价值高,因其功能强大且全面。尽管成本和资源消耗较高,但其带来的效率提升和开发体验改善显著。对于个人开发者和小型团队,Community版是理想选择;大型企业则适合Professional或Enterprise版。

Visual Studio的可用性:哪些版本是免費的?Visual Studio的可用性:哪些版本是免費的?Apr 10, 2025 am 09:44 AM

VisualStudio的免費版本包括VisualStudioCommunity和VisualStudioCode。 1.VisualStudioCommunity適用於個人開發者、開源項目和小型團隊,功能強大,適合個人項目和學習編程。 2.VisualStudioCode是一個輕量級的代碼編輯器,支持多種編程語言和擴展,啟動速度快,資源佔用少,適合需要靈活性和可擴展性的開發者。

如何為Windows 8安裝Visual Studio?如何為Windows 8安裝Visual Studio?Apr 09, 2025 am 12:19 AM

在Windows8上安裝VisualStudio的步驟如下:1.從微軟官方網站下載VisualStudioCommunity2019安裝包。 2.運行安裝程序並選擇所需組件。 3.完成安裝後即可使用。注意選擇與Windows8兼容的組件,並確保有足夠的磁盤空間和管理員權限。

我的計算機可以運行與代碼嗎?我的計算機可以運行與代碼嗎?Apr 08, 2025 am 12:16 AM

VSCode可以在大多數現代電腦上運行,只要滿足基本系統要求:1.操作系統:Windows7及以上,macOS10.9及以上,Linux;2.處理器:1.6GHz或更快;3.內存:至少2GBRAM(推薦4GB或更高);4.存儲空間:至少200MB可用空間。通過優化設置和減少擴展使用,可以在低配置電腦上獲得流暢的使用體驗。

如何使程序與Windows 8兼容?如何使程序與Windows 8兼容?Apr 07, 2025 am 12:09 AM

要讓程序在Windows8上順暢運行,需採取以下步驟:1.使用兼容性模式,通過代碼檢測並啟用該模式。 2.調整API調用,根據Windows版本選擇適當的API。 3.進行性能優化,盡量避免使用兼容性模式,優化API調用並使用通用控件。

VS代碼在Windows 8上有效嗎?VS代碼在Windows 8上有效嗎?Apr 06, 2025 am 12:13 AM

Yes,VSCodeiscompatiblewithWindows8.1)DownloadtheinstallerfromtheVSCodewebsiteandensurethelatest.NETFrameworkisinstalled.2)Installextensionsusingthecommandline,notingsomemayloadslower.3)Manageperformancebyclosingunnecessaryextensions,usinglightweightt

VS代碼和Visual Studio有什麼區別?VS代碼和Visual Studio有什麼區別?Apr 05, 2025 am 12:07 AM

VSCode是輕量級代碼編輯器,適用於多種語言和擴展;VisualStudio是功能強大的IDE,主要用於.NET開發。 1.VSCode基於Electron,支持跨平台,使用Monaco編輯器。 2.VisualStudio使用微軟自主技術棧,集成調試和編譯器。 3.VSCode適合簡單任務,VisualStudio適合大型項目。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。