(转)
原来的JS压缩服务采用的是YUI Compressor,一年下来表现还算稳定。
今天老高说想尝试一下Google Closure Compiler,翻了翻文档,看看有没API能直接用的:传一个原始字符串,返回一个压缩后的字符串。找了半天,没有此类的例子(看来设计者认为像我们这样直接采用API而不是使用命令行的用户不多)。
查看JavaDoc,定位到com.google.javascript.jscomp.Compiler,有如下描述:
Compiler (and the other classes in this package) does the following:
* parses JS code
* checks for undefined variables
* performs optimizations such as constant folding and constants inlining
* renames variables (to short names)
* outputs compact javascript code
看来就是这个了。
相中方法: Result compile(JSSourceFile extern, JSSourceFile input, CompilerOptions options) 。
input和options容易理解,extern是什么?其实类的描述里也稍微提了下:
External variables are declared in ‘externs’ files. For instance, the file may include definitions for global javascript/browser objects such as window, document.
很显然可以没有extern(但不能为NULL,设置方法参看底下的代码)。
按道理,编译后返回的result里应该就有我想要的结果了吧,结果出乎意料。Result只有编译状态的描述。难道此路不通?
又从JAR包的 META-INF看到入口类是CompilerRunner,一路追踪下去。。。中间省略文字几千字。绕了半天,得出的结论是:和 CompilerRunner相关的几个类很难复用,想用的方法要么是不可见,要么是包可见,要么是子类可见。代理来继承去,眼看就OK了,又发现很多状态居然是static的,这使得程序的状态是迭加的。看来此路也不通。。。又绕回Compiler。晕,原来Compiler有一个方法 toSource()就是返回压缩化的代码的。
这下好办了。主要代码如下:
final ByteArrayOutputStream err = new ByteArrayOutputStream();
final PrintStream errWrapper = new PrintStream(err);
final Compiler compiler = new Compiler(errWrapper);
final ByteArrayInputStream bais = new ByteArrayInputStream(codeBytes);
final CompilerOptions options = new CompilerOptions();
final CompilationLevel level = CompilationLevel.SIMPLE_OPTIMIZATIONS
level.setOptionsForCompilationLevel(options);
final Result status = compiler.compile(JSSourceFile.fromCode("extern", ""), JSSourceFile.fromInputStream("input", bais), options);
System.out.println(compiler.toSource);
把代码布上后,测试通过。本来这是一件小事,没必要以此作为BLOG的内容。但是这件事也是给了我几个感触,觉得有必要说一说:
一、文档很重要。简单的几句话,也许就能让用户少走很多弯路。DAL后面一定要多写文档,特别是使用手册。
二、API设计要符合直觉。不符合直觉的设计会造成大量的困扰。当年Lucene的delete操作,用脚跟想想就应该放在IndexWriter里,可设计者却把它放在IndexReader里,结果邮件列表里经常出现此类的问题。当然,后续版本已经做了修改(IndexWriter有了delete方法)。用户不会关心你为什么这么做;新用户要抛弃你只要点一下鼠标就可以了;而老用户选择离开只需要皱一下眉头。
三、时间管理很重要。任何事情都应该在任务框架里进行;否则,很多东西可能会失控。
—The end.
分享到:
相关推荐
closure-compiler-v20170521.jar,以及一个.chm使用说明:‘Getting Started with the Closure Compiler Application’,‘Advanced Compilation and Externs’,‘Understanding the Restrictions Imposed by the ...
NULL 博文链接:https://maidou80.iteye.com/blog/1096203
使用Google Closure Compiler js压缩
Closure Compiler exe 根据[在项目中使用Google Closure Compiler](http://www.cnblogs.com/JeffreyZhao/archive/2009/12/09/ikvm-google-closure-compiler.html)
Google提供的开源的javascript压缩加密工具。 机器上装java,命令行运行即可。 java -jar compiler.jar --js hello.js --js_output_file hello-compiled.js
eval方法所以造成无法通过google closure compiler编译
Google提供的开源的javascript压缩加密工具。机器上装java,命令行运行即可。java -jar compiler.jar -js hello.js -js_output_file hello-compiled.js
google closure compiler js混淆压缩工具方便无法访问google的朋友们下载
Closure Compiler是用来编译JavaScript的编译器,除了像最常见的JavaScript的压缩机提供的功能,它还会对程序进行分析,把不需要的部份移除,减少的JavaScript程序的大小及提升效率。
Google 提供的 Closure Compiler (CC) 可作为 Web 应用程序使用,也可作为命令行 Java jarfile 下载。 此文件可用于运行您自己的编译。 但是,要以这种方式使用编译器,您必须将所有 javascript 文件名键入(或粘贴...
用谷歌的closure-compiler + maven-antrun-plugin
导泻 用于和类型表达式的 JavaScript 解析...// Closure Compiler parsing const type = '!Object' ; let parsedType ; try { parsedType = catharsis . parse ( type ) ; // {"type":"NameExpression,"name":"Objec
一、UglifyJS UglifyJS是用JavaScript编写的JavaScript压缩工具。 ...1、通过NPM安装UglifyJS (1)安装Node.js ... 本人下载的是10.14.2,下载下来是一个node-v10.14.2-x64.msi安装包,按照默认下一步安装。...
下面的软件是Closure Javascript Framework,它是一组插件,可以与maven结合使用,在JavaScript代码上执行Google Closure Compiler。 该框架允许扩展和模块化。 更多信息请参考位置网站: : Maven 文档请参考: :...
closure-compiler-npm, 用于管理和记录关闭编译器的包,通过npm使用 google-closure-compiler 用闭包编译器检查。编译。优化和压缩 Javascript这个库跟踪发布到 npmjs.org 和相关插件的相关问题。 任何与插件无关的...
利用Closure Compiler通过Rollup缩小和优化JavaScript
js代码的压缩与混淆: –charset :指定输入输出文件的字符集,缺省预设UTF-8作为输入文件的字符集,US_ASCII做为输出文件的字符集。 –debug:开启调试选项 –help:输出帮助信息 ...
capture-replay-framework.zip,该框架通过捕获真实数据将测试数据生成提升到一个新的层次。而不是