2013-02-01 34 views
5

我有一个使用一个JSP和RequireJS就可以提供单页Javascript的重应用一个简单的Maven的web应用。我一直在寻找可以在构建过程中使用指纹资源的东西(.js,.css等),但一直没有找到任何解决此问题的方法。在Maven/JSP/RequireJS Webapp中指纹资产?

我想资产的文件名更改只要内容发生变化,所以我可以告诉浏览器缓存他们很长一段时间,但仍然下载最新每当更改。我还需要对这些资产的任何引用在更改时进行更新。无论我使用什么,都必须与RequireJS一起使用。

有什么建议吗?

回答

2

我用RequireJS的urlArgs配置选项最近解决了这个问题。我怀疑实际上重命名文件以包含时间戳是可行的,这会使构建和RequireJS配置复杂化很多,并且很可能需要用于开发或生产的黑客。因此,在逻辑顺序:

  1. 在pom.xml中:

    <properties> 
        (...) 
        <build.version>${maven.build.timestamp}</build.version> 
    </properties> 
    
  2. 在主JSP文件

    <script type="text/javascript"> 
        var require = { 
         (...) 
         urlArgs: 'v=${build.version}', 
        }; 
    </script> 
    
    <link rel="stylesheet" type="text/css" href="style.css?v=${build.version}"></link>  
    <script data-main="app" src="libs/require.js?v=${build.version}"></script> 
    

    重要的是要之前定义require对象在require.js进口,使urlArgs工作

  3. 的pom.xml,再次:

    <resources> 
        (...) 
        <resource> 
        <targetPath>${project.build.directory}/filteredWebapp</targetPath> 
        <directory>src/main/webapp</directory> 
        <filtering>true</filtering> 
        </resource> 
    </resources> 
    
  4. r.js的buildconfig(顺便说一句。我使用requirejs-maven-plugin弥合Maven和r.js):

    ({ 
        appDir: '${project.build.directory}/filteredWebapp', 
        dir: '${project.build.directory}/${project.build.finalName}', 
        (...) 
    }) 
    

    我不得不存储过滤的src/main/webapp的结果在一个新的文件夹(即filteredWebapp),以确保r.js'输入。将已经包含构建时间戳而不是占位符。我初始版本的r.js buildconfig是直接从src/main/webapp读取源文件;该工作确定,但被绕过行家过滤(即通过r.js编译后的输出仍含有${build.timestamp}占位符。)

注:它可能是棘手的配置开发版本使用这种机制(如果可能的话,我没有尝试过)。尽管如此,对于我来说,“v = $ {build.timestamp}”参数的存在以及缺少缓存清除在实践中并不是问题。

有沿途许多其他的障碍和陷阱,但我假设你设法解决这些,因为你只明确要求指纹。希望有所帮助!

+0

谢谢。这比我所希望的要多一点,但我会试一试。 – erturne

1

我真的强烈反对使用查询参数为“高速杀手”,因为这可能会导致什么叫做缓存中毒。例如:可以说你有一个cdn或一个前端缓存服务器和多个应用程序服务器。您上传文件的新版本并更改查询参数。然而新文件仍然没有。交付给所有应用服务器。缓存服务器然后转到其中一个服务器(因为它发现查询参数已更改),但仍然包含旧版本,获取并缓存它。所以,现在缓存服务器和OLD文件都带有一个新的缓存杀手,它认为它是最新的,并且不再试图从服务器获取它。