【问题标题】:Good tips and tricks to "streamlining" your Javascript and jQuery [closed]“精简”您的 Javascript 和 jQuery 的好技巧和窍门 [关闭]
【发布时间】:2011-02-11 13:43:35
【问题描述】:

显然你已经掌握了基本的 Minify 和 Packer 技术...

但我想知道是否有任何用于较小代码的小型 Javascript 技术(例如那些带有 ?: 等的替代 if 语句)。

那么,一旦我有很好的精简代码(...)我会缩小/打包它

【问题讨论】:

  • 技巧很好,但可维护性和可读性如何?这些也应予以考虑。没有它们,大型 Web JS 项目可能很难维护和移交。

标签: javascript jquery compression


【解决方案1】:

帮助缩小器的一个非常好的技术是将变量传递给自调用函数:

(function(window, document, $, undefined) {
      // all of your application logic goes in here
}(window, window.document, jQuery));

然后,缩小器将为参数创建快捷方式,例如 a, b, c, d

(function(a, b, c, d) {
}(window, window.document, jQuery));

现在,windowdocumentjQuery(如果已使用)和 undefined value 可以正常访问。这将有助于进一步减小文件大小。

this article 中描述了一些不错的 Javascript 快捷方式。

例如,使用~~ 而不是Math.floor()

罢工>

var floored = Math.floor(55.2115);  // = 55

var floored = ~~(55.2115);  // = 55

另一件非常巧妙的事情是,几乎所有的 Javascript 解释器都会为您转换数字。例如,我们想要一个setTimeout,它会在 3 分钟后触发。而不是这样做

setTimeout(function() {
}, 180000);

60 * 3 * 1000,我们可以拨打:

setTimeout(function() {
}, 18e4);

这可能更有意义,在更大的数字上,但无论如何:-)

【讨论】:

  • +1 否则无法重命名全局对象。
【解决方案2】:

我喜欢的是

for(var i = arr.length;i--;)

它并没有节省那么多代码,但有两个优点:

  • 只访问一次.length
  • 比传统的for 循环“更快”

但它只有在数组的处理顺序无关紧要时才有效。


我想可能每个人都知道如何使用逻辑 OR 设置默认值:

function(must, option) {
    option = option || "defaultValue";
}

如果未设置option,则为undefined,其计算结果为false。 JavaScript 返回满足表达式的变量的值(或者如果表达式未满足,则返回最后一个变量的值,我认为)。当然,这取决于option 可以具有哪些值,即如果一个可能的值是false,这将不起作用。


将数字字符串转换为数字的一种快速方法是在前面加上+。没有必要使用例如parseInt:

var n = +"123";
// instead of `var n = parseInt("123", 10)`

【讨论】:

  • 很好 ^_^ - 这正是我正在寻找的技巧!
  • 我认为它只是更快,因为它不会在每次迭代时查询.length,因为在 JavaScript 中增量/减量差异实际上是 0?
  • 我猜反向 while 循环是您可以创建的最快循环。
  • @Piskvor:评估条件也更容易(更快),因为只需将值与0 进行比较。我在引号中加上了更快,因为它可能只对大型数组产生影响。 @jAndy:是的,while 循环很可能是最快的。但我认为for 循环更具表现力。
  • @goldenratio:这就是为什么我说“当然这取决于option 可以具有哪些值,即如果一个可能的值是false,这将不起作用。”我>
【解决方案3】:

不费吹灰之力 - 使用缩小和 gzip,在此处保存一个字符,在此处保存两个字符,这肯定是不必要的微优化。您可以节省几个字节,是的,甚至可能节省一百或两个字节,但是以牺牲您的开发时间为代价,当您可以做出很棒的东西时。

【讨论】:

  • 我有点同意你的看法 - 但归根结底 - 更小的代码更快......一般......
  • @Neurofluxation:[需要引用]。愚蠢的反例:您可以压缩代码,然后在其上运行解压缩器 - 由于解压缩开销,它会更小并且更慢。无论如何,如果你正在编写一个有趣的项目,无论如何,一定要花时间在传说中的 97% 的微优化上——这将是一种学习体验,但不要自欺欺人地认为这是一个主要功能。如果我正在为其他人编写代码,我将很难证明以这种方式花费的时间是合理的(除非目标确实是优化 - 由于流量,Google 可能会在其主页上减少 2 个字节)。
  • 明白 - 很好的争论:) 我只是喜欢优化! +1
  • 如果您将所有变量最小化为一个字母,并使函数变得神秘等,您最终可能会让自己变得更难。正如我在回答中指出的那样......我更倾向于编写它开始时干净易懂,然后让我的“编译器”为我处理微优化。
  • @Neurofluxation:我也是,但因为我设法用它推迟了一个项目,所以我要小心一点:D
【解决方案4】:

我会以清晰易读的方式编写代码,然后使用 Google 闭包或类似方法对其进行优化和压缩。

http://code.google.com/closure/

引自闭包网站:

闭包编译器将 JavaScript 编译成紧凑、高性能的代码。这 编译器删除死代码并重写并最小化剩下的代码,以便下载和 跑得很快。它还检查语法、变量引用和类型,并警告常见的 JavaScript 陷阱。

【讨论】:

  • 是的,我用过这个——但我宁愿避免压缩——想让我的代码可读,因为这是一种学习体验
  • @Neurofluxation:然后做 jQuery 所做的事情 - IIRC,您可以在 jquery.js 和 jquery.min.js 之间进行选择:保持正常代码,对于大小不一的情况也有压缩/缩小的代码很重要。
  • 这正是重点。让你编写并保持可读的代码,然后让 Closure 优化它。我可能不应该说“压缩”,因为这并不是真正发生的事情...... Closure 检查您的代码并应用使其快速且小巧的优化。至于压缩,让 gzip 在您的服务器上执行此操作。
【解决方案5】:
if (conditional && conditional) {
    doSomething();
}

可以变成:

conditional && conditional && doSomething();

【讨论】:

  • @Neuro:当然(jsfiddle.net/Sxv6E),关键是最后的“&&”
  • 爱它! - 该死的字符限制
【解决方案6】:

这是一个令人钦佩的想法。但我认为代码的可读性、可理解性和可维护性比针对大小进行优化更重要。整个 jQuery 1.5 的缩小版只有 85kB 大小。这比许多网站上的许多图片都小。

很多人写这样的代码:

$('a#click_me').bind('click', function(){
    $(this).children('img').hide();
    ... etc...
    $(this).parent().addClass('xyz');
});
$('a#click_me').css('width',  '10px');
$('a#click_me').css('height', '10px');

代替:

$('a#clickme').css({width: '10px', height: '10px'}).click(function(){
    var $this = $(this), href=this.href;
    $('img', this).hide();
    ... etc ...
    $this.parent().addclass('xyz');
});

即在可能的情况下使用地图({a: b, c: d})(例如上面的css())。

使用链接$(selector).method1().method2()

使用例如$('img', this) 而不是 $this.children('img');

不要一直使用同一个选择器,将结果存储在一个变量中(例如$this)。

在适当的地方使用 JavaScript 元素,而不是 jQuery 元素,例如

href = this.href;   rather than   href = $(this).attr('href');

【讨论】:

  • 我一直保留未压缩代码的副本 :)
猜你喜欢
  • 2010-10-26
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多