【问题标题】:Solution to minify object properties?缩小对象属性的解决方案?
【发布时间】:2012-02-21 17:02:07
【问题描述】:

在我的 JavaScript 应用程序中,我仅将几个对象用于内部目的(用户不需要访问它们)。例如:

var images={
    blank:"blank.gif",
    plus:"plus.gif",
    minus:"minus.gif"
}

当我使用像 Uglify.js 这样的缩小器时,属性名称(空白、加号、减号)保持原样。有没有办法缩小它们?

到目前为止我所考虑的:

  • 在高级模式下使用 Google Closure minifier,但这会破坏我的代码
  • 用变量替换对象属性(例如 var imagesBlank="blank.gif"),但这会降低代码的可读性

有没有更好的办法?

【问题讨论】:

  • 在高级模式下使用 Google Closure minifier,但这会破坏我的代码 ...您应该仔细阅读文档并调整您的代码,使其不会崩溃。我认为 Google Closure 编译器是最好的选择。
  • @FelixKling 你有与我的问题相关的特定链接吗?另外,请随时将它们作为答案发布,以便我接受!
  • 不,不是真的...只有文档 (code.google.com/closure/compiler/docs/api-tutorial3.html)。
  • 任何 minifier 都不知道这些属性不能从外部访问。因此没有人会碰它们。 Closure Compiler 也是简单模式。保留这些私有变量的方法是通过闭包来捕获它们。这样,它们总是被缩小器重命名,您的用户将无法触摸它们。

标签: javascript object minify


【解决方案1】:

使用对象允许使用变量作为属性。将其包装在闭包中使得这些变量值得缩小。

//Wrap in closure
(function() {

    //Property Variables
    var blank = 0;
    var plus  = 1;
    var minus = 2;

    //Define Object
    var image = [];
    image[blank] = "blank.gif";
    image[plus]  = "plus.gif";
    image[minus] = "minus.gif";

    //Accessors - must be within closure
    image[blank]; //blank.gif
    image[plus];  //plus.gif
    image[minus]; //minus.gif

})();

要访问上述值,必须在闭包内使用常量

如果使用 Google 的 Closure Compiler,使用 var image = []; 将更有效地声明数组,因为属性值从零开始编号,即 012

否则,var image = {}; 也可以正常工作。

【讨论】:

    【解决方案2】:

    如果您为内部属性添加唯一前缀,则可以尝试使用 --mangle-props regex per https://github.com/mishoo/UglifyJS2

    这是它在我的 gulpfile 中的使用,它需要 gulp-uglify。

    var uglifyOpts = {
        // Mangles the private "p1_" prefixed properties in an object
        mangleProperties: {
            regex: /^p1_/
        }
    };
    

    【讨论】:

      【解决方案3】:

      [2020 年 5 月更新] --mangle-props 的语法似乎对 gulp-uglify 有所改变。现在,它不是 mangleProperties,而是“mangle”对象内的“properties”对象:

      这是从我的 gulpfile.js 中获取的完整代码,截至 2020 年 5 月有效:

      uglify        = require('gulp-uglify');
      
      ...
      
      const uglifyOptions = {
          mangle: {
              properties: { regex: /^p1_/ }
          }
      }
      
      ...
      
      .pipe( uglify( uglifyOptions ) )
      

      【讨论】:

        【解决方案4】:

        好吧,在这种情况下,您可以将所有对images.blank 的引用替换为"blank.gif",与plusminus 相同。如果您出于某种原因决定更改所有文件名,这确实意味着更多的工作,但没有什么是全局搜索和替换无法解决的。根本不需要images 对象。

        【讨论】:

        • 这只是一个例子。在我的代码中,图片链接实际上更长:“domainName/hierarchy/blank.gif”。重复字符串并不能解决缩小问题。我可以将它存储在一个变量中,但是我们回到我的问题。
        • 好吧,你可以有一个变量baseimgurl = "http://example.com/hierarchy/";,然后把它添加到你的图片链接中......也许吧。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 2011-01-18
        • 2013-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多