`
Cjch
  • 浏览: 111986 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

试用Google Closure Compiler的API

阅读更多
(转)
原来的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.
分享到:
评论

相关推荐

    js压缩工具Google Closure Compiler

    2. **API集成**:Google提供了Java API,允许开发者将Closure Compiler集成到构建流程中,如Maven或Gradle项目。 3. **在线服务**:还有免费的在线版本,可以直接在浏览器中上传代码进行编译。 ### 四、注意事项 ...

    用谷歌的closure-compiler + maven-antrun-plugin

    标题中的“用谷歌的closure-compiler + maven-antrun-plugin”表明了本文将探讨如何结合Google的Closure Compiler工具和Maven的Antrun插件来优化JavaScrip项目。Closure Compiler是一款强大的JavaScript代码压缩器,...

    Google Javascript Closure Compiler

    closure-compiler-v20170521.jar,以及一个.chm使用说明:‘Getting Started with the Closure Compiler Application’,‘Advanced Compilation and Externs’,‘Understanding the Restrictions Imposed by the ...

    使用Google Closure Compiler js压缩

    **使用Google Closure Compiler进行JavaScript压缩** Google Closure Compiler是一款强大的JavaScript优化工具,由Google开发,它能够对JavaScript代码进行压缩、优化和格式化,以提高网页加载速度和减少网络带宽...

    closure-compiler-v20171112.jar

    在使用"closure-compiler-v20171112.jar"时,用户可以通过命令行界面或者Java API调用来运行编译器。命令行界面允许用户指定输入文件、输出文件以及选择的优化级别。例如,使用以下命令可以进行简单的压缩: ``` ...

    Closure Compiler exe

    Closure Compiler exe 根据[在项目中使用Google Closure Compiler](http://www.cnblogs.com/JeffreyZhao/archive/2009/12/09/ikvm-google-closure-compiler.html)

    测试eval方法所以造成无法通过google closure compiler编译

    本文将深入探讨`eval()`以及它为何会导致无法通过Google Closure Compiler进行编译。 `eval()`的工作原理: 当`eval()`接收到一个字符串参数时,它会尝试将这个字符串解释为JavaScript代码,并执行这些代码。例如,...

    Google Closure Compiler

    Google提供的开源的javascript压缩加密工具。 机器上装java,命令行运行即可。 java -jar compiler.jar --js hello.js --js_output_file hello-compiled.js

    Google Closure Compiler 2015

    Google提供的开源的javascript压缩加密工具。机器上装java,命令行运行即可。java -jar compiler.jar -js hello.js -js_output_file hello-compiled.js

    closure-compiler-maven-plugin:Maven 插件,用于使用 Google 的 Closure 编译器编译压缩 JavaScript 代码

    Closure Compiler Maven 插件是开发JavaScript应用程序的一个强大工具,它集成在Maven构建流程中,利用Google的Closure Compiler对JavaScript代码进行优化和压缩。Closure Compiler以其先进的语法分析和优化技术著称...

    juzu-plugins-closurecompiler-1.0.0-cr1.zip

    Closure Compiler是一款由Google开发的JavaScript代码优化工具,它能够压缩、优化和混淆JavaScript代码,从而提高代码执行效率并减小文件大小,这对于Web应用的性能优化至关重要。 【描述】提到的"capture-replay-...

    利用ClosureCompiler通过Rollup缩小和优化JavaScript

    Closure Compiler是一款由Google开发的高级JavaScript编译器,它能够对源代码进行静态分析和优化,包括删除未使用的变量、函数和类,以及进行类型检查,将变量名混淆(minification)等,从而显著减小代码体积并提高...

    Closure Compiler

    Closure Compiler是用来编译JavaScript的编译器,除了像最常见的JavaScript的压缩机提供的功能,它还会对程序进行分析,把不需要的部份移除,减少的JavaScript程序的大小及提升效率。

    closure-compiler:围绕 Google Closure Compiler 的 PHP Wrapper

    Google 提供的 Closure Compiler (CC) 可作为 Web 应用程序使用,也可作为命令行 Java jarfile 下载。 此文件可用于运行您自己的编译。 但是,要以这种方式使用编译器,您必须将所有 javascript 文件名键入(或粘贴...

    catharsis:用于 Google Closure Compiler 和 JSDoc 类型表达式的 JavaScript 解析器

    导泻 用于和类型表达式的 JavaScript 解析...// Closure Compiler parsing const type = '!Object' ; let parsedType ; try { parsedType = catharsis . parse ( type ) ; // {"type":"NameExpression,"name":"Objec

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

    一、UglifyJS UglifyJS是用JavaScript编写的JavaScript压缩工具。 ...1、通过NPM安装UglifyJS (1)安装Node.js ... 本人下载的是10.14.2,下载下来是一个node-v10.14.2-x64.msi安装包,按照默认下一步安装。...

    ClosureJavascriptFramework:一组可以与maven结合使用,在JavaScript代码上执行Google Closure Compiler的插件。 该框架允许扩展和模块化

    下面的软件是Closure Javascript Framework,它是一组插件,可以与maven结合使用,在JavaScript代码上执行Google Closure Compiler。 该框架允许扩展和模块化。 更多信息请参考位置网站: : Maven 文档请参考: :...

    closure-compiler-npm, 用于管理和记录关闭编译器的包,通过npm使用.zip

    closure-compiler-npm, 用于管理和记录关闭编译器的包,通过npm使用 google-closure-compiler 用闭包编译器检查。编译。优化和压缩 Javascript这个库跟踪发布到 npmjs.org 和相关插件的相关问题。 任何与插件无关的...

    google compiler JS压缩

    **谷歌Closure Compiler JS压缩** 谷歌Closure Compiler是一款强大的JavaScript代码压缩工具,它能够对JS代码进行优化,提升网页加载速度,减少文件大小,从而提高用户体验。Closure Compiler通过删除未使用的变量...

Global site tag (gtag.js) - Google Analytics