代码之家  ›  专栏  ›  技术社区  ›  DeeCee

如何自动化Java Web应用程序的JavaScript小型化?

  •  120
  • DeeCee  · 技术社区  · 7 年前

    我很想听听你更喜欢如何为Java Web应用程序自动化JavaScript小型化。以下是我特别感兴趣的几个方面:

    • 它如何 整合? 它是构建工具、servlet过滤器、独立程序后处理war文件的一部分,还是其他什么?
    • 它是 易于启用和禁用 ?尝试调试一个缩小的脚本是很不容易的,但是对于开发人员来说,能够测试缩小并不会破坏任何东西也是很有用的。
    • 它工作吗 透明地 或者它是否有任何副作用(除了缩小中固有的副作用),我在日常工作中必须考虑这些副作用?
    • 哪一个微型化器 它使用吗?
    • 它吗 缺少任何功能 你能想到吗?
    • 你觉得怎么样?
    • 什么 不要 你喜欢吗?

    这将主要作为我未来项目的参考(希望其他SOER也会发现它具有信息性),所以各种工具都很有趣。

    (注意 这不是一个关于哪个小型化器最好的问题。 . 我们已经有很多了。)

    10 回复  |  直到 8 年前
        2
  •  13
  •   Amr ElGarhy    17 年前

    我们正在使用Ant任务在生产构建期间使用Yuicompressor缩小JS文件,并将结果放入单独的文件夹中。然后我们将这些文件上传到Web服务器。您可以找到一些关于yui+ant集成的好例子 in this blog .

    下面是一个例子:

    <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>
    
        3
  •  12
  •   SZ Quadri    11 年前

    我认为最适合这份工作的工具之一是 WRO4J 退房 https://github.com/wro4j/wro4j

    它可以满足您的一切需求:

    • 使Project Web资源(JS&CSS)保持井然有序
    • 在运行时(使用简单筛选器)或构建时(使用Maven插件)合并并缩小它们
    • 免费和开源:根据Apache2.0许可证发布
    • WRO4J支持的几种小型化工具:jsmin、Google Closing Compressor、yui等
    • 很好用。支持servlet过滤器、普通Java或Spring配置
    • javascript和css元框架支持:coffeescript、less、sass等
    • 验证:jslint、csslint等

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

    您可以简单地包括合并、缩小和压缩的资源,如下所示:

    <script type="text/javascript" src="wro/all.js"></script>
    
        4
  •  8
  •   victor    14 年前

    我已经为谷歌闭包编译器和雅虎压缩程序编写了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 Closing编译器和Yahoo Compressor,您应该手动下载它们并将它们放在XML文件附近。

    • 迷你服务器跳过已压缩的文件(以 -min* )

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

    • Yahoo Compressor可以用单个宏缩小dir中的所有文件,而closure编译器不能

        5
  •  7
  •   dfa    14 年前

    我尝试了两种方法:

    1. 使用servlet过滤器。在生产模式下,过滤器被激活,它压缩任何绑定到URL的数据,如*.css或*.js。
    2. 使用Maven和 yuicompressor-maven-plugin (当装配 生产战 )

    当然,后一种解决方案更好,因为它不会在运行时消耗资源(我的webapp正在使用google app引擎),并且不会使应用程序代码复杂化。因此,假设后一种情况出现在以下答案中:

    它是如何集成的?它是构建工具、servlet过滤器、独立程序后处理war文件的一部分,还是其他什么?

    使用Maven

    启用和禁用容易吗?尝试调试一个缩小的脚本是很不容易的,但是对于开发人员来说,能够测试缩小并不会破坏任何东西也是很有用的。

    只有在组装最终战争时才激活它;在开发模式中,您可以看到资源的未压缩版本。

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

    绝对地

    它使用哪一个微型放大器?

    YUI压缩机

    它是否缺少您能想到的任何功能?

    不,它很完整,很容易使用

    你觉得怎么样?

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

        6
  •  4
  •   Andy Bell    15 年前

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

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

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

    代码示例为:

    <g:compress>
      <script type="text/javascript" src="common.js"/>
      <script type="text/javascript" src="closure/goog/base.js"/>
      <script>
           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>
    ...
    
    
        7
  •  3
  •   Amr Mostafa    8 年前

    我真的很惊讶没人提到 JWR - https://j-a-w-r.github.io

    它非常成熟,支持所有预期的标准功能,还有一点。这就是它如何与OP的优秀标准相抵触。

    它是如何集成的?它是构建工具的一部分吗,servlet 过滤器,独立程序后处理战争文件,或 还有别的吗?

    它最初在应用程序启动时进行处理/重载提升,服务基于 servlet . 从3.x开始,他们增加了对 integrating at build time .

    通过自定义JSP标记库提供对JSP和Facelets的支持,以导入已处理的资源。除此之外,还实现了一个JS资源加载器,它支持 loading the resources from static HTML pages .

    启用和禁用容易吗?尝试和调试 缩小脚本,但对于开发人员来说 测试缩小是否不会破坏任何东西。

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

    它使用哪一个微型放大器?

    对于JS,它支持yui压缩器和jsmin,对于css,我不确定。

    它是否缺少您能想到的任何功能?

    SASS 我想到了支持。也就是说,它确实支持 LESS .

        8
  •  2
  •   doomspork    17 年前

    我们的项目已经处理了很多方法,但是我们继续使用 YUI Compressor 通过我们不同的迭代。

    我们最初有一个servlet在第一次访问特定文件时处理javascript的压缩;然后将其缓存。我们已经有了一个处理自定义属性文件的系统,因此我们只需更新配置文件,以支持启用或禁用压缩器,具体取决于我们所处的环境。

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

    我们的客户机从未对压缩提出过担忧,开发人员在决定调试JavaScript之前不会注意到它。所以我想说这是相当透明的,如果有任何副作用的话,也是最小的。

        9
  •  1
  •   Reverse Tarzan    13 年前

    这对我很有用: 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>
    
        10
  •  1
  •   Mwanji Ezana    11 年前

    我正在编写一个管理Web资产的框架,叫做 humpty . 它的目标是使用Webjars和ServiceLoader,比Jawr或Wro4j更简单、更现代。

    它是如何集成的?它是构建工具、servlet过滤器、独立程序后处理war文件的一部分,还是其他什么?

    在开发中,servlet根据需要处理资产。然后,这些资产将在生产之前进行预编译,并放置在公用文件夹中,这样,所使用的唯一部分就是生成HTML中正确的includes。

    启用和禁用容易吗?尝试调试一个缩小的脚本是很不容易的,但是对于开发人员来说,能够测试缩小并不会破坏任何东西也是很有用的。

    这将通过在开发和生产模式之间切换来实现。

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

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

    它使用哪一个微型放大器?

    不管你放在类路径上的插件使用哪一个。目前正在为Google闭包编译器编写插件。

    它是否缺少您能想到的任何功能?

    仍然是预发布,尽管我在生产中使用它。Maven插件仍然需要大量的工作。

    你觉得怎么样?

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

    你不喜欢它吗?

    这是我的孩子,我爱死它了;)