我从第三方获得了一系列javascript文件,我想删除所有未使用的方法,以便将大小降低到更合理的水平。
有没有人知道为Javascript执行此操作的工具?至少给出一个未使用/使用过的方法列表,这样我就可以进行手动修剪?这将是运行类似YUI Javascript压缩器工具...
的补充否则我的想法是编写一个perl脚本来试图帮助我这样做。
答案 0 :(得分:34)
没有。因为你可以像疯狂的动态方式“使用”这些方法。
obj[prompt("Gimme a method name.")]();
答案 1 :(得分:19)
结帐JSCoverage。生成代码覆盖率统计信息,显示程序的哪些行已执行(以及哪些行已被遗漏)。
答案 2 :(得分:5)
我想删除所有未使用的方法,以便将尺寸缩小到更合理的水平。
有几种工具可用:
npm install -g fixmyjs
fixmyjs <filename or folder>
一个可配置模块,它使用JSHint(Github,docs)来标记未使用的函数并执行清理。
我不确定它会删除undefined
个功能而不是标记它们。虽然它是一个很好的清理工具,但似乎缺乏与更高版本的ECMAScript的兼容性(更多信息如下)。
还有Google Closure Compiler声称要删除死JS,但这更像是一个构建工具。
如果您使用的是Babel之类的内容,请考虑在文本编辑器中添加 ESLint ,这可能会触发对未使用的方法甚至变量的警告,并且具有--fix
CLI自动修复一些错误和样式问题的选项。
我喜欢ESLint,因为它包含备用库的多个插件(如果你错过了一个道具,就像React警告一样),允许你提前捕获bug。他们有一个坚实的生态系统。
作为示例:在我的NodeJS项目中,我使用的配置基于Airbnb Style Guide。
答案 3 :(得分:3)
除非图书馆作者跟踪依赖关系并提供了下载最小代码的方法[例如MooTools Core download],很难识别“未使用”的功能。
问题是JS是一种动态语言,有几种方法可以调用函数。
E.g。你可能有像
这样的方法function test()
{
//
}
您可以将其称为
test();
var i = 10;
var hello = i > 1 ? 'test' : 'xyz';
window[hello]();
答案 4 :(得分:2)
你必须编写一个perl脚本。不要注意上面的那些说话者。
这样的工具可以使用专门用于显式调用函数的库。这意味着不允许任何代表或指向函数的指针,在任何情况下使用它只会导致不可读的“意大利面条代码”并且不是最佳实践。即使它删除了一些隐藏的功能,如果不是全部测试,你也会发现它们。你没有发现的那些很少被使用,以至于他们不值得你花时间修理它们。不要痴迷于完美。人们为此疯狂。
因此,将这一限制应用于JavaScript(和库)将导致页面大小的减少,从而导致加载时间,更不用说可读性和可维护性。对于删除未使用的CSS的工具(例如grunt_CSS和unCSS(请参阅http://addyosmani.com/blog/removing-unused-css/)并且报告的典型减少量低至原始大小的十分之一,已经是这种情况。
它是一个双赢的局面。
值得注意的是,所有解释器都必须解决如何管理自修改代码的问题。对于我的生活,我不明白为什么人们想要坚持无拘无束的自由。如上面的Triptych所述,Javascript函数可以用字面上“疯狂”的方式调用。这种疯狂的灵活性破坏了代码和数据分离的基本原则,实现了实时代码注入,并使任何维护代码完整性的尝试无效。结果总是无法读取的代码无法调试,而JavaScript的副作用 - 无法运行自动代码预优化和验证 - 比任何可能的好处都要糟糕得多。
并且 - 你必须对你的工作感到非常不安全,想要故意从你的同事和你自己那里搞砸它。工作得非常好的浏览器客户端采用“少即是多”的方法,我见过的最好的例子是Microsoft Office组合的Access Web Forms与SharePoint Access Servcies配对。拥有无处不在的严格管理的运行时解释器客户端及其服务器端克隆的生产力绝对是惊人的。
JavaScript自我修改代码技术的未来使他们重新回到尊重......
代码和数据的KISS原则:Keep It Seperate,Stupid。
答案 5 :(得分:1)
我知道UglifyJS2支持删除可能正在寻找的未使用代码,这是一个老问题。
另外值得注意的是,eslint支持一个名为no-unused-vars
的选项,它实际上会检测是否正在使用函数。如果你将函数设为匿名函数并将其存储为变量,它肯定会检测到它(但请注意,作为变量,函数声明不会立即被提升)
在检测未使用的功能的情况下,虽然极端,但您可以考虑将大部分功能分解为单独的模块,因为有一些软件包和工具可以帮助检测未使用的模块。有a little segment of sindreshorus's thoughts on tiny modules可能与该哲学相关,但对于您的用例可能是极端的。
答案 6 :(得分:0)
以下会有所帮助:
如果您已完全覆盖测试用例,则运行代码覆盖率工具(如istanbul(https://github.com/gotwarlost/istanbul)或nyc(https://github.com/istanbuljs/nyc))会给出一些未触及的函数。
< / LI>至少上述内容有助于找到您可能认为未使用的涵盖功能。
答案 7 :(得分:-3)
也许这很简单,但我确信可以在任何文本编辑器中使用find函数,并查找所有函数名称,以及它们是否存在于文件的其他位置,并删除它们如果只找到1(&#39;功能名称&#39;)。