【问题标题】:javascript - how to minfy/obfuscate global function names?javascript - 如何缩小/混淆全局函数名称?
【发布时间】:2011-08-07 14:17:00
【问题描述】:

我有一些格式如下的代码:

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

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

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

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

【问题讨论】:

  • 添加闭包应该可以解决您的问题。您还可以互换使用术语函数和变量,这是不应该的。
  • 所以假设我使用了闭包。那么它会是什么样子呢? function clo () { function myfunc1 () {...jquery.bind('click', myfunc2)...} function myfunc2 () {} }?我会在 bind、this.myfunc2 或只是 myfunc2 中说什么?

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


【解决方案1】:

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

例如:

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

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

【讨论】:

    【解决方案2】:

    请参阅 Closure Compiler 的在线文档。

    换句话说:

    1. “导出”您要保留的函数
    2. 制作一个包含不想重命名的函数的“externs”文件
    3. 在高级模式下运行闭包编译器

    【讨论】:

    • 需要提到的文档的链接。需要一个如何导出的示例。
    【解决方案3】:

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

    我为他们工作。

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-23
        • 1970-01-01
        • 2023-01-03
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多