现在的Web项目总是离不开大量JavaScript,而JS文件的体积也越来越大,也越来越影响页面的感知性能(Perceived Performance)。因此,我们会对JS文件进行压缩,一方面是使用Gzip,而另一方面则是去除JS文件里的注释、空白,并且压缩局部变量长度等等。对于一些成熟的类库来说,它们本身都会提供“完整注释”以及“强烈压缩”两个版本。但是,有时候我们需要自己修复类库里的bug,这只能在注释版中修改,对于压缩版自然就无能为力了。此外,自定义的脚本文件一般也值得一压。因此我在项目中时常会备一个脚本压缩工具。

压缩脚本的工具有很多,例如老牌的JSMin,或是YUI Compressor(下称YC),它们都可以用来压缩脚本文件(后者还可以处理CSS)。不过在新项目中,我使用了新的工具:Google Closure Compiler(下称GC)。GC有多种用法,例如网页版,网络API版,还有独立应用程序版。GC与YC不同的是,YC是一个压缩器(Compressor),而GC更是一个编译器(Compiler),也就是说GC的压缩并不仅仅是去除注释和空白,还可以在保证代码正确性的情况下进一步地改写成更省空间的做法,一个字节算一个字节,例如:

a = new Object    => a = {}
a = new Array     => a = []
if (a) b()        => a && b()
return 2 * 3;     => return 6;

GC还提供了一些更危险的压缩方式,虽然有神奇效果,但个人不建议使用。关于YC和GC更详细的对比及注意事项,可以参考淘宝UED部门lifesinger所制作的无比精彩的幻灯片:

Closure Compiler vs YUICompressor

View more documents from lifesinger.

GC使用Java编写(YC也一样,不过它有.NET移植版),它的独立应用程序版是一个jar包。如果您不想装一个Java Runtime的话,则可以使用它的网络API版。但是,我在项目中却使用了另一种方式:即不需要安装JRE,也不需要依赖于网络。这个方式便是借助IKVM.NET将GC转化为.NET使用——还记得上次的Lucene 2.9吗?

我的项目组织结构大致是:

\src\Web.UI\Scripts\                   <- 存放JS脚本的目录
\tools\IKVM.NET\                       <- 存放IKVM.NET相关文件
\tools\closure-compiler\compiler.jar   <- GC的jar包
\tools\closure-compiler\build.bat      <- 将jar转化为exe的脚本
\tools\closure-compiler\compress.ps    <- 压缩JS的PowerShell命令

以上便是所有放入SVN中的文件,每个开发人员在使用GC之前,首先需要调用build.bat进行“重新编译”:

..\ikvm.net\ikvmc.exe compiler.jar -out:compiler.exe -target:exe
xcopy ..\ikvm.net\*.dll . /y /q

这两行脚本会将compiler.jar包编译为compiler.exe文件,并将IKVM.NET中需要的文件复制到closure-compiler目录下。于是,借助PowerShell的管道,便可以压缩Scripts目录下所有的JS文件:

dir -path ..\..\src\Web.UI\Scripts -filter *.js | % { .\compiler.exe --js $_.FullName --js_output_file ($_.FullName -replace ".js", ".min.js") }

这样,xxx.js便会被压缩为xxx.min.js。于是再配合项目中的扩展方法:

public static string Script(this HtmlHelper helper, string path)
{return "<script language=\"javascript\" type=\"text/javascript\" src=\"" + path +(helper.ViewContext.HttpContext.IsDebuggingEnabled ? ".min.js" : ".js") +"\"></script>";
}

万事俱备。

有些朋友时不时会羡慕其他平台上项目丰富,而在.NET平台上做一些事情感觉捉襟见肘的。我以前经常说,又何必把平台划分的那么细,大家既然都在为技术社区作贡献,那么思想或是做法都是可以借鉴的,所以也已经有了那么多移植过来的项目。而现在,可以“借鉴”的已经不只是“思想”,而是真正实际的项目!我相信在不久的将来,随着IronPython和IronRuby等项目愈发成熟,可以在.NET上运行的东西会越来越多(事实上,如IronPython其实已经很成熟了)。

嗯,到时候,Python的就是.NET的,Ruby的也是.NET的,而Java的——它还是.NET的。

在项目中使用Google Closure Compiler相关推荐

  1. JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法

    网上搜索了,目前主流的Js代码压缩工具主要有Uglify.YUI Compressor.Google Closure Compiler,简单试用了UglifyJS 和Google Closure Co ...

  2. IOS项目中加入Google Admob SDK

    错误1. Undefined symbols for architecture i386:   "_OBJC_CLASS_$_ASIdentifierManager", refer ...

  3. 【VUE】在vue中使用google地图

    文章目录 前言 前期准备 一.获取google地图的key 二.使用步骤 1.安装google官方依赖 2.使用googlemap 其他小方法1:设置marker 其他小方法2:设置infowindo ...

  4. Google公开其JavaScript工具:Closure Compiler

    Google Code官方博客今日开源了一个Google内部使用的JavaScript工具:Closure Compiler.这个工具在Google的Gmail,Google文档和Google地图中都 ...

  5. 研究员发现 Google Cloud 项目中的 SSRF 漏洞,获1万美元奖金

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 摘要 安全研究员David Schütz 发现谷歌 Cloud 项目中存在一个 URL 解析漏洞,可导致项目易受服务器端请求伪造(SSRF)攻击 ...

  6. android开发使用c+_如何在Android项目中开始使用C ++代码

    android开发使用c+ by Onur Tuna 通过Onur Tuna 如何在Android项目中开始使用C ++代码 (How to start using C++ code in your ...

  7. google closure

    自从Google释出了其Closure的JavaScript库以来,越来越多人希望了解它与Ext JS比起来究竟怎么样.由于我也属于这些想知道的人,所以我希望从我自己的角度来回答此问题,希望并不会由此 ...

  8. 利用google closure依赖工具配置

    为什么80%的码农都做不了架构师?>>>    为什么需要引入google closure 这边有一篇文章简单介绍了为什么要引入google closure,有兴趣的可看看这里. 什 ...

  9. Closure Compiler 使用

    为什么80%的码农都做不了架构师?>>>    该项目首页:http://code.google.com/intl/zh-CN/closure/compiler/ 下载地址:http ...

最新文章

  1. 【转载】Python3 sorted函数中key参数的作用原理
  2. 二叉树 二度节点和叶子节点之间的数量关系
  3. 95-34-025-Context-AbstractChannelHandlerContext
  4. C# datagridview 删除行(转 学会、放弃博客)
  5. Android开发——联系人中几种常见的mimetype、几张常见表的Uri
  6. tensorflow之reshape
  7. setuna.exe在win10下使用,桌面自动放大问题
  8. 读书篇:《细说PHP》一、简介
  9. 浙大PAT 1102
  10. C++:Sqlite调用之增、读、改
  11. php 多城市切换,切换城市
  12. wps如何保存最终状态_wps word 最后一次保存者 wps最后一次保存者
  13. 手把手教你BCGControlBar MFC界面控件“起航”技巧(文章转载自:慧都控件网)
  14. Unity3d 原生录音 Microphone
  15. 5.Redis数据结构介绍
  16. 【杰理AC632n】IIC-VCNL36826S
  17. 运维技能定级标准第3篇——关于运维工程师岗位的运维监控与MySQL数据库技能级别设计
  18. 群晖套件中心无法打开 无法添加第三方套件问题解决
  19. 基于PHP+MySQL的小型企业客户关系管理系统
  20. SAP中科目自动/手工记账控制测试

热门文章

  1. java vuser脚本_loadrunner12中JavaVuser脚本的编写
  2. android 图片缓存
  3. python多变量非线性拟合_python实现多变量线性回归(Linear Regression with Multiple Variables)...
  4. python中getopt函数_python getopt模块详解
  5. 小程序云开发,订阅消息定时批量发送实现代码
  6. phpstudy本地调试运行TP5的后台源码
  7. php批量修改文件名
  8. git ingore添加忽略文件无较的解决方法
  9. 浅谈HTTP中Get与Post的区别
  10. Oracle的口令文件(passwordfile)的讲解(摘录)