精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 jsinspect 檢測前端代碼庫中的重復/近似代碼

開發 開發工具
在開發的過程中我們往往會存在大量的復制粘貼代碼的行為,這一點在項目的開發初期尤其顯著;而在項目逐步穩定,功能需求逐步完善之后我們就需要考慮對代碼庫的優化與重構,盡量編寫清晰可維護的代碼。

[[187087]]

在開發的過程中我們往往會存在大量的復制粘貼代碼的行為,這一點在項目的開發初期尤其顯著;而在項目逐步穩定,功能需求逐步完善之后我們就需要考慮對代碼庫的優化與重構,盡量編寫清晰可維護的代碼。好的代碼往往是在合理范圍內盡可能地避免重復代碼,遵循單一職責與 Single Source of Truth 等原則,本部分我們嘗試使用 jsinspect 對于代碼庫進行自動檢索,根據其反饋的重復或者近似的代碼片進行合理的優化。當然,我們并不是單純地追求公共代碼地完全剝離化,過度的抽象反而會降低代碼的可讀性與可理解性。jsinspect 利用 babylon 對于 JavaScript 或者 JSX 代碼構建 AST 語法樹,根據不同的 AST 節點類型,譬如 BlockStatement、VariableDeclaration、ObjectExpression 等標記相似結構的代碼塊。我們可以使用 npm 全局安裝 jsinspect 命令:

  1. Usage: jsinspect [options] <paths ...> 
  2.  
  3.  
  4. Detect copy-pasted and structurally similar JavaScript code 
  5. Example use: jsinspect -I -L -t 20 --ignore "test" ./path/to/src 
  6.  
  7.  
  8. Options: 
  9.  
  10.   -h, --help                         output usage information 
  11.   -V, --version                      output the version number 
  12.   -t, --threshold <number>           number of nodes (default: 30) 
  13.   -m, --min-instances <number>       min instances for a match (default: 2) 
  14.   -c, --config                       path to config file (default: .jsinspectrc) 
  15.   -r, --reporter [default|json|pmd]  specify the reporter to use 
  16.   -I, --no-identifiers               do not match identifiers 
  17.   -L, --no-literals                  do not match literals 
  18.   -C, --no-color                     disable colors 
  19.   --ignore <pattern>                 ignore paths matching a regex 
  20.   --truncate <number>                length to truncate lines (default: 100, off: 0) 

我們也可以選擇在項目目錄下添加 .jsinspect 配置文件指明 jsinspect 運行配置:

  1.   "threshold":     30, 
  2.   "identifiers":   true
  3.   "literals":      true
  4.   "ignore":        "test|spec|mock"
  5.   "reporter":      "json"
  6.   "truncate":      100, 

在配置完畢之后,我們可以使用 jsinspect -t 50 --ignore "test" ./path/to/src 來對于代碼庫進行分析,以筆者找到的某個代碼庫為例,其檢測出了上百個重復的代碼片,其中典型的代表如下所示。可以看到在某個組件中重復編寫了多次密碼輸入的元素,我們可以選擇將其封裝為函數式組件,將 label、hintText 等通用屬性包裹在內,從而減少代碼的重復率。

  1. Match - 2 instances 
  2.  
  3. ./src/view/main/component/tabs/account/operation/login/forget_password.js:96,110 
  4. return <div className="my_register__register"
  5.     <div className="item"
  6.         <Paper zDepth={2}> 
  7.             <EnhancedTextFieldWithLabel 
  8.                 label="密碼" 
  9.                 hintText="請輸入密碼,6-20位字母,數字" 
  10.                 onChange={(event, value)=> { 
  11.                     this.setState({ 
  12.                         userPwd: value 
  13.                     }) 
  14.                 }} 
  15.             /> 
  16.         </Paper> 
  17.     </div> 
  18.     <div className="item"
  19.  
  20. ./src/view/main/component/tabs/my/login/forget_password.js:111,125 
  21. return <div className="my_register__register"
  22.     <div className="item"
  23.         <Paper zDepth={2}> 
  24.             <EnhancedTextFieldWithLabel 
  25.                 label="密碼" 
  26.                 hintText="請輸入密碼,6-20位字母,數字" 
  27.                 onChange={(event, value)=> { 
  28.                     this.setState({ 
  29.                         userPwd: value 
  30.                     }) 
  31.                 }} 
  32.             /> 
  33.         </Paper> 
  34.     </div> 
  35.     <div className="item"

筆者也對于 React 源碼進行了簡要分析,在 246 個文件中共發現 16 個近似代碼片,并且其中的大部分重復源于目前基于 Stack 的調和算法與基于 Fiber 重構的調和算法之間的過渡時期帶來的重復,譬如:

  1. Match - 2 instances 
  2.  
  3. ./src/renderers/dom/fiber/wrappers/ReactDOMFiberTextarea.js:134,153 
  4.   var value = props.value; 
  5.   if (value != null) { 
  6.     // Cast `value` to a string to ensure the value is set correctly. While 
  7.     // browsers typically do this as necessary, jsdom doesn't. 
  8.     var newValue = '' + value; 
  9.  
  10.     // To avoid side effects (such as losing text selection), only set value if changed 
  11.     if (newValue !== node.value) { 
  12.       node.value = newValue; 
  13.     } 
  14.     if (props.defaultValue == null) { 
  15.       node.defaultValue = newValue; 
  16.     } 
  17.   } 
  18.   if (props.defaultValue != null) { 
  19.     node.defaultValue = props.defaultValue; 
  20.   } 
  21. }, 
  22.  
  23. postMountWrapper: function(element: Element, props: Object) { 
  24.  
  25. ./src/renderers/dom/stack/client/wrappers/ReactDOMTextarea.js:129,148 
  26.   var value = props.value; 
  27.   if (value != null) { 
  28.     // Cast `value` to a string to ensure the value is set correctly. While 
  29.     // browsers typically do this as necessary, jsdom doesn't. 
  30.     var newValue = '' + value; 
  31.  
  32.     // To avoid side effects (such as losing text selection), only set value if changed 
  33.     if (newValue !== node.value) { 
  34.       node.value = newValue; 
  35.     } 
  36.     if (props.defaultValue == null) { 
  37.       node.defaultValue = newValue; 
  38.     } 
  39.   } 
  40.   if (props.defaultValue != null) { 
  41.     node.defaultValue = props.defaultValue; 
  42.   } 
  43. }, 
  44.  
  45. postMountWrapper: function(inst) { 

筆者認為在新特性的開發過程中我們不一定需要時刻地考慮代碼重構,而是應該相對獨立地開發新功能。***我們再簡單地討論下 jsinspect 的工作原理,這樣我們可以在項目需要時自定義類似的工具以進行特殊代碼的匹配或者提取。jsinspect 的核心工作流可以反映在 inspector.js 文件中:

  1. ...  
  2. this._filePaths.forEach((filePath) => { 
  3.   var src = fs.readFileSync(filePath, {encoding: 'utf8'}); 
  4.   this._fileContents[filePath] = src.split('\n'); 
  5.   var syntaxTree = parse(src, filePath); 
  6.   this._traversals[filePath] = nodeUtils.getDFSTraversal(syntaxTree); 
  7.   this._walk(syntaxTree, (nodes) => this._insert(nodes)); 
  8. }); 
  9.  
  10. this._analyze(); 
  11. ... 

上述流程還是較為清晰的,jsinspect 會遍歷所有的有效源碼文件,提取其源碼內容然后通過 babylon 轉化為 AST 語法樹,某個文件的語法樹格式如下:

  1. Node { 
  2.   type: 'Program'
  3.   start: 0, 
  4.   end: 31, 
  5.   loc: 
  6.    SourceLocation { 
  7.      start: Position { line: 1, column: 0 }, 
  8.      end: Position { line: 2, column: 15 }, 
  9.      filename: './__test__/a.js' }, 
  10.   sourceType: 'script'
  11.   body: 
  12.    [ Node { 
  13.        type: 'ExpressionStatement'
  14.        start: 0, 
  15.        end: 15, 
  16.        loc: [Object], 
  17.        expression: [Object] }, 
  18.      Node { 
  19.        type: 'ExpressionStatement'
  20.        start: 16, 
  21.        end: 31, 
  22.        loc: [Object], 
  23.        expression: [Object] } ], 
  24.   directives: [] } 
  25. './__test__/a.js': [ 'console.log(a);''console.log(b);' ] } 

其后我們通過深度優先遍歷算法在 AST 語法樹上構建所有節點的數組,然后遍歷整個數組構建待比較對象。這里我們在運行時輸入的 -t 參數就是用來指定分割的原子比較對象的維度,當我們將該參數指定為 2 時,經過遍歷構建階段形成的內部映射數組 _map 結構如下:

  1. 'uj3VAExwF***vx0SGBDFu8beU+Lk=': [ [ [Object], [Object] ], [ [Object], [Object] ] ], 
  2.   'eMqg1hUXEFYNbKkbsd2QWECLiYU=': [ [ [Object], [Object] ], [ [Object], [Object] ] ], 
  3.   'gvSCaZfmhte6tfnpfmnTeH+eylw=': [ [ [Object], [Object] ], [ [Object], [Object] ] ], 
  4.   'eHqT9EuPomhWLlo9nwU0DWOkcXk=': [ [ [Object], [Object] ], [ [Object], [Object] ] ] } 

如果有大規模代碼數據的話我們可能形成很多有重疊的實例,這里使用了 _omitOverlappingInstances 函數來進行去重;譬如如果某個實例包含節點 abcd,另一個實例包含節點組 bcde,那么會選擇將后者從數組中移除。另一個優化加速的方法就是在每次比較結束之后移除已經匹配到的代碼片:

  1. _prune(nodeArrays) { 
  2.   for (let i = 0; i < nodeArrays.length; i++) { 
  3.     let nodes = nodeArrays[i]; 
  4.     for (let j = 0; j < nodes.length; j++) { 
  5.       this._removeNode(nodes[j]); 
  6.     } 
  7.   } 
  8. }

【本文是51CTO專欄作者“張梓雄 ”的原創文章,如需轉載請通過51CTO與作者聯系】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2009-07-22 07:45:00

Scala代碼重復

2009-07-15 18:07:47

JDBC代碼

2022-09-23 14:44:31

前端huskyeslint

2022-04-07 10:02:58

前端檢測工具

2021-08-08 08:08:20

木馬無文件Cobalt Stri

2021-04-22 15:08:01

代碼評審郵件

2022-08-01 23:45:23

代碼識別項目

2014-01-08 09:33:57

重復IP地址IP檢測

2021-09-03 08:21:20

前端代碼模塊

2023-12-04 07:06:11

2025-02-17 07:00:00

ORB對象跟蹤器計算機視覺

2023-11-23 13:07:18

代碼Golang

2016-10-19 20:34:46

2023-09-26 08:29:27

2023-05-31 08:00:00

PromptrGPT人工智能

2022-08-28 10:08:53

前端代碼前端

2011-08-24 12:49:56

SQL Server托管代碼

2021-02-26 10:45:49

PyCaret低代碼Python

2020-04-26 10:01:14

編程學習技術

2011-05-05 09:54:05

靜態代碼
點贊
收藏

51CTO技術棧公眾號

亚洲精品亚洲人成在线| 日本视频在线免费观看| 天堂成人国产精品一区| 在线电影中文日韩| 在线能看的av网站| av中文字幕在线观看第一页 | 欧美日韩国产高清一区| 无颜之月在线看| 九色视频网站在线观看| 国产老妇另类xxxxx| 欧美一区二区.| 国产成人av免费在线观看| 秋霞在线一区| 日韩久久免费av| 黄色片在线免费| aa国产成人| 亚洲日本丝袜连裤袜办公室| 久久综合九色99| 99在线小视频| 免费观看成人鲁鲁鲁鲁鲁视频| 久久久久久com| 多男操一女视频| 欧美人妖在线| 亚洲黄色成人网| 性高潮久久久久久| 欧美韩国日本| 91国偷自产一区二区使用方法| 黄色特一级视频| 网友自拍视频在线| 国产精品午夜电影| 欧美不卡在线一区二区三区| 亚洲精品字幕在线| 韩国精品久久久| 国产精品三级美女白浆呻吟| 久久夜色精品国产噜噜亚洲av| 精品动漫3d一区二区三区免费版 | 亚洲开发第一视频在线播放| 天天综合在线视频| 成人国产在线观看| 97netav| 国产又黄又猛又爽| 狠狠色狠狠色综合日日91app| 国产精品成人免费视频| 最新中文字幕一区| 丝袜美腿亚洲一区二区图片| 2019中文字幕在线观看| 国产主播在线观看| 亚洲激情婷婷| 777777777亚洲妇女| 日本中文字幕免费| 日韩一级免费| 欧美亚州一区二区三区| 日韩av在线播| 在线视频免费在线观看一区二区| 97精品国产91久久久久久| 国产亚洲欧美久久久久| 亚洲二区在线| 97在线观看视频国产| 99热只有这里有精品| 亚洲综合激情| 国产精品a久久久久久| 亚洲国产av一区二区三区| 日日夜夜精品视频免费| 国产精品久久久久久久久久东京| 国产精品xxxxxx| 麻豆91在线播放免费| 成人黄色影片在线| 精品人妻无码一区二区三区蜜桃一 | 狠狠干狠狠操视频| 日本一区二区三区播放| 亚洲аv电影天堂网| 一本加勒比波多野结衣| 少妇精品久久久一区二区| 在线免费观看羞羞视频一区二区| 国精产品一区一区| 欧美精品九九| 国产91成人在在线播放| 精品乱码一区内射人妻无码| 极品美女销魂一区二区三区 | 日本在线精品视频| 一级黄色片在线| 国产成人一区在线| 久久久久久久久久久久久久一区| 国产高清视频在线播放| 亚洲欧美日韩国产成人精品影院 | 久久字幕精品一区| 国产日韩欧美在线播放| 亚洲精品97久久中文字幕| 91网站在线播放| 中文字幕一区综合| 欧美日韩国产观看视频| 欧美日韩精品高清| 好男人香蕉影院| 久久视频国产| 97精品视频在线| 中文字幕在线日亚洲9| 高清不卡一区二区在线| 欧美在线激情| 美女尤物在线视频| 欧美视频一区二区三区在线观看| 国产99在线|中文| 欧美性潮喷xxxxx免费视频看| 牛牛精品视频在线| 91九色最新地址| av在线天堂网| 欧美在线色图| 97精品久久久中文字幕免费| 亚洲一区二区人妻| 91视频91自| 激情六月天婷婷| a成人v在线| 精品国产乱码久久久久久免费| 精品人妻中文无码av在线| 在线精品观看| 亚洲一区二区三区在线视频 | 91免费在线看| 真人做人试看60分钟免费| 欧美精品高清| 欧美精品成人网| 91啦中文在线| 精品国产91乱高清在线观看| 日韩午夜电影av| 香蕉久久夜色| 原纱央莉成人av片| 亚洲第一区在线| 欧美日韩综合一区二区| 美腿丝袜在线亚洲一区| 久久视频在线观看中文字幕| 亚洲七七久久综合桃花剧情介绍| 欧美日韩国产色站一区二区三区| 天天躁日日躁aaaa视频| 国产日韩欧美三区| 国产精品综合久久久久久| 伊人222成人综合网| 欧美日韩国产成人在线免费| 色屁屁草草影院ccyy.com| 午夜一区不卡| 欧美乱偷一区二区三区在线| 日本午夜大片a在线观看| 亚洲第一页在线| 欧美丰满艳妇bbwbbw| 国产一区二区网址| 日韩最新中文字幕| 4438五月综合| 久久成人18免费网站| 国产毛片一区二区三区va在线| 中文字幕一区二区三区视频| 中文字幕精品一区二区三区在线| 日韩国产欧美一区二区| 国产一区二区在线播放| 欧美午夜电影一区二区三区| 欧美日韩国产电影| 日韩a级片在线观看| 国产乱码精品一区二区三| 中文字幕人成一区| 久久视频免费| 欧美精品福利视频| 香港三日本三级少妇66| 欧美性xxxxxxx| 久久久久无码精品国产sm果冻| 久久人人精品| 亚洲自拍三区| 日韩在线观看一区二区三区| 欧美激情二区三区| 日本精品在线免费观看| 992tv国产精品成人影院| 欧美电影一区二区| 免费在线观看黄视频| 成人黄色在线网站| 国产欧美高清在线| 日韩在线欧美| 91国产丝袜在线放| 忘忧草在线日韩www影院| 亚洲天堂成人在线视频| 国产婷婷在线视频| 午夜精品久久久久久久99水蜜桃| 国产三级av在线播放| 久久99蜜桃精品| 国产美女主播在线| 欧美限制电影| 91中文字幕一区| 二区三区不卡| 美日韩丰满少妇在线观看| 国产成人手机在线| 欧美网站一区二区| 韩国成人一区| 亚洲女人18毛片水真多| 色哟哟一区二区| 国产高潮国产高潮久久久91| 26uuu久久综合| 三级黄色片播放| 亚洲欧美激情诱惑| 亚洲天堂av免费在线观看| 国产精伦一区二区三区| 国产精品久久久久久av福利软件| 在线观看a级片| 亚洲人午夜精品免费| www天堂在线| 91精品福利视频| 精品少妇久久久| 国产精品欧美一区喷水| 在线观看av中文字幕| 激情综合色综合久久| 欧美成人xxxxx| 综合天天久久| 亚洲精品国产精品国自产| 国产三级精品三级在线观看国产| 国产精品免费一区豆花| av资源中文在线| www.日韩.com| 国产三级在线免费| 亚洲第一页中文字幕| va婷婷在线免费观看| 欧美综合天天夜夜久久| 一区二区三区视频免费看| 亚洲特黄一级片| 午夜时刻免费入口| 91影院在线观看| 亚洲精品无码一区二区| 国内成+人亚洲+欧美+综合在线| 一本色道无码道dvd在线观看| 精品成人国产| av无码久久久久久不卡网站| 91精品动漫在线观看| 日韩精品一区二区三区四区五区 | 免费亚洲一区| 蜜臀av色欲a片无码精品一区| 午夜av一区| 亚洲理论电影| 欧美一区二区在线不卡| 亚洲欧洲一区二区福利| 妖精一区二区三区精品视频| 高清视频在线观看一区| 日韩在线网址| 在线免费av一区| 欧美日韩成人综合天天影院 | 日韩最新免费不卡| 国产在线免费观看| 亚洲老司机av| 三级做a全过程在线观看| 精品sm在线观看| 亚洲国产精品18久久久久久| 日韩欧美国产精品| 亚洲AV无码国产精品午夜字幕| 欧美一区二区不卡视频| 999久久久久| 欧美一级黄色大片| 性生活三级视频| 亚洲福利影片在线| 色欲av永久无码精品无码蜜桃| 精品国产乱码久久久久久久久| www.xxx国产| 亚洲第一网站男人都懂| 色av男人的天堂免费在线| 亚洲性69xxxbbb| 免费在线观看av| 久久国产精品网站| 黄色大片在线| 91av在线国产| www.一区| 亚洲综合精品伊人久久| 超碰地址久久| 欧洲一区二区日韩在线视频观看免费| 成人婷婷网色偷偷亚洲男人的天堂| 一区二区三区四区视频在线| 夜间精品视频| 人妻无码久久一区二区三区免费| 99在线精品视频在线观看| 免费观看成人在线视频| 久久综合综合久久综合| ass极品水嫩小美女ass| caoporn国产一区二区| 国产真实乱人偷精品人妻| 国产精品沙发午睡系列990531| 欧美黑人猛猛猛| 精品二区三区线观看| 亚洲男人天堂网址| 日韩一区二区三区视频在线| 四虎影视2018在线播放alocalhost| 国产亚洲激情视频在线| 中文字幕中文字幕在线中高清免费版| 久久全国免费视频| 成人在线观看免费视频| 成人午夜影院在线观看| 国产99久久| 一本二本三本亚洲码| 国产日韩精品视频一区二区三区 | 91麻豆123| 希岛爱理中文字幕| 色欧美日韩亚洲| www三级免费| 中文字幕在线成人| 日产福利视频在线观看| 99久久精品国产毛片| 国产黄色录像视频| 亚洲成人精品一区二区| 热99这里只有精品| xvideos.蜜桃一区二区| 色综合久久久久久久久五月| 欧美视频二区| 亚洲欧美偷拍另类| 26uuu久久天堂性欧美| 国产这里有精品| 在线观看日韩一区| 特级丰满少妇一级aaaa爱毛片| 少妇精69xxtheporn| 黄视频网站在线观看| 亚洲qvod图片区电影| 欧美亚洲高清| 日韩视频在线免费看| av亚洲产国偷v产偷v自拍| 中文乱码字幕高清一区二区| 色妹子一区二区| 欧美一级特黄aaaaaa| 久久综合电影一区| 91在线成人| 欧洲亚洲一区二区| 久久激情婷婷| 老司机福利av| 午夜精品免费在线| 免费观看国产精品| 久久99热精品| 五月亚洲婷婷| 黄色一级片av| 韩国三级在线一区| 欧美日韩色视频| 欧美日本视频在线| www.亚洲免费| 国产精品视频1区| 国产在视频线精品视频www666| 欧美亚洲另类色图| 97久久久精品综合88久久| 精品视频久久久久| 日韩久久久精品| 青青草视频在线免费直播| 亚洲xxxxx| 综合一区二区三区| 手机av在线网站| 亚洲免费看黄网站| 99久久国产热无码精品免费| 久久视频在线播放| 秋霞午夜一区二区三区视频| 日本a级片在线观看| 国产精品1区二区.| 久草成人在线视频| 欧美mv日韩mv国产| 福利影院在线看| 久久久人人爽| 玖玖国产精品视频| 国产在线免费av| 欧美精品在线观看播放| 成人video亚洲精品| 99在线观看视频| 99在线精品免费视频九九视| 国产精品毛片一区二区| 欧美性极品少妇| 国产黄a三级三级三级av在线看| 亚洲综合中文字幕68页| 在线精品一区| 午夜精产品一区二区在线观看的| 欧美三级韩国三级日本三斤| 求av网址在线观看| yellow视频在线观看一区二区| 国产精品乱看| av在线播放中文字幕| 日韩一区二区在线看片| gogo高清午夜人体在线| 麻豆一区区三区四区产品精品蜜桃| 久久最新视频| 97成人资源站| 亚洲精品按摩视频| 成人一级视频| 欧美乱做爰xxxⅹ久久久| 99精品黄色片免费大全| 99re热视频| 久久久久成人精品| 精品产国自在拍| 日韩久久久久久久久久久| 天天综合天天综合色| 91在线不卡| 国产一级特黄a大片99| 秋霞av亚洲一区二区三| 男女免费视频网站| 亚洲最新视频在线| 在线播放一区二区精品视频| 久久国产乱子伦免费精品| 亚洲欧美一区二区三区极速播放 | 亚洲少妇中文在线| 国产精品国产亚洲精品| 妺妺窝人体色www在线小说| 国产精品久久精品日日| 手机在线观看毛片| 成人a视频在线观看| 亚洲综合丁香| 国产一级做a爱免费视频| 夜夜嗨av色一区二区不卡| 韩国精品福利一区二区三区| 亚洲免费看av| 精品毛片三在线观看| 国产三级在线播放|