Maven/JSP/RequireJS Webapp中的指纹资产?

ert*_*rne 5 caching assets fingerprinting maven requirejs

我有一个简单的Maven webapp,它使用单个JSP和RequireJS来提供单页Javascript密集的应用程序.我一直在寻找可以用来在构建过程中指纹资产(.js,.css等)的东西,但是还没有找到解决这个问题的东西.

我想在内容发生变化时更改资产文件名,这样我就可以告诉浏览器将它们缓存很长时间,但是每当它们发生变化时仍然会下载最新的.我还需要对这些资产进行任何引用,以便在它们发生变化时进行更新.无论我使用什么,都必须使用RequireJS.

有什么建议?

kry*_*ger 2

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

  1. 在 pom.xml 中:

    <properties>
        (...)
        <build.version>${maven.build.timestamp}</build.version>
    </properties>
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)

    在require.js 导入之前定义require对象以使 urlArgs 工作非常重要

  3. pom.xml,再次:

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

    ({
        appDir: '${project.build.directory}/filteredWebapp',
        dir: '${project.build.directory}/${project.build.finalName}',
        (...)
    })
    
    Run Code Online (Sandbox Code Playgroud)

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

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

一路上还有许多其他障碍和陷阱,但我假设您已经解决了这些问题,因为您只是专门要求指纹识别。希望有帮助!