在前端代码库中使用jsinspect检测重复/近似代码经过逐步完善,我们需要考虑代码库的优化和重构,尽量写出清晰可维护的代码。好的代码往往在合理范围内尽可能避免重复代码,遵循单一职责和单一真相的原则。在这部分,我们尝试使用jsinspect自动检索代码库,根据反馈的重复或近似的代码片段进行合理的优化。当然,我们并不是简单地追求彻底剥离公共代码。过多的抽象会降低代码的可读性和可理解性。jsinspect使用babylon为JavaScript或JSX代码构建AST语法树,根据不同的AST节点类型,如BlockStatement、VariableDeclaration、ObjectExpression等标记结构相似的代码块。我们可以使用npm全局安装jsinspect命令:Usage:jsinspect[options]Detectcopy-pastedandstructurallyssimilarJavaScriptcodeExampleuse:jsinspect-I-L-t20--ignore"test"./path/to/srcOptions:-h,--帮助输出使用信息-V,--versionoutputtheversionnumber-t,--thresholdnumberofnodes(default:30)-m,--min-instancesmininstancesforamatch(default:2)-c,--configpathtoconfigfile(default:.jsinspectrc)-r,--reporter[default|json|pmd]specifythereportertouse-I,--no-identifiersdonotmatchidentifiers-L,--no-literalsdonotmatchliterals-C,--no-colordisablecolors--ignoreignorepathmatchingaregex--截断lengthtotruncatelines(default:100,off:0)我们也可以选择在项目目录下添加.jsinspect配置文件来指定jsinspect运行配置:{"threshold":30,"identifiers":true,"literals":true,"ignore":"test|spec|mock","re??porter":"json","truncate":100,}配置后,我们可以使用jsinspect-t50--ignore"test"./path/to/src分析代码库。以笔者找到的一个代码库为例,它检测到数百个重复的代码片段,典型代表如下可以看出,多次密码输入的元素在某个组件中被重复写入。我们可以选择将其封装为功能组件,将label、hintText等常用属性包裹起来,以降低代码重复率。Match-2instances./src/view/main/component/tabs/account/operation/login/forget_password.js:96,110返回{this.setState({userPwd:value})}}/>