Maven YUI压缩javascript

时间:2014-01-10 23:30:47

标签: javascript maven yui-compressor

我正在尝试设置YUI压缩器,这样每次我构建一个部署的战争时,它都会缩小我的JS并将其转换为cachebusting。我已经设法得到它所以缩小的文件可用maven版本作为后缀,但原始文件仍然存在,加上我每次构建时都需要更新所有hrefs(并且本地我仍然希望使用原件)。任何人都可以建议如何解决这个问题?

这是我对插件的看法:

        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>yuicompressor-maven-plugin</artifactId>
            <version>1.1</version>
            <configuration>
                <excludes>
                    <exclude>**/farbtastic/*</exclude>
                    <exclude>**/jquery.js</exclude>
                    <exclude>**/*.css</exclude>
                </excludes>
                <suffix>.${version}</suffix>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compress</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

1 个答案:

答案 0 :(得分:4)

版本

1.1很老了。我们使用1.3.2

在本地我仍然想要使用原件

您应该使用profiles。您应该有两个配置文件(或可能更多)。

  • One for Development / Local
  • 一个用于生产/发布/ UAT等(仅包含最小化插件)

这是我们实施的并且在很长一段时间内都运行良好:请尝试这种方式(注意 - 请参阅 war插件中的内容,下面,这非常重要。你可能会需要更改最小化的 targetPath

<profile>
    <id>Production</id>
    .......
    .......
 <plugin>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>yuicompressor-maven-plugin</artifactId>
    <version>1.3.2</version>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <goals>
                <goal>compress</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <nosuffix>true</nosuffix>
        <encoding>UTF-8</encoding>
        <!-- Show warnings decided on value of variable set in each profile -->
        <jswarn>${yuiCompression.warn}</jswarn>
        <webappDirectory>${project.build.directory}/minimized</webappDirectory>
        <excludes>
                <exclude>**/farbtastic/*</exclude>
                <exclude>**/jquery.js</exclude>
                <exclude>**/*.css</exclude>
        </excludes>
    </configuration>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <argLine>-Xmx1024m</argLine>
        <dependentWarExcludes>....</dependentWarExcludes>
        <warSourceExcludes>....</warSourceExcludes>
        <packagingExcludes>....</packagingExcludes>
        <packagingExcludes>....</packagingExcludes>
        <webResources>
            <resource>
                <directory>${project.build.directory}/minimized</directory>
                <targetPath>/</targetPath>
            </resource>
        </webResources>
    </configuration>
</plugin>

让我知道它是否有效。

想要文件版本号并让hrefs更新指向最新版本的问题

我想你的意思是通过版本控制缓存控制(基本上是为了确保在发布时始终加载新的js / css?)。这个插件不会这样做。您的代码将如何知道要使用哪个版本?

我们使用自定义Tag lib实现了这个:之后我们的Js / Css声明如下:

<custom:ScriptTag src="/js/xyz.js"></custom:ScriptTag>
<custom:CssTag rel="stylesheet" type="text/css" href="/style/someStyle.css"/>

编译/渲染的jsp看起来像这样:

<script type='text/javascript' src='/js/4112-13178/xyz.js' ></script>
<link type='text/css' href='/style/4112-13178/someStyle.css'  rel='stylesheet' />

4112-13178 之间是release-svnversion。

一旦引用了这个url重写过滤器(基于Tuckey或Apache mod_rewrite,如果你在前面使用apache),请将其重写为:

<script type='text/javascript' src='/js/xyz.js' ></script> 

当浏览器向服务器请求时。

解决方案2 - 版本控制(使用YUI插件但没有URLRewrite)

  • 您可以使用YUI插件将版本添加到js。
  • 然后将版本号存储在属性文件中。
  • 编写一个自定义taglib(如上所述),该版本使用上述解决方案中给出的版本no呈现

此解决方案的优点是您不需要重写网址,但仍需要自定义标记库。