我们正在重构遗留的Web应用程序,因此"杀死"了相当多的JavaScript代码,但我们害怕因为不确定而删除我们认为是死代码的内容.是否有任何工具/技术可以在JavaScript中正确识别死代码?
有grep.用它来查找函数调用.假设你有一个叫做的方法dostuff()
.使用grep -r "dostuff()" * --color
你的项目的根目录.除非您找到除定义之外的任何内容,否则您可以安全地将其删除.
ack也是grep的一个值得注意的替代品.
如果你的代码使用"eval",那么很难找到一个代码没有通过一些不明确的方法组装字符串并且评估它,调用你的死代码的某个地方的gaurantee.(真正讨厌的东西可能会在包含eval的字符串上调用eval ...).
您还必须担心代码外部的来电; 许多网页使用HTML"on"属性来调用JavaScript代码.
所以你需要做的是找到看似死的方法/声明,找到并审查所有的eval调用,找到并审查所有"on"属性.
使用其他人建议的测试覆盖率是获取可能死代码的初始列表的一种方法.您显然希望尽可能多地运用功能来消除可能死亡的候选者,然后搜索剩余的候选者以查看代码中是否有调用.查找evals和on-events是一个搜索代码的问题.
Grep可能会起作用,虽然逐个浏览你的名字列表可能会很痛苦,输入正确的搜索,从输出中猜出哪些不是误报,然后逐一在编辑器中检查它们.
您可以查看我们的SD源代码搜索引擎(SCSE),它可以针对许多语言进行语言特定的搜索,包括各种类型的HTML页面和JavaScript.您可以轻松地限制SCSE仅检查JavaScript代码中的函数调用(例如,忽略注释和字符串)以查找剩余的候选者和/或eval,并仅检查HTML页面中的"on*"属性(例如,忽略HTML页面中的所有其他文本).它使用GUI来接受搜索查询,显示命中,并提取包含命中的源文本以便于检查.如果需要的话,它甚至会带你到你的编辑器.
对于静态分析解决方案,您需要能够解析代码并确定哪些名称引用哪些实体的工具; 范围问题.然后,您需要能够通过代码确定合理的执行路径,模拟动态对象结构和那些讨厌的逃避.为此,你需要一个非常复杂的引擎,并且可能需要一些工程,除非有人发生这种情况,我怀疑.
我们的DMS软件再造工具包就是这样一个引擎,它有一个完整的JavaScript(和HTML)解析器.虽然我们没有使用DMS来实现JavaScript,但我们已经使用DMS为Java构建了这样一个死代码移除器.你给它提供了Java代码,它产生了一个"似乎死了"的类,方法和字段列表(包括dead的传递闭包:如果A类死了,引用B,A的引用不计算作为对B)的真实引用,以及删除了所有"死"内容的代码的修改版本.您决定是否相信该报告; 如果你这样做,你保留代码.如果不这样做,则修改代码以确保该死的东西没有死,然后再次运行.
没有寻找太复杂的东西:
JSLint(不是真正的静态分析器,但如果你给它连接的开发代码,你会看到从未调用过哪些方法,至少在明显的作用域上下文中)
谷歌闭包编译器
Google Closure Linter
JetBrains的WebStorm IDE可以突出显示项目中的死代码和未使用的变量.
您可以将代码优化器用作Google Closure Compiler,但它通常用于最小化代码.
function hello(name) { alert('Hello, ' + name); } function test(){ alert('hi'); } hello('New user');
会导致
alert("Hello, New user");
例如.
您可以做的另一件事是使用Chrome的开发人员工具(或Firebug)来查看所有函数调用.在" 个人档案"下,您可以查看哪些函数随时间调用,哪些函数不调用.