发布 JavaScript 代码之前你会做什么?

16

您在部署过程中是否有JS代码压缩的步骤?您是否有任何JavaScript预处理器,允许您保留注释和console.log,并自动剥离它们?您的JavaScript是否由GWT或Script#生成?您是否使用ANT或其他工具自动化部署?

我看到很多JavaScript代码看起来像是直接从编辑器中复制出来的,包含大量空格和注释。这些有多少是因为不关心部署代码的状态,而有多少是源于开放网络的精神呢?


2
如果您关心压缩率,该页面详细介绍了一些工具使用一些最受欢迎的JavaScript库达到的比例概述:http://compressorrater.thruhere.net/。 - ChristopheD
最近我自己也在思考这个问题,从“最佳实践”的角度出发。作为一名IT极客,我认为Web服务器应该处理压缩,而不是开发人员。我对Mootools进行了一些廉价的分析,并发现使用YUI预压缩或其他方法可以获得比标准gzip更小的尺寸优势。但这种优势是否值得费事和可能违背“开放网络精神”呢? - Ben Dunlap
@Ben Dunlap:那就是你需要同时进行两个操作:压缩和gzip。你可以使用生产构建脚本进行压缩,服务器会为您处理gzip。 - montrealist
2
@dalbaeb,是的,我知道——这正是我的测试目的;如果不清楚,对不起。 我取了Mootools的压缩版本并进行gzip压缩,然后将结果与Mootools的原始版本gzip压缩进行比较。差异相当小,因此我的问题是:如果Web服务器应该在任何情况下都要压缩所有响应,那么通过最小化我会得到什么好处? 因为我知道通过最小化我会失去什么:第三方读者的代码清晰度和我的时间(当我必须更改发布代码时)。 我想进行一项成本/效益分析。 - Ben Dunlap
通过缩小代码,你所获得的收益取决于你有多少代码。即使是更短的变量/函数名称有时也可以减少总体大小和下载时间。我们在这里谈论的是毫秒级别的问题,这是真的。但用户等待的时间越短,越好。此外,如果你只是为了生产而进行缩小,你仍然可以使用可读的“dev”版本进行工作。对于第三方读者来说,清晰度会受到影响 - 是的,这取决于这对你有多重要。 - montrealist
我认为这非常有价值。就个人而言,如果我发现一个非常漂亮的网站并想要探索它们的CSS,做了一个快速的wget,然后发现它被压缩了,或者更糟糕的是混淆了,那会让我抓狂。别提Javascript了。我曾经在一个Web代理系统上工作,经常不得不浏览JS,找出为什么我们的代理与Web应用程序不兼容。那时还没有流行压缩,但混淆是一些开发人员的好朋友。呃。当然,那还是Firebug之前的日子... - Ben Dunlap
13个回答

11

我通常使用 JSLint 来检查它是否无虫,然后使用 YUI compressor 进行打包/编码。


1
只是需要注意的是,JSLint实际上并不检查脚本以确保它从操作角度来说没有错误(例如,该范围测试是否检查了正确的范围),而是为了双重检查语法,以确保您没有做错任何事情。 - rjzii

4
我的步骤如下:
  1. 我使用安装了Javascript工具包的TextMate编写Javascript代码。每次保存时,它会对我的文件进行JSLint检查,并在出现错误时通知我。
  2. 我使用Sprockets自动连接我的各种Javascript文件。
  3. 我使用jsmin运行结果拼接来生成精简版本。

最终我得到一个拼接后的lib.js文件和一个精简版的lib.min.js文件。一个用于开发,一个用于生产。TextMate命令有助于自动化整个过程。

我仍在寻找一个好的解决方案来对我的脚本进行(单元)测试。


我需要了解 Ruby 才能使用 Sprockets 吗?还是我只需安装 Ruby 并学习 Sprockets 即可? - Nosredna
@Nosredna:你不一定要了解 Ruby,但这有助于自定义它。我从一个 Ruby 脚本中调用 Sprockets,但它也有一个命令行工具。 - avdgaag
顺便提一下,Windows 上类似 TextMate 的软件是 e-texteditor,它也可以对文件进行 JSLint 检查。 - Gad

2

请查看YUI Compressor,它是一个控制台应用程序,您可以使用它来缩小(去除注释、空格等)并混淆您的JavaScript文件。


2

JSMin 是由 Douglas Crockford 开发的 JavaScript 压缩工具。我们将其作为宏在 Studio 中使用,同时也作为一些大型项目的后构建项。


2

以下是关于如何最小化JavaScript源代码的有趣迷你基准测试:

http://www.ericmmartin.com/comparison-of-javascript-compression-methods/

简而言之:

  • 在HTTP协议中使用gzip压缩确实会产生巨大的影响(尽管服务器端需要付出CPU成本)。
  • 最小化(删除空格/注释,更改变量名称等)也有所帮助,如果您想获得最佳结果,请与gzip压缩一起使用。
  • 基于JavaScript的解压器很可能是无用的-虽然您可能会获得更小的大小,但客户端的CPU开销很大。

1

很多问题可能是因为不关心那些使用速度较慢的机器和连接的人,而假设每个人都有50Mbps的线路和3GB的RAM。

我们在.NET环境下作为构建过程的一部分对我们的(手写+插件、jQuery等)JS进行了缩小。没有预处理器,这是我们一旦有时间肯定要做的事情。

P.S. 顺便说一句,我们没有使用console.log,因为这会破坏IE。相反,我们有一个简单的包装函数,类似于:

function log(stuff) {
    if (window.console && window.console.log) {
        console.log(stuff);
    }
};

1
你正在编写哪些JavaScript库,其中缩小文件大小实际上会对最终用户的可用RAM产生重大影响? - Ben Dunlap
是的,没错,抱歉。请忽略RAM位。当然,缩小代码对RAM没有影响,我只是无缘无故地提出了编写高质量代码的问题。 - montrealist

1
对于我们的其中一个产品,我们将所有JavaScript文件连接在一起(大多数文件在大多数页面上都会使用,因此这对我们来说是有意义的),并使用Javascript::Minifier。这为我们带来了相当不错的速度提升。

1
我有一个 PHP 脚本,可以在服务器端执行并保留从源文件夹中提取的任何内容的缓存。

0

0

还有YUI Compressor的.NET端口,它允许您:

  • 将缩小/文件组合集成到Visual Studio后构建事件中
  • 集成到TFS Build(包括CI)中
  • 如果您希望在自己的代码中仅使用dll(例如即时缩小)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接