我收到了一些第三方的JavaScript文件集合,想要删除所有未使用的方法以使文件大小更加合理。
有没有人知道一个可以对JavaScript进行这样操作的工具?至少可以提供已使用或未使用方法的列表,这样我可以手动进行删减。这将是在运行像YUI JavaScript压缩器这样的工具之外的额外步骤...
否则,我的想法是编写一个Perl脚本来帮助我完成这个任务。
我收到了一些第三方的JavaScript文件集合,想要删除所有未使用的方法以使文件大小更加合理。
有没有人知道一个可以对JavaScript进行这样操作的工具?至少可以提供已使用或未使用方法的列表,这样我可以手动进行删减。这将是在运行像YUI JavaScript压缩器这样的工具之外的额外步骤...
否则,我的想法是编写一个Perl脚本来帮助我完成这个任务。
不行。因为你可以像这样以非常动态的方式“使用”方法。
obj[prompt("Gimme a method name.")]();
看看 JSCoverage 。生成代码覆盖率统计数据,显示程序中哪些行已执行(哪些未执行)。
npm install -g fixmyjs
fixmyjs <filename or folder>
undefined
函数,而不是标记它们。虽然它是一个很好的清理工具,但似乎缺乏与后期版本的 ECMAScript 的兼容性(下面有更多信息)。还有 Google Closure Compiler,它声称可以删除死代码,但这更像是一种构建工具。如今,如果你在使用Babel等工具,可以考虑在文本编辑器中添加 ESLint,它可以触发对未使用的方法和甚至变量的警告,并且具有 --fix
CLI 选项,以自动修复某些错误和样式问题。我喜欢 ESLint,因为它包含了多个插件用于替代库(例如React警告,如果您漏掉了某个属性),使您能够预先捕获漏洞。他们有一个牢固的生态系统。例如,在我的 NodeJS 项目中,我使用的配置基于Airbnb 风格指南。你需要编写一个perl脚本。不要理会上面的反对者。
这样的工具可以与只设计用于显式调用函数的库一起使用。这意味着不允许使用委托或指向函数的指针,因为它们在任何情况下都会导致难以阅读的“意大利面条代码”,并且不是最佳实践。即使它删除了一些隐藏的函数,在测试中您将发现大多数,如果不是全部。您没有发现的那些将极少使用,不值得花时间修复。不要追求完美。人们为此而疯狂。
因此,将此限制应用于JavaScript(和库)将导致页面大小和加载时间的惊人减少,更不用说可读性和可维护性了。对于删除未使用CSS的工具,如grunt_CSS和unCSS(请参见http://addyosmani.com/blog/removing-unused-css/),已经存在这种情况,并报告典型的缩小到原始大小的十分之一的减少。
这是一个双赢的局面。
值得注意的是,所有解释器都必须解决如何管理自修改代码的问题。我真不明白为什么人们要坚持不受限制的自由。正如Triptych所指出的那样,Javascript函数可以以“疯狂”的方式调用。这种疯狂的灵活性破坏了代码和数据分离的基本原则,使实时代码注入成为可能,并使任何维护代码完整性的尝试失效。结果总是难以调试的难以阅读的代码,而JavaScript的副作用——去除运行自动代码预优化和验证的能力——比任何可能的好处都要糟糕得多。除非库的作者跟踪了依赖关系并提供了下载最小代码的方法[例如MooTools Core下载],否则很难识别“未使用”的函数。
问题在于JS是一种动态语言,有多种调用函数的方式。
例如,您可能有一个方法:
function test()
{
//
}
test();
var i = 10;
var hello = i > 1 ? 'test' : 'xyz';
window[hello]();
hello();
会抛出一个错误,指出 'helo' 或 'xyz' 不是函数而是字符串。 - jcubic我知道这是一个老问题,但UglifyJS2支持删除未使用的代码,这可能是你要寻找的。
值得注意的是,eslint支持一个名为no-unused-vars
的选项,它实际上可以检测函数是否被使用。如果将函数声明为匿名函数并将其存储为变量,则它肯定会检测到(但请注意,作为变量,函数声明不会立即被提升)。
在检测未使用的函数的情况下,虽然极端,但您可以考虑将大多数函数分解为单独的模块,因为有一些软件包和工具可用于帮助检测未使用的模块。这里有sindreshorus的关于小模块思想的一小段内容,这可能与该哲学相关,但对于您的用例来说可能有些极端。
以下内容可能有所帮助:
如果您已经完全覆盖了测试用例,运行代码覆盖率工具如istanbul(https://github.com/gotwarlost/istanbul)或nyc(https://github.com/istanbuljs/nyc),将给出未使用的函数的提示。
至少以上方法可以帮助找到您认为未使用的已覆盖函数。