有没有一种工具来删除JavaScript中的未使用的方法?
我从第三方收集了一些JavaScript文件,我想删除所有未使用的方法,以便将大小缩小到更合理的级别。
有谁知道一个工具,这对于Javascript? 至less给一个未使用/使用的方法列表,所以我可以做手动修剪? 这将是除了运行像YUI Javascript压缩机工具之外…
否则我的想法是写一个Perl脚本来试图帮助我这样做。
没有,因为你可以像这样以疯狂的dynamic方式“使用”方法。
obj[prompt("Gimme a method name.")]();
检查JSCoverage 。 生成代码覆盖率统计信息,显示程序的哪些行已被执行(哪些已被忽略)。
我想删除所有未使用的方法,以将大小降低到更合理的水平。
有几个工具可用
npm install -g fixmyjs fixmyjs <filename or folder>
使用jshint标记未使用的函数并执行清理的可configuration模块。
-
github: https : //github.com/jshint/fixmyjs
-
jshint信息: http : //www.jshint.com/docs/
我不确定它会删除未定义的函数,而不是标记它们。 虽然它是一个很好的清理工具,但它似乎缺乏与更高版本的ecmascript的兼容性(更多信息在下面)。
还有谷歌封闭编译器 ,声称删除死JS,但这是更多的构build工具https://developers.google.com/closure/compiler/
更新
如果你使用的是类似babel的东西,可以考虑在你的文本编辑器中添加eslint ,这可能会触发对未使用的方法甚至variables的警告,并且有一个用于自动修正一些错误和样式问题的--fix
选项。
我喜欢eslint,因为它包含多个插件用于替代库(如反应警告,如果你缺less一个道具),让你事先捕捉错误。 他们拥有坚实的生态系统
这里是一个eslintconfiguration的例子,我用于我的节点项目,这是基于airbnbs风格指南https://www.npmjs.com/package/eslint-config-airbnb
除非图书馆作者跟踪了依赖关系,并且提供了下载最小代码的方法[例如MooTools Core下载 ],否则很难识别“未使用”的function。
问题是,JS是一种dynamic语言,有几种方法来调用一个函数。
例如,你可能有一个像
function test() { // }
你可以这样称呼它
test(); var i = 10; var hello = i > 1 ? 'test' : 'xyz'; window[hello]();
你将不得不写一个Perl脚本。 不要注意上面那些可笑的人。
这样的工具可以用于仅用于显式调用函数的库。 这意味着没有代表或function的指针将被允许,在任何情况下使用它只会导致不可读的“意大利面代码”,并不是最好的做法。 即使它删除了一些隐藏的function,你也会发现它们中的大部分(如果不是全部)在testing中。 那些你不会发现的将会很less使用,他们将不值得你的时间去修复它们。 不要迷恋于完美。 人们为此疯狂。
因此,将这一限制应用到JavaScript(和库)将导致页面大小的减less,从而导致加载时间的缩短,更不用说可读性和可维护性。 移除未使用的CSS(例如grunt_CSS和unCSS)的工具已经是这种情况,并且报告了典型的缩小到原始大小的十分之一。
这是一个双赢的局面。
值得注意的是,所有的口译员都必须解决如何pipe理自我修改代码的问题。 对于我的生活,我不明白为什么人们要坚持自由奔放。 正如上面提到的三联式Javascriptfunction可以用字面上的“疯狂”的方式来调用。 这种疯狂的灵活性破坏了代码和数据分离的基本原则,使得实时代码注入成为可能,并且使维护代码完整性的任何尝试失效。 结果始终是无法读取的代码,无法debugging,JavaScript的副作用 – 无法运行自动代码预优化和validation – 远比任何可能的好处都差得多。
而且 – 你不得不对自己的工作感到非常不安全,因为他们想要从你的同事和你自己那里刻意地忽视它。 浏览器客户端工作得非常好,采取“less即是多”的方法,我所见过的最好的例子是Access Web Forms与SharePoint Access Servies配合使用的Microsoft Office组合。 拥有一个无处不在的严格pipe理的运行时解释器客户端及其服务器端克隆的生产力是绝对惊人的。
JavaScript自我修改代码技术的未来正在把他们带回到尊重… …
代码和数据的KISS原则:保持分离,愚蠢。
也许这是简单的,但我相信它可以在任何文本编辑器中使用find函数,并查找所有函数名称,以及它们是否存在于文件中的其他位置,如果只find1,则删除它们('函数名')。