精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲乱码精品久久久久.. | 日韩中文视频| 国产日产欧美一区二区三区 | 九九99久久精品在免费线bt| 亚洲无线码一区二区三区| 精品无码久久久久久久动漫| 中文字幕日本视频| 国内精品99| 亚洲性视频网址| 欧美人与性动交α欧美精品| 亚洲精品永久免费视频| 亚洲日本乱码在线观看| 久久伊人资源站| 国产精品综合在线| 免费视频一区| 欧美区在线播放| 摸摸摸bbb毛毛毛片| 我要色综合中文字幕| 91黄色免费看| 9色porny| 国产二区三区在线| 久久久久久综合| 高清视频一区| 97精品人妻一区二区三区在线| 香蕉久久夜色精品| 久久久久久久久中文字幕| 女教师淫辱の教室蜜臀av软件| 国内露脸中年夫妇交换精品| 在线不卡的av| 美女一区二区三区视频| 国产直播在线| 亚洲人成网站影音先锋播放| 日本精品一区二区| 天天av天天翘| 粉嫩aⅴ一区二区三区四区 | 亚洲欧美日本国产| 欧美日韩高清影院| 国产一级特黄a大片免费| 黄色激情在线播放| 亚洲午夜免费电影| 高清无码一区二区在线观看吞精| 91看片在线观看| 久久久久久久网| 国产在线一区二区三区欧美| 国产视频在线免费观看| 久久国产精品无码网站| 国产精品高潮粉嫩av| 久久亚洲精品国产| 日韩午夜免费视频| 性色av一区二区咪爱| 欧美毛片在线观看| 国产精品二区影院| 欧美高清视频在线| 免费中文字幕视频| 国产中文一区| 欧美极品少妇xxxxⅹ裸体艺术| 东方av正在进入| 婷婷中文字幕一区| 久久久黄色av| 黄色一级大片在线免费观看| 亚洲国产精品成人| 欧美人与性动交a欧美精品| 99成人在线观看| 久久久久久久久丰满| 欧美成人免费一级人片100| 青娱乐在线视频免费观看| 欧美日本中文| 久久777国产线看观看精品| 亚洲国产精品无码观看久久| 国产视频一区二区| 一区二区三区免费看视频| 妞干网这里只有精品| 一区二区三区伦理| 亚洲国产一区二区三区| av之家在线观看| 欧美成人h版| 欧美日韩一级视频| 男女污污视频网站| 国产精品对白| 在线播放日韩欧美| 久久久久99精品成人片试看| 国自产拍偷拍福利精品免费一| 97在线免费视频| 亚洲 欧美 日韩 在线| 蜜臀a∨国产成人精品| 91手机在线播放| 午夜av免费在线观看| 久久久久久久综合| 免费在线精品视频| 伊伊综合在线| 91精品国产综合久久香蕉的特点 | 一区二区三区日本视频| 日韩视频在线观看一区二区| 免费a级黄色片| 亚洲a在线视频| 97免费视频在线| 中文字幕男人天堂| 成人爱爱电影网址| 亚洲欧美久久久久一区二区三区| 免费在线观看的电影网站| 色老汉av一区二区三区| 日本少妇一区二区三区| 欧美男男gaytwinkfreevideos| 日韩在线播放一区| 午夜影院在线看| 国内精品写真在线观看 | 成人av二区| 国内外成人免费激情在线视频| 中文字幕网址在线| jvid福利写真一区二区三区| 亚洲永久激情精品| 91福利区在线观看| 欧美精品一卡二卡| 波多野结衣福利| 欧美oldwomenvideos| 97在线视频一区| av官网在线观看| 国产女人18毛片水真多成人如厕 | 粉嫩av四季av绯色av第一区| h视频在线免费| 精品久久久久久中文字幕大豆网| 欧美一级特黄aaa| 国产麻豆精品久久| 97精品免费视频| www.黄色片| 中文字幕人成不卡一区| 我要看一级黄色大片| 最新国产精品视频| 性欧美xxxx交| 亚洲va欧美va| 亚洲色欲色欲www在线观看| 日本www.色| 亚洲自拍电影| 91高清视频免费观看| 免费成人在线看| 一区二区日韩电影| 国产成人强伦免费视频网站| 日韩精品第一区| 国产精品精品视频一区二区三区| 五月激情六月婷婷| 午夜精品久久久久久久| 亚洲美女高潮久久久| 欧美高清日韩| 97超级碰碰| 尤物yw193can在线观看| 欧美一区二区三区影视| 四虎884aa成人精品| 久久超碰97人人做人人爱| 亚洲精品乱码视频| 黄色精品视频| 色一情一乱一区二区| 中文字幕有码无码人妻av蜜桃| 国产女人aaa级久久久级| 青青草精品视频在线观看| 国产亚洲一区二区三区啪| 国产精品成人在线| 粉嫩av一区| 欧美日韩第一区日日骚| 人人干在线观看| 国产乱码一区二区三区| 97久久国产亚洲精品超碰热| 亚洲成人毛片| 九九热最新视频//这里只有精品| 亚洲av无码国产精品永久一区| 亚洲一区二区三区四区在线| 少妇被狂c下部羞羞漫画| 国产精品久久久亚洲一区| 欧美一区二区综合| 国产情侣一区二区三区| 久久精品成人欧美大片古装| av中文字幕在线免费观看| 亚洲成人免费在线观看| 国产传媒第一页| 免费的成人av| 蜜臀av性久久久久蜜臀av| av日韩精品| 国产精品96久久久久久又黄又硬| av一区在线观看| 日韩色在线观看| 91国产丝袜播放在线| 国产目拍亚洲精品99久久精品| 五月天丁香花婷婷| 亚洲激情专区| 亚洲欧美成人一区| 在线视频亚洲欧美中文| 91av国产在线| 麻豆视频网站在线观看| 精品国产电影一区二区| 亚洲精品国产精品国自产网站按摩| 亚洲欧洲国产日本综合| 亚洲精品第二页| 日韩和欧美一区二区三区| 中国女人做爰视频| 免费短视频成人日韩| 91在线精品播放| 欧美成人免费电影| 久久综合久中文字幕青草| 欧美少妇另类| 日韩一区国产二区欧美三区| 国产乱国产乱老熟| 亚洲精品国产精华液| 一区二区黄色片| 国产一区二区精品久久99| 欧美黄色一级片视频| 欧美午夜不卡| 天天好比中文综合网| 美国一区二区| 91福利视频导航| 福利一区二区免费视频| 91av在线免费观看| av片在线观看网站| 中文字幕精品—区二区| 午夜视频在线播放| 日韩午夜电影在线观看| 久草热在线观看| 午夜精品福利一区二区三区蜜桃| 中文字幕美女视频| 久久久精品影视| 黄色录像a级片| 国产超碰在线一区| 亚洲黄色av片| 男男视频亚洲欧美| 久久人妻精品白浆国产 | 国产无套粉嫩白浆内谢的出处| 欧美精品首页| 最新视频 - x88av| 久久一区二区三区电影| 日韩国产欧美精品| 午夜精品福利影院| 国产三级精品在线不卡| 亚洲一区二区三区中文字幕在线观看| 成人有码在线播放| 国产成人精品一区二区三区视频 | 最新欧美日韩亚洲| 日韩不卡一区| 性高潮久久久久久久久| 精品国产一区二区三区噜噜噜| 欧美日韩一区在线视频| 日韩精品福利一区二区三区| 精品在线视频一区二区| 国产精品欧美大片| 精品产品国产在线不卡| 国产成人在线中文字幕| 国产精品裸体一区二区三区| 综合中文字幕| 成人免费91在线看| 91成人福利| 国产aⅴ精品一区二区三区黄| 日韩精品成人| 国产精品传媒毛片三区| 国产精品白浆| 久久久人人爽| 国产午夜一区| 天天综合色天天综合色hd| 欧美亚洲国产激情| 一本一本a久久| 中文字幕午夜精品一区二区三区| 日本黄色播放器| 亚洲欧美伊人| www.99热这里只有精品| 久久久久久久波多野高潮日日| 色七七在线观看| 久久精品国产成人一区二区三区| 四虎成人在线播放| 处破女av一区二区| 亚洲欧美日本一区| 国产日韩欧美一区二区三区乱码 | 国产精品va在线播放我和闺蜜| av成人免费| 亚洲自拍av在线| 久久精品色综合| 欧美少妇一区| 国产精品久久久久久久| youjizz.com在线观看| 亚洲在线网站| mm131亚洲精品| 成人自拍视频在线观看| 国产精品成人一区二区三区电影毛片| 欧美激情综合网| 青青草原免费观看| 欧美性猛交xxxx富婆弯腰| 91精品中文字幕| 欧美精品一区二区高清在线观看| 久草视频视频在线播放| 超碰91人人草人人干| 牛牛精品一区二区| 国产精品自产拍在线观 | 久久综合中文色婷婷| 成人在线免费小视频| 国产人妻互换一区二区| 亚洲在线成人| 精品人妻一区二区三区免费| 久久综合av免费| 国精产品一区一区二区三区mba | 国产嫩bbwbbw高潮| 91精品国产综合久久香蕉的特点| 天堂中文资源在线| 波霸ol色综合久久| 涩涩涩在线视频| 成人精品视频在线| 蜜桃精品噜噜噜成人av| 少妇一晚三次一区二区三区| 日韩电影网1区2区| 美女伦理水蜜桃4| 中文字幕亚洲在| 日韩手机在线观看| 91精品国产综合久久蜜臀| 久久久久久久久亚洲精品| 欧美国产日本高清在线| 日本在线一区二区| 欧美日韩系列| 在线亚洲伦理| wwwxxx色| 亚洲欧美在线aaa| 中文字幕一区二区人妻视频| 亚洲电影免费观看高清| www久久日com| 国产精品香蕉av| 亚洲免费毛片| 少妇高潮喷水在线观看| 国产成人三级在线观看| 最新av电影网站| 欧美亚洲动漫精品| 五月婷中文字幕| 久久久亚洲国产| 亚洲乱码一区| 激情成人开心网| 国产福利电影一区二区三区| 日本一二三区在线观看| 欧美裸体一区二区三区| 在线看av的网址| 国产精品香蕉av| 久久要要av| 做a视频在线观看| 国产亲近乱来精品视频| 日本a级c片免费看三区| 亚洲男人的天堂在线播放| 玖玖在线播放| 久久99精品久久久水蜜桃| 亚洲美女色禁图| 中文字幕精品久久久| 亚洲成av人片观看| 天天综合天天综合| 91tv亚洲精品香蕉国产一区7ujn| 国产毛片精品| 国产精品沙发午睡系列| 91视频在线看| 亚洲免费在线视频观看| 亚洲精品在线不卡| 日韩三级影视| 性欧美精品一区二区三区在线播放| 水蜜桃久久夜色精品一区的特点| 熟女俱乐部一区二区视频在线| 日韩欧中文字幕| 九色在线视频| 国产精品视频中文字幕91| 天天综合一区| 四虎国产精品永久免费观看视频| 亚洲精品成人精品456| 亚洲精品视频网| 97精品国产97久久久久久春色| 天海翼精品一区二区三区| 中文字幕乱码人妻综合二区三区| 国产欧美一区二区精品久导航| 亚洲国产无线乱码在线观看| 北条麻妃久久精品| **爰片久久毛片| 一二三四视频社区在线| 久久蜜桃香蕉精品一区二区三区| 国产成人无码专区| 日韩视频在线免费| av不卡一区二区| 成人三级视频在线播放| 国产精品久久毛片| 亚洲国产精品国自产拍久久| 538国产精品一区二区在线 | 久久午夜免费视频| 中文字幕国产亚洲| 精品一区二区三区在线观看视频| 男人添女人下部高潮视频在观看| 久久久久国产精品人| 一二三四区在线| 欧美精品videos性欧美| 国产成人精品一区二区免费看京 | 9人人澡人人爽人人精品| 亚洲高清视频免费观看| 久热精品视频在线| 色婷婷精品视频| 色啦啦av综合| 欧美日韩国产色视频| 男人天堂久久久| 国产在线资源一区| 精品无码三级在线观看视频| 久久久久久久99| 日韩综合视频在线观看| 久久亚州av| 天天影视色综合| 黑人精品xxx一区一二区| mm1313亚洲国产精品美女| 麻豆精品视频|