您如何为Java Web应用程序自动化Java压缩?


122

我很想听听您希望如何为Java Web应用程序自动化Javascript压缩。以下是我特别感兴趣的几个方面:

  • 如何整合?它是构建工具的一部分,Servlet过滤器,对WAR文件进行后处理的独立程序还是其他工具?
  • 启用和禁用是否容易?尝试调试缩小的脚本是很不有趣的,但是对于开发人员而言,能够测试缩小不会破坏任何内容也很有用。
  • 它是否可以透明地工作,或者是否有我在日常工作中必须考虑的副作用(除了缩小中固有的副作用)?
  • 它使用哪个缩小器?
  • 缺少您能想到的任何功能吗?
  • 你喜欢它什么?
  • 什么喜欢呢?

这将主要作为我未来项目的参考(希望其他SOer也会提供参考),因此各种工具都很有趣。

(请注意,这不是哪个减法器最好的问题。我们周围已经有很多。)


看起来真的很有趣,没听说过。我在快速搜索中找到的所有工具都是只能运行一次的手动工具。如果有用于ant或maven的插件,那就太好了。希望有人有一个好的答案。
杰伊

看来有人这样做了-检查dfa的答案:stackoverflow.com/questions/1379856/…–
gustafc

Answers:


65

13

在生产构建期间,我们使用Ant任务通过YUICompressor最小化js文件,并将结果放入单独的文件夹中。然后,我们将这些文件上传到Web服务器。您可以在此博客中找到一些有关YUI + Ant集成的良好示例。

这是一个例子:

<target name="js.minify" depends="js.preprocess">
    <apply executable="java" parallel="false">
        <fileset dir="." includes="foo.js, bar.js"/>
        <arg line="-jar"/>
        <arg path="yuicompressor.jar"/>
        <srcfile/>
        <arg line="-o"/>
        <mapper type="glob" from="*.js" to="*-min.js"/>
        <targetfile/>
    </apply>
</target>

2
片段;很好 您是否将目标对准script src开发版本,还是将未缩小的文件复制到Compressed / js目录中?
gustafc

仅用于生产时,将压缩文件上传到public_html / js中原始文件的上方。好消息是本地和生产之间没有编码或路径更改,坏消息是您必须进行一些手动上载和覆盖(我敢肯定它可以自动化,但是对我们来说这不值得,上载偶尔有几个js文件不是一件大事)。
serg

我使用了您的代码,但它在我的项目的根目录下创建了缩小文件,<fileset dir="${generatedScriptsDir}" includes="**/*.js"/>但设置无效。如何在中生成文件${generatedScriptsDir}
Vadorequest 2015年

尝试将“ dir”属性添加到“ apply”标签。确保已将“ $ {
generationScriptsDir

12

我认为工作的最佳工具之一是wro4j签https://github.com/wro4j/wro4j

它可以满足您的所有需求:

  • 保持项目Web资源(js和CSS)的井井有条
  • 在运行时(使用简单的过滤器)或构建时(使用maven插件)合并并缩小它们
  • 免费和开源:根据Apache 2.0许可发布
  • wro4j支持的几种缩小工具:JsMin,Google Closure压缩器,YUI等
  • 很好用。支持Servlet过滤器,纯Java或Spring配置
  • Javascript和CSS元框架支持:CoffeeScript,Less,Sass等
  • 验证:JSLint,CSSLint等

可以在调试以及生产模式下运行。只需指定它应该处理/预处理的所有文件,其余的就完成。

您可以像这样简单地包括合并,缩小和压缩的资源:

<script type="text/javascript" src="wro/all.js"></script>

2
似乎确实是一个漂亮的工具。感谢您的更新!
gustafc 2013年

是否向资源文件添加版本控制以强制客户端刷新?我找不到有关此功能的任何文档。

我在wro4j中真正想念的唯一一件事是CSS前缀。
inafalcao

是否可以wroapacheWeb服务器提供静态内容(由App服务器生成)?
HybrisHelp

8

我已经为Google Closure编译器和Yahoo压缩器编写了ant宏,并将此文件包含在其他Web项目中。

<?xml version="1.0" encoding="UTF-8"?>
<!-- CSS and JS minifier. -->
<!DOCTYPE project>
<project name="minifier" basedir=".">

  <property name="gc" value="compiler-r1592.jar" />
  <property name="yc" value="yuicompressor-2.4.6.jar" />

  <!-- Compress single js with Google Closure compiler -->
  <macrodef name="gc-js">
    <attribute name="dir" />
    <attribute name="src" />
    <sequential>
      <java jar="${gc}" fork="true">
        <!--
        - - compilation_level WHITESPACE_ONLY | SIMPLE_OPTIMIZATIONS | ADVANCED_OPTIMIZATIONS
        Specifies the compilation level to use. Default: SIMPLE_OPTIMIZATIONS
        - - warning_level QUIET | DEFAULT | VERBOSE
        Specifies the warning level to use.
        -->
        <arg line="--js=@{dir}/@{src}.js" />
        <arg line="--js_output_file=@{dir}/@{src}-min-gc.js" />
      </java>
    </sequential>
  </macrodef>

  <!-- Compress single js with Yahoo compressor -->
  <macrodef name="yc-js">
    <attribute name="dir" />
    <attribute name="src" />
    <sequential>
      <java jar="${yc}" fork="true">
        <arg value="@{dir}/@{src}.js" />
        <arg line="-o" />
        <arg value="@{dir}/@{src}-min-yc.js" />
      </java>
    </sequential>
  </macrodef>

  <!-- Compress all js in directory with Yahoo compressor -->
  <macrodef name="yc-js-all">
    <attribute name="dir" />
    <sequential>
      <apply executable="java" parallel="false">
        <fileset dir="@{dir}" includes="*.js" excludes="*-min*.js" />
        <arg line="-jar" />
        <arg path="${yc}" />
        <srcfile />
        <arg line="-o" />
        <mapper type="glob" from="*.js" to="@{dir}/*-min-yc.js" />
        <targetfile />
      </apply>
    </sequential>
  </macrodef>

  <!-- Compress all css in directory with Yahoo compressor -->
  <macrodef name="yc-css-all">
    <attribute name="dir" default="${build.css.dir}" />
    <sequential>
      <apply executable="java" parallel="false">
        <fileset dir="@{dir}" includes="*.css" excludes="*-min*.css" />
        <arg line="-jar" />
        <arg path="${yc}" />
        <arg line="-v --line-break 0" />
        <srcfile />
        <arg line="-o" />
        <mapper type="glob" from="*.css" to="@{dir}/*-min.css" />
        <targetfile />
      </apply>
    </sequential>
  </macrodef>
</project>
  • 集成:<import file="build-minifier.xml" />在build.xml中,然后像往常一样调用ant任务:<gc-js dir="${build.js.dir}" src="prototype" /> <yc-js-all dir="${build.js.dir}" />

  • 选择两个压缩器:Google Closure编译器和Yahoo压缩器,应手动下载它们并将其放置在xml文件附近

  • 压缩程序会跳过已压缩的文件(以结尾-min*

  • 通常,我会制作三种版本的脚本:未压缩(例如prototype.js)用于调试,使用闭包编译器(prototype-min-gc.js)压缩用于生产服务器,使用Yahoo(prototype-min-yc.js)压缩用于故障排除,因为闭包编译器使用危险的优化,有时会生成无效的压缩文件,并且Yahoo压缩器更安全

  • Yahoo压缩程序可以使用单个宏缩小目录中的所有文件,而Closure编译器无法


8

我尝试了两种方法:

  1. 使用Servlet过滤器。在生产模式下,过滤器将被激活,并压缩绑定到URL的任何数据,例如* .css或* .js
  2. 使用maven和yuicompressor-maven-plugin ; 压缩是在非密宗中进行的(在组织生产战争时

当然,后一种解决方案更好,因为它在运行时不占用资源(我的Web应用程序正在使用Google App Engine),并且不会使您的应用程序代码复杂化。因此,在以下答案中假定后一种情况:

如何整合?它是构建工具,servlet过滤器,对WAR文件进行后处理的独立程序的一部分,还是其他东西?

使用Maven

启用和禁用容易吗?尝试调试缩小的脚本是很不有趣的,但是对于开发人员而言,能够测试缩小不会破坏任何内容也很有用。

您只有在组装最后一战时才激活它;在开发模式下,您会看到资源的未压缩版本

它是否可以透明地工作,或者是否有我在日常工作中必须考虑的副作用(除了缩小方面的固有副作用)?

绝对

它使用哪个缩小器?

YUI压缩机

它缺少您能想到的功能吗?

不,它非常完整且易于使用

你喜欢它什么?

它与我最喜欢的工具(Maven)集成在一起,并且插件在中央存储库中(一个好的Maven公民)


Maven插件-不错。太糟糕了,我目前的项目都使用ant :)
gustafc

您可以创建构建“生产war文件”的目标,使用YUI蚂蚁任务
DFA

4

我认为您需要一个压缩库,例如Granule标签。

http://code.google.com/p/granule/

它使用不同的方法gzip并合并由g:compress标记包装的javascript,还具有Ant任务

代码示例是:

<g:compress>
  <script type =“ text / javascript” src =“ common.js” />
  <script type =“ text / javascript” src =“ closure / goog / base.js” />
  <脚本>
       goog.require('goog.dom');
       goog.require('goog.date');
       goog.require('goog.ui.DatePicker');
  </ script>
  <script type =“ text / javascript”>
      var dp = new goog.ui.DatePicker();
      dp.render(document.getElementById('datepicker'));
  </ script>
</ g:compress>
...


是的,这看起来很漂亮。
gustafc 2011年

3

我真的很惊讶没有人提到JAWR - https: //jawr.github.io

它已经相当成熟,并且支持所有预期的标准功能,甚至更多。这与OP的出色标准不符。

如何整合?它是构建工具,servlet过滤器,对WAR文件进行后处理的独立程序的一部分,还是其他东西?

它最初是在应用程序启动时进行处理/繁重的工作,并且服务是基于servlet的。从3.x开始,他们增加了对在构建时进行集成的支持。

通过自定义JSP标记库提供对JSP和Facelets的支持,以导入已处理的资源。除此之外,还实现了JS资源加载器,该加载器支持从静态HTML页面加载资源

启用和禁用容易吗?尝试调试缩小的脚本是很不有趣的,但是对于开发人员而言,能够测试缩小不会破坏任何内容也很有用。

debug=on在应用程序启动之前可以使用一个选项,并且GET可以在生产中的各个请求中指定自定义参数,以在运行时针对该请求有选择地切换调试模式。

它使用哪个缩小器?

对于JS,它支持YUI Compressor和JSMin,对于CSS,我不确定。

它缺少您能想到的功能吗?

SASS支持浮现在脑海。也就是说,它确实支持LESS


2

我们的项目以多种方式处理了它,但是我们通过不同的迭代继续使用YUI Compressor

最初,当第一次访问特定文件时,我们有一个servlet处理JavaScript的压缩。然后将其缓存。我们已经有一个处理自定义属性文件的系统,因此我们仅更新了配置文件即可支持根据工作环境而启用或禁用压缩器。

现在,开发环境从不使用压缩的JavaScript进行调试。而是在将应用程序导出到WAR文件时在构建过程中处理压缩。

我们的客户从未对压缩感到担忧,开发人员直到决定调试JavaScript时才注意到它。因此,我想说它是透明的,几乎没有副作用。


在构建过程中如何使用YUI压缩器?Maven插件还是其他?
gustafc

1
抱歉,我们当前使用的是Ant。这是Ant任务的有用链接:blog.gomilko.com/2007/11/29/yui-compression-tool-as-ant-task
doomspork 2009年

1

这对我有用https//bitbucket.org/m6_russell_francis/yui-compressor-ant-task/wiki/Home

<!-- minimize all static *.css & *.js content -->
<target name="static-content-minify">

    <taskdef name="yuicompressor"
             classname="com.metrosix.yuicompressor.anttask.YuiCompressorTask">
        <classpath>
            <pathelement location="${jar.yui.compressor}"/>
            <pathelement location="${jar.yui.anttask.compressor}" />
        </classpath>
    </taskdef>

    <yuicompressor todir="${build.static.content.min}" charset="utf-8" 
        preserveallsemicolons="true" munge="true" >
        <fileset dir="${src.static.content}">
            <include name="**/*.css"/>
            <include name="**/*.js"/>
        </fileset>
    </yuicompressor>
</target>

我从search.maven.org获得了$ {jar.yui.compressor}:search.maven.org/…–
反向Tarzan,

1

我正在编写一个用于管理Web资产的框架,称为humpty。通过使用WebJars和ServiceLoader,它的目标是比jawr或wro4j更简单,更现代。

如何整合?它是构建工具,servlet过滤器,对WAR文件进行后处理的独立程序的一部分,还是其他东西?

在开发中,Servlet根据需要处理资产。然后,资产将在生产之前进行预编译,并放置在公用文件夹中,以便仅使用的部分在HTML中生成正确的包含。

启用和禁用容易吗?尝试调试缩小的脚本是很不有趣的,但是对于开发人员而言,能够测试缩小不会破坏任何内容也很有用。

这可以通过在开发和生产模式之间切换来完成。

它是否可以透明地工作,或者是否有我在日常工作中必须考虑的副作用(除了缩小方面的固有副作用)?

我相信它是透明的,但确实强烈支持使用WebJars。

它使用哪个缩小器?

放在类路径中的插件使用哪种插件。目前正在考虑为Google Closure编译器编写插件。

它缺少您能想到的功能吗?

虽然我正在生产中使用它,但仍是预发行版。Maven插件仍然需要大量工作。

你喜欢它什么?

只需添加依赖项来配置框架的简单性

您对此不满意吗?

这是我的宝贝,我全都爱;)


1

在这里参加聚会真的很晚,但认为这可能会帮助仍在寻找其他答案的人:

在尝试使用YUI Compressor之后,令我失望的是它与jQuery和Prism的最新版本不兼容(我的项目需要两个主要的第三方JS库,我想将它们压缩到一个文件中)。所以我决定用 Terser,它是支持ES6 +的Uglify-JS的分支。我无法使用<exec>任务直接运行它,但是使用Windows命令行方法至少适用于Win 10(不是说它不能正常运行,但这是一个非常简单的解决方法)。无需向Path系统变量添加任何其他内容(因为通常在安装过程中添加Node.JS)。我首先使用ANT <concat>任务制作一个大的未压缩文件。使用<fileset>它会保留顺序(如果重要的话,无论如何)。

<concat destfile="${js-big-file}" encoding="UTF-8" outputencoding="UTF-8" fixlastline="true">
   <filelist refid="js-input-filelist"/>
</concat>

然后使用 <exec>任务运行任何NPM程序,例如Terser。关于此任务Apache手册页指出,这是运行.bat文件的Windows解决方法,但实际上,它允许您几乎运行任何命令行应用程序(甚至那些<exec>神秘地找不到的命令行应用程序)。

<exec executable="cmd">
   <arg value="/c"/>
   <arg value="terser"/>
   <arg value="${js-big-file}" />
   <arg value="-o" />
   <arg value="${smaller-js-file}"/>  
</exec>

整合?它是ANT构建脚本的一部分(DITA Open Toolkit插件可支持自定义JavaScript等,本质上不是Java Web应用程序,而是使用Java构建HTML5输出),因此集成只不过是添加了这些内容而已。任务转移到新目标(有关设置默认值和检查输入参数的更多代码!)。

易于启用/禁用?就我而言,我有一个传递给ANT Build的参数,以便包括构建和缩小JS文件。因此,是的,仅当我将参数设置为“是”时,它才执行此目标。在ANT构建中设置起来非常容易。

透明到目前为止,它似乎对我包含的所有JS文件没有影响。其中一些是我自己的(无论如何我都不是JS专家),并且有些是(如上所述)通用的JS库。

粉碎机 Terser,但是通过此方法,您几乎可以在命令行输入中使用任何缩小器。

缺乏功能?特塞尔适用于JavaScript。如果我想对我的CSS文件做同样的事情(我这样做),请使用YUI Compressor。

喜欢那样,它是一个当前活跃的项目,并具有良好的支持。另外,当前的实现(仅通过ANT <exec>目标调用它)使我可以交换缩小器,以备不时之需。

不喜欢它需要Node.JS。请注意,对Node.JS并没有什么反对,只是这个特定项目不需要它。为此,我更喜欢使用Java .jar文件(如YUI Compressor)(我可以使用插件轻松分发该文件)。


也欢迎后来者!我同意让一个项目依赖两个不同的编程环境(Java + Node)会很麻烦。尽管如此,大多数Javascript工作发生在Node社区中也不足为奇,所以没有太多的事情要做,而且Terser如今似乎有很大的发展动力。感谢您的贡献!
gustafc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.