3

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

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

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

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

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

4

4 回答 4

11

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

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

(function () {

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

})();

但是,即使那样,也不能保证,因为它在很大程度上取决于缩小器的作者。

于 2011-04-18T04:49:59.260 回答
1

请参阅 Closure Compiler 的在线文档。

换句话说:

  1. “导出”您要保留的功能
  2. 使用您不想重命名的功能制作一个“externs”文件
  3. 在高级模式下运行闭包编译器
于 2011-04-18T06:30:42.953 回答
1

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

我为他们工作。

于 2011-04-18T05:43:29.410 回答
0

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

例如:

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

   $('.foo').jQueryAddClass('.bar');
});
于 2013-01-10T17:22:07.360 回答