<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當一個專案開發時間較長以後,總會存在一些重複的程式碼,這就給維護和擴充套件帶來障礙。
特別是我們的前端專案,多個專案中都存在一些較相似的功能,這部分之前不少採用複製貼上的方式處理。於是為了優化前端專案的程式碼,最近我們考慮使用程式碼重複度來作為衡量指標,對單個或多個專案進行重複程式碼的統計,並著手重構可優化的重複程式碼。
而為了統計專案中是否有程式碼重複,我們使用了 jscpd
工具庫,本文將詳細介紹該工具的使用方法。
jscpd是一個開源的js工具庫,用於檢測專案的程式碼重複率,針對複製貼上的程式碼尤其有效,支援超過150種的原始碼檔案格式。
我們在前端專案中,無論是原生的javascript、css、html程式碼,還是使用typescript、less、vue、react等程式碼,都能較好的識別出專案中的重複程式碼。
當然,這裡的重複,更多的指程式碼完全重複,即程式碼行與程式碼字串,都相同。
下面,先看下如何使用它。
我們先以全域性方式,安裝該工具庫:
npm install jscpd -g
安裝成功後,系統就有一個全域性命令 jscpd
,可以檢視版本號,當前最新版本是 3.5.3
,如下所示:
$ jscpd -V 3.5.3
安裝成功後,我們就可以很方便的使用它。
例如,我們需要統計一個檔案 app.js
,只需要在檔案目錄執行以下命令:
jscpd ./app.js
執行成功後,在命令列介面會顯示結果,如下圖所示:
圖中的內容,我們下面一一做個說明說明:
Clone found (javascript)
顯示找到的拷貝的重複程式碼塊,這裡是javascript檔案。HTML report saved to reporthtml
這句話的意思是,會在檔案目錄下輸出對應報告的html頁面,一般預設是 reporthtml
目錄下,用於在頁面中展示結果。Format
檔案格式,這裡是 javascript
,還可以是 typescript
、tsx
等。Files analyzed
已分析的檔案數量,統計專案中的程式碼檔案數。Total lines
所有檔案的總行數。Total tokens
所有的token數量。識別符號/變數等
、數位
、字串
、空格
或 符號
等等作為一個 token
來統計數量。Clones found
找到拷貝的重複塊數量。Duplicated lines
重複的程式碼行數,以及佔比。Total
行裡,重複程式碼的佔比就是程式碼行的重複度了,這裡是18.1%。Duplicated tokens
重複的token數量,以及佔比。Found 0 clones
找到了1個重複塊。Detection time
檢測耗時。由此可知,./app.js
檢測1個檔案,發現了1個重複快,在總行數為105行的程式碼中,共有19行程式碼完全重複,重複度為 18.1%
。
以上範例是比較簡單的,直接檢測單個檔案,通過命令列檢測單個檔案,列印結果,並預設生成report報告的頁面。
如果是在當前主流的前端專案中,由於很多檔案是輔助工具如依賴包、構建、檔案等,並不是有效的程式碼,需要排除。這種情況下,我們一般使用組態檔的方式,通過選項設定規範 jscpd
的使用場景。
jscpd
的設定選項可以通過以下兩種方式建立:
.jscpd.json
,然後在該檔案中增加具體的設定選項;package.json
檔案中新增如果專案根目錄下沒有 package.json
檔案,可以自行新增一個,然後在該件中個增加對應的設定。
無論是Vue還是React專案,使用大致都一樣,如下,在 package.json
中增加 jscpd
設定屬性:
"jscpd": { "threshold": 1, "reporters": [ "html", "console" ], "ignore": [ ".git", "node_modules", "public", ".husky" ], "format": ["javascript", "typescript"], "absolute": true }
以上是一個常用的設定,具體說明:
threshold 表示重複度的閾值,超過這個值,就會列印錯誤報警。
ERROR: jscpd found too many duplicates (18.1%) over threshold (1%)
。reporters 表示生成結果檢測報告的方式,一般有以下幾種:
html
頁面json
格式的檔案報告xml
格式的檔案報告csv
格式的檔案報告md
格式的檔案報告debug
資訊ignore
format
javascript
、typescript
、css
等absolute
除此以外,還有很多設定屬性,我們這裡不在一一介紹。
上面介紹會輸出重複度檢測報告,我們在專案中設定好組態檔以後,執行以下命令:
jscpd ./src -o 'report'
專案中的業務程式碼,通常會選擇放在 ./src
目錄下,所以我們可以直接檢測該目錄。-o 'report'
通過命令列引數,輸出檢測報告到專案根目錄下的 report
資料夾中——當然也可以自定義目錄,這時候就會生成對應的頁面檔案:
如上所示,本質上是一個本地網頁,而且是基於 VUE
框架建立的網頁,可以在瀏覽器存取檢視,介面長這樣:
從上圖可知,檢測了149個檔案,其中存在8塊拷貝複製的程式碼,程式碼行計算的重複度是 1.18%
,非常直觀。
通過生成本地網頁直接展示所有的檢測報告,並且還能檢視到重複的程式碼在哪:
上圖可以看到,在兩個 tsx
元件檔案中,存在一段重複的程式碼,也標識除了這兩段程式碼在檔案中具體行數。
上面介紹的是單個專案的重複度檢測,如果有多個專案,且存在程式碼的複製貼上現象,也可以通過jscpd工具進行檢測處理。
我們只需要在多個專案的上層目錄下新建一個 package.json
檔案,設定相應的設定選項,就能根據設定檢測這些專案間的重複程式碼。這裡需要注意的是,一般只需要檢測業務程式碼 src
,在組態檔中 ignore
屬性的忽略目錄,需要帶上各專案的專案名稱。
"ignore": [ "project1/.git", "project1/node_modules", "project2/.git", "project2/node_modules" // ... ]
這樣,就能快速檢測出多個專案中的重複程式碼,仍然可在命令列輸出基本資訊,以及對應的report頁面報告。
當我們使用jscpd執行專案的重複度檢測時,由於一些重複程式碼可能是必要的,不想檢測,可以使用程式碼註釋標識的方式,讓這部分程式碼不用檢測。
在程式碼的首尾位置新增相應註釋,jscpd:ignore-start
和 jscpd:ignore-end
,包裹程式碼即可。
如在js程式碼中,可以這樣使用:
/* jscpd:ignore-start */ import { provide, computed, watch, onMounted, defineComponent } from 'vue' import { useStore } from 'vuex' /* jscpd:ignore-end */
在css及各種預處理中,也是與js中的用法一樣:
/* jscpd:ignore-start */ .content { height: 100vh; width: 100vw; display: flex; justify-content: center; align-items: center; overflow: hidden; } /* jscpd:ignore-end */
如下在html中的使用:
<!-- // jscpd:ignore-start --> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <!-- // jscpd:ignore-end -->
通過以上註釋標識以後,這部分的程式碼就不會再被統計為重複程式碼了。
以上可知,jscpd工具的使用是非常簡單的,只需要少許設定就能輸出比較直觀的程式碼資料,方便我們統計程式碼的重複度。
知道了專案中的重複程式碼,給我們優化程式碼結構,提煉程式碼邏輯,增強程式碼的可維護性、可延伸性和可複用性方面,都能帶來比較多的好處,研發效率的提高也是隨之而來的。
但需要知道的是,該工具統計的都是程式碼完全相同情形下的重複,如果有變數名或識別符號改動的則難以檢測到,就更別提程式碼邏輯上的重複了。
以上就是jscpd統計專案中的程式碼重複度使用詳解的詳細內容,更多關於jscpd統計程式碼重複度的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45