find死JavaScript代码?

我们正在重构一个遗留的Web应用程序,结果是“杀死”了很多JavaScript代码,但是由于不确定,我们害怕删除我们认为是死代码的东西。 有没有任何工具/技术来积极识别JavaScript中的死代码?

没有寻找任何太复杂的东西:

  • JSLint (不是一个真正的静态分析器,但是如果你给它连接的开发代码,你会看到什么方法永远不会被调用,至less在明显的范围上下文中)
  • Google Closure编译器
  • Google Closure Linter

grep 。 用它来查找函数调用。 假设你有一个叫做dostuff()的方法。 在项目的根目录下使用grep -r "dostuff()" * --color 。 除非您发现定义以外的任何内容,否则可以安全地将其删除。

ack也是grep的一个值得注意的select。

如果你的代码使用“eval”,那么很难得到一个gaurantee,在某处代码不能通过一些不起眼的方法来组装一个string,然后对它进行评估,调用你的死代码。 (真正讨厌的东西可能会调用包含eval的string的eval …)。

你也必须担心你的代码之外的电话; 许多网页使用HTML“on”属性来调用JavaScript代码。

所以你需要做的是find似乎已经死亡的方法/声明,find并审查所有的eval调用,并find并审查所有的“on”属性。

使用testing覆盖作为其他人已经build议是获得可能死代码的初始列表的一种方法。 您显然希望尽可能多地使用function来消除可能已经死亡的候选人,然后search剩余的候选人以查看代码中是否有呼叫。 寻找事件和事件是search代码的事情。

Grep很可能会起作用,尽pipe逐个浏览你的名字可能会很痛苦,你可以input正确的search内容,从输出中猜出哪些不是误报,然后一个接一个地在编辑器中查看。

您可以看看我们的SD源代码search引擎(SCSE) ,它可以为许多语言进行语言特定的search,包括各种types的HTML页面和JavaScript。 您可以轻松地限制SCSE检查剩余候选和/或eval中JavaScript代码中的函数调用(例如,忽略注释和string),并检查HTML页面中的“on *”属性(例如,忽略HTML页面中的所有其他文本)。 它使用GUI来接受你的search查询,显示命中,并拉起包含命中的源文本,以便于检查。 如果需要,它甚至会带你到你的编辑器。

对于静态分析解决scheme,您需要能够parsing代码并确定哪些名称引用哪些实体的工具; 范围很重要。 然后,您需要能够通过代码确定可行的执行path,模拟dynamic对象结构和那些令人讨厌的演示。 为此,你需要一个非常复杂的引擎,并可能需要一些工程,除非有人发生这种情况,我怀疑。

我们的DMS Software Reengineering Toolkit就是这样一个引擎,它有一个完整的JavaScript(和HTML)parsing器。 虽然我们还没有将DMS用于JavaScript,但是我们已经使用DMS为Java构build了这样一个死代码移除器。 你给它的Java代码,它会产生一个“似乎已经死了”的类,方法和字段的列表(包括死的传递闭包:如果类A死了,引用B,A的引用不计数作为对B)的真实引用, 以及删除所有“死”东西的代码的修改版本。 你决定是否相信这份报告; 如果你这样做,你保持代码。 如果你不这样做,你可以修改代码,以确保那个已经死了的东西没有死,然后再运行它。

您可以使用代码优化器作为Google Closure Compiler ,但是它通常用于最小化代码。

 function hello(name) { alert('Hello, ' + name); } function test(){ alert('hi'); } hello('New user'); 

会导致

 alert("Hello, New user"); 

例如。

你可以做的另一件事是使用Chrome的开发工具(或Firebug)来查看所有的函数调用。 在configuration文件下,你可以看到哪些函数被随时调用,哪些不是。

DT配置文件

JetBrains的WebStorm IDE可以突出显示项目中的死码和未使用的variables。

Chrome已经提出了一项新function,让开发人员可以看到代码的覆盖范围 ,即执行哪些代码行。

这当然不是一站式解决scheme,但可以向开发人员伸出援助之手来获得代码见解。

查看这个链接的细节

Chrome 59版本的推出

工具

如果你想自动化这个,我会看看https://github.com/joelgriffith/navalia ,它公开了一个自动API来做到这一点:

 const { Chrome } = require('navalia'); const chrome = new Chrome(); chrome.goto('http://joelgriffith.net/', { coverage: true }) .then(() => chrome.coverage('http://joelgriffith.net/main.bundle.js')) .then((stats) => console.log(stats)) // Prints { total: 45913, unused: 5572, percentUnused: 0.12135996340905626 } .then(() => chrome.done()); 

更多信息请访问https://joelgriffith.github.io/navalia/Chrome/coverage/