Caching 在Maven/JSP/RequireJS Webapp中提取资产指纹?

Caching 在Maven/JSP/RequireJS Webapp中提取资产指纹?,caching,maven,requirejs,assets,fingerprinting,Caching,Maven,Requirejs,Assets,Fingerprinting,我有一个简单的Maven Web应用程序,它使用一个JSP和RequireJS来提供一个页面繁重的Javascript应用程序。我一直在寻找一些可以在构建过程(.js、.css等)中对资产进行指纹识别的东西,但没有找到任何解决这个问题的方法 我希望在内容更改时更改资产文件名,这样我就可以告诉浏览器将它们缓存很长一段时间,但仍然可以在内容更改时下载最新的。我还需要在这些资产发生变化时更新它们的任何引用。无论我使用什么,都必须与RequireJS一起使用 有什么建议吗?我最近通过使用RequireJ

我有一个简单的Maven Web应用程序,它使用一个JSP和RequireJS来提供一个页面繁重的Javascript应用程序。我一直在寻找一些可以在构建过程(.js、.css等)中对资产进行指纹识别的东西,但没有找到任何解决这个问题的方法

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


有什么建议吗?

我最近通过使用RequireJS的
urlArgs
config选项解决了这个问题。我怀疑重命名文件以包含时间戳是否可行,这将使构建和RequireJS配置变得非常复杂,并且很可能需要对开发或生产进行黑客攻击。因此,按逻辑顺序:

  • 在pom.xml中:

    <properties>
        (...)
        <build.version>${maven.build.timestamp}</build.version>
    </properties>
    
  • r、 js的buildconfig(顺便说一句,我用它连接Maven和r.js):

    我必须将过滤src/main/webapp的结果存储在一个新文件夹(即,
    filteredWebapp
    )中,以确保r.js的输入已经包含构建时间戳,而不是占位符。我最初版本的r.jsbuildconfig直接从src/main/webapp读取源文件;这工作正常,但绕过了maven过滤(即,由r.js编译的输出仍然包含
    ${build.timestamp}
    占位符)

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


    在这个过程中还有很多其他的障碍和陷阱,但我想你已经解决了,因为你只是特别要求指纹识别。希望有帮助

    实际上,我强烈反对使用查询参数作为“缓存杀手”,因为这可能会导致所谓的缓存中毒。例如:假设您有一个cdn或前端缓存服务器和多个应用服务器。上载文件的新版本并更改查询参数。然而,新文件仍然不存在。发送到所有应用程序服务器。缓存服务器然后转到仍然包含旧版本的其中一个服务器(因为它看到查询参数已更改),获取它并缓存它。因此,现在缓存服务器有一个新的缓存杀手认为它是最新的和旧的文件,不再试图从服务器获取它

    谢谢。这比我希望的要困难一些,但我会试试看。
    <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>
    
    <resources>
      (...)
      <resource>
        <targetPath>${project.build.directory}/filteredWebapp</targetPath>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
    
    ({
        appDir: '${project.build.directory}/filteredWebapp',
        dir: '${project.build.directory}/${project.build.finalName}',
        (...)
    })