javascript - 如何缩小/混淆全局函数名称?

时间:2011-04-18 04:18:42

标签: javascript yui obfuscation google-closure-compiler minify

我有一些代码具有以下格式:

function myfunc1 () { ... jquery.bind('click', myfunc2) ... }
function myfunc2 () { ... }
...

是的,这些功能是全局的,但是因为我在google chrome扩展内容脚本中编写,所以它是沙盒的。

现在,我正在尝试缩小和混淆代码。我已经尝试过YUI Compressor和Google Closure编译器。问题是,我无法弄清楚如何缩小/混淆全局函数名称。使用YUI时,如果它们被外部调用,它不会缩小全局变量。在高级模式下关闭,似乎它可以重命名全局变量,但是我遇到了死代码删除的问题。大多数函数似乎都已死,因为它们依赖于DOM交互和事件处理,并且不会直接调用。

那么关于如何缩小这些全局变量的任何想法?我是否需要编写脚本来进行一些正则表达式替换?我也愿意重构我的代码,如果这样可以更好地适应缩小模式(例如,添加到闭包或诸如此类的东西)

4 个答案:

答案 0 :(得分:10)

Minifiers不会破坏公共/全局名称,因为对于许多脚本来说,这会破坏公共API的可用性和可预测性。

由于您不需要维护公共API,因此将它们包装在闭包函数中使它们成为“私有”可能就足够了:

(function () {

    function myfunc1 () { ... jquery.bind('click', myfunc2) ... }
    function myfunc2 () { ... 
    ...

})();

但是,即便如此,也没有任何保证,因为它完全取决于minifier的作者。

答案 1 :(得分:1)

请参阅语义设计JavaScript Obfuscator。使您可以完全控制哪些符号被混淆,哪些不符号,这样您就可以管理这样的情况。无需更改您的工作代码。

我为他们工作。

答案 2 :(得分:1)

请参阅Closure Compiler的在线文档。

换句话说:

  1. “导出”您要保留的功能
  2. 制作一个“外部”文件,其中包含您不想重命名的功能
  3. 以高级模式运行Closure编译器

答案 3 :(得分:0)

您可以在代码中对常用的jQuery函数进行本地引用,然后将其缩小?

例如:

$(function() {
   var jQueryAnimate = $.animate,
       jQueryAddClass = $.addClass;

   $('.foo').jQueryAddClass('.bar');
});