欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jscpd統(tǒng)計項目中的代碼重復(fù)度使用詳解

 更新時間:2023年03月28日 14:18:57   作者:jimojianghu  
這篇文章主要為大家介紹了jscpd統(tǒng)計項目中的代碼重復(fù)度使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

當(dāng)一個項目開發(fā)時間較長以后,總會存在一些重復(fù)的代碼,這就給維護(hù)和擴展帶來障礙。

特別是我們的前端項目,多個項目中都存在一些較相似的功能,這部分之前不少采用復(fù)制粘貼的方式處理。于是為了優(yōu)化前端項目的代碼,最近我們考慮使用代碼重復(fù)度來作為衡量指標(biāo),對單個或多個項目進(jìn)行重復(fù)代碼的統(tǒng)計,并著手重構(gòu)可優(yōu)化的重復(fù)代碼。

而為了統(tǒng)計項目中是否有代碼重復(fù),我們使用了 jscpd 工具庫,本文將詳細(xì)介紹該工具的使用方法。

jscpd是什么

jscpd是一個開源的js工具庫,用于檢測項目的代碼重復(fù)率,針對復(fù)制粘貼的代碼尤其有效,支持超過150種的源碼文件格式。

我們在前端項目中,無論是原生的javascript、css、html代碼,還是使用typescript、less、vue、react等代碼,都能較好的識別出項目中的重復(fù)代碼。

當(dāng)然,這里的重復(fù),更多的指代碼完全重復(fù),即代碼行與代碼字符串,都相同。

如何使用它

下面,先看下如何使用它。

安裝

我們先以全局方式,安裝該工具庫:

npm install jscpd -g

安裝成功后,系統(tǒng)就有一個全局命令 jscpd,可以查看版本號,當(dāng)前最新版本是 3.5.3,如下所示:

$ jscpd -V
3.5.3

安裝成功后,我們就可以很方便的使用它。

示例

例如,我們需要統(tǒng)計一個文件 app.js,只需要在文件目錄執(zhí)行以下命令:

jscpd ./app.js

執(zhí)行成功后,在命令行界面會顯示結(jié)果,如下圖所示:

圖中的內(nèi)容,我們下面一一做個說明說明:

  • Clone found (javascript)顯示找到的拷貝的重復(fù)代碼塊,這里是javascript文件。
    并且會顯示重復(fù)代碼在文件中具體的行數(shù),便于查找。
  • HTML report saved to report\html\這句話的意思是,會在文件目錄下輸出對應(yīng)報告的html頁面,一般默認(rèn)是 report\html\ 目錄下,用于在頁面中展示結(jié)果。
  • Format文件格式,這里是 javascript,還可以是 typescripttsx 等。
  • Files analyzed已分析的文件數(shù)量,統(tǒng)計項目中的代碼文件數(shù)。
  • Total lines所有文件的總行數(shù)。
    這里只有一個文件,總行數(shù)是105行。
  • Total tokens所有的token數(shù)量。
    這里一般以 標(biāo)識符/變量等、數(shù)字、字符串、空格符號 等等作為一個 token 來統(tǒng)計數(shù)量。
    一行代碼一般包含幾個到幾十個不等的token數(shù)量。
  • Clones found找到拷貝的重復(fù)塊數(shù)量。
  • Duplicated lines重復(fù)的代碼行數(shù),以及占比。
    在表格的 Total 行里,重復(fù)代碼的占比就是代碼行的重復(fù)度了,這里是18.1%。
  • Duplicated tokens重復(fù)的token數(shù)量,以及占比。
  • Found 0 clones找到了1個重復(fù)塊。
  • Detection time檢測耗時。

由此可知,./app.js 檢測1個文件,發(fā)現(xiàn)了1個重復(fù)快,在總行數(shù)為105行的代碼中,共有19行代碼完全重復(fù),重復(fù)度為 18.1%。

配置選項

以上示例是比較簡單的,直接檢測單個文件,通過命令行檢測單個文件,打印結(jié)果,并默認(rèn)生成report報告的頁面。
如果是在當(dāng)前主流的前端項目中,由于很多文件是輔助工具如依賴包、構(gòu)建、文檔等,并不是有效的代碼,需要排除。這種情況下,我們一般使用配置文件的方式,通過選項配置規(guī)范 jscpd 的使用場景。

jscpd 的配置選項可以通過以下兩種方式創(chuàng)建:

  • 在項目根目錄下創(chuàng)建配置文件 .jscpd.json,然后在該文件中增加具體的配置選項;
  • 也可以直接在 package.json 文件中添加

如果項目根目錄下沒有 package.json 文件,可以自行添加一個,然后在該件中個增加對應(yīng)的配置。

無論是Vue還是React項目,使用大致都一樣,如下,在 package.json 中增加 jscpd 配置屬性:

"jscpd": {
  "threshold": 1,
  "reporters": [
    "html",
    "console"
  ],
  "ignore": [
    ".git",
    "node_modules",
    "public",
    ".husky"
  ],
  "format": ["javascript", "typescript"],
  "absolute": true
}

以上是一個常用的配置,具體說明:

threshold 表示重復(fù)度的閾值,超過這個值,就會打印錯誤報警。

  • 如閾值設(shè)為 1,當(dāng)重復(fù)度為18.1%時,會報錯:ERROR: jscpd found too many duplicates (18.1%) over threshold (1%)。
    雖然報錯,但代碼的檢測仍然會正常完成。

reporters 表示生成結(jié)果檢測報告的方式,一般有以下幾種:

  • console:控制臺打印
  • html:創(chuàng)建可訪問的 html 頁面
  • json:輸出 json 格式的文件報告
  • xml:輸出 xml 格式的文件報告
  • csv:輸出 csv 格式的文件報告
  • markdown:輸出 md 格式的文件報告
  • consoleFull:控制臺完整打印重復(fù)代碼塊
  • verbose:控制臺輸出 debug 信息

ignore

  • 檢測時會忽略的文件目錄或文件,用于過濾一些非業(yè)務(wù)代碼,如依賴包、構(gòu)建或靜態(tài)文件等

format

  • 需要進(jìn)行重復(fù)度檢測的源代碼格式,目前支持150多種,我們常用的如 javascript、typescript、css

absolute

  • 在檢測報告中使用絕對路徑

除此以外,還有很多配置屬性,我們這里不在一一介紹。

輸出報告

上面介紹會輸出重復(fù)度檢測報告,我們在項目中設(shè)置好配置文件以后,執(zhí)行以下命令:

jscpd ./src -o 'report'

項目中的業(yè)務(wù)代碼,通常會選擇放在 ./src 目錄下,所以我們可以直接檢測該目錄。
-o 'report' 通過命令行參數(shù),輸出檢測報告到項目根目錄下的 report 文件夾中——當(dāng)然也可以自定義目錄,這時候就會生成對應(yīng)的頁面文件:

如上所示,本質(zhì)上是一個本地網(wǎng)頁,而且是基于 VUE 框架創(chuàng)建的網(wǎng)頁,可以在瀏覽器訪問查看,界面長這樣:

從上圖可知,檢測了149個文件,其中存在8塊拷貝復(fù)制的代碼,代碼行計算的重復(fù)度是 1.18%,非常直觀。

通過生成本地網(wǎng)頁直接展示所有的檢測報告,并且還能查看到重復(fù)的代碼在哪:

上圖可以看到,在兩個 tsx 組件文件中,存在一段重復(fù)的代碼,也標(biāo)識除了這兩段代碼在文件中具體行數(shù)。

多個項目

上面介紹的是單個項目的重復(fù)度檢測,如果有多個項目,且存在代碼的復(fù)制粘貼現(xiàn)象,也可以通過jscpd工具進(jìn)行檢測處理。
我們只需要在多個項目的上層目錄下新建一個 package.json 文件,設(shè)置相應(yīng)的配置選項,就能根據(jù)設(shè)置檢測這些項目間的重復(fù)代碼。這里需要注意的是,一般只需要檢測業(yè)務(wù)代碼 src,在配置文件中 ignore 屬性的忽略目錄,需要帶上各項目的項目名稱。

"ignore": [
  "project1/.git",
  "project1/node_modules",
  "project2/.git",
  "project2/node_modules"
  // ...
]

這樣,就能快速檢測出多個項目中的重復(fù)代碼,仍然可在命令行輸出基本信息,以及對應(yīng)的report頁面報告。

規(guī)避代碼檢測

當(dāng)我們使用jscpd執(zhí)行項目的重復(fù)度檢測時,由于一些重復(fù)代碼可能是必要的,不想檢測,可以使用代碼注釋標(biāo)識的方式,讓這部分代碼不用檢測。
在代碼的首尾位置添加相應(yīng)注釋,jscpd:ignore-startjscpd:ignore-end,包裹代碼即可。

如在js代碼中,可以這樣使用:

/* jscpd:ignore-start */
import { provide, computed, watch, onMounted, defineComponent } from 'vue'
import { useStore } from 'vuex'
/* jscpd:ignore-end */

在css及各種預(yù)處理中,也是與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
-->

通過以上注釋標(biāo)識以后,這部分的代碼就不會再被統(tǒng)計為重復(fù)代碼了。

總結(jié)

以上可知,jscpd工具的使用是非常簡單的,只需要少許配置就能輸出比較直觀的代碼數(shù)據(jù),方便我們統(tǒng)計代碼的重復(fù)度。

知道了項目中的重復(fù)代碼,給我們優(yōu)化代碼結(jié)構(gòu),提煉代碼邏輯,增強代碼的可維護(hù)性、可擴展性和可復(fù)用性方面,都能帶來比較多的好處,研發(fā)效率的提高也是隨之而來的。

但需要知道的是,該工具統(tǒng)計的都是代碼完全相同情形下的重復(fù),如果有變量名或標(biāo)識符改動的則難以檢測到,就更別提代碼邏輯上的重復(fù)了。

以上就是jscpd統(tǒng)計項目中的代碼重復(fù)度使用詳解的詳細(xì)內(nèi)容,更多關(guān)于jscpd統(tǒng)計代碼重復(fù)度的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • lodash內(nèi)部方法getFuncName及setToString剖析詳解

    lodash內(nèi)部方法getFuncName及setToString剖析詳解

    本篇章我們主要是通過了解lodash里的兩個內(nèi)部方法getFuncName方法和setToString方法,在實際開發(fā)中我們也可以借鑒方法的實現(xiàn)思路,在需要的時候簡單封裝一下,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 微信小程序支付之c#后臺實現(xiàn)方法

    微信小程序支付之c#后臺實現(xiàn)方法

    這篇文章主要介紹了微信小程序支付之c#后臺實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • JavaScript利用html5新方法操作元素類名詳解

    JavaScript利用html5新方法操作元素類名詳解

    這篇文章主要給大家分享的是JavaScript用html5新方法操作元素類名的詳解,早先JavaScript處理起來特別不方便,需要先取到class屬性,然后對字符串進(jìn)行處理?,F(xiàn)在html5給所有元素增加了classList屬性來操作類屬性,非常方便,下面就一起來看看具體操作過程吧
    2021-11-11
  • JS滾動到頂部踩坑解決記錄

    JS滾動到頂部踩坑解決記錄

    這篇文章主要為大家介紹了一次JS滾動到頂部踩坑解決記錄過程分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 使用MUI框架模擬手機端的下拉刷新和上拉加載功能

    使用MUI框架模擬手機端的下拉刷新和上拉加載功能

    mui框架基于htm5plus的XMLHttpRequest,封裝了常用的Ajax函數(shù)。本文重點給大家介紹使用MUI框架模擬手機端的下拉刷新和上拉加載功能,感興趣的朋友參考下吧
    2017-09-09
  • 使用純JavaScript封裝一個消息提示條功能示例詳解

    使用純JavaScript封裝一個消息提示條功能示例詳解

    這篇文章主要為大家介紹了使用純JavaScript封裝一個消息提示條功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • JavaScript的模塊化開發(fā)框架Sea.js上手指南

    JavaScript的模塊化開發(fā)框架Sea.js上手指南

    Sea.js的目的是追求簡單的代碼書寫和組織方式,Sea.js并沒有過多功能而是主要對前端程序的部署結(jié)構(gòu)作出約束,下面我們就來看一下JavaScript的模塊化開發(fā)框架Sea.js上手指南:
    2016-05-05
  • JavaScript 定時器詳情

    JavaScript 定時器詳情

    這篇文章主要介紹了JavaScript 定時器,在JavaScript中定時器有兩個 setInterval() 與 setTimeout() 分別還有取消定時器的方法,下面來看看文章的詳細(xì)介紹
    2021-11-11
  • 微信小程序 wxapp畫布 canvas詳細(xì)介紹

    微信小程序 wxapp畫布 canvas詳細(xì)介紹

    這篇文章主要介紹了微信小程序 wxapp畫布 canvas的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Dragonfly P2P 傳輸協(xié)議優(yōu)化代碼解析

    Dragonfly P2P 傳輸協(xié)議優(yōu)化代碼解析

    這篇文章主要為大家介紹了Dragonfly P2P 傳輸協(xié)議優(yōu)化代碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評論