ert*_*rne 5 caching assets fingerprinting maven requirejs
我有一个简单的Maven webapp,它使用单个JSP和RequireJS来提供单页Javascript密集的应用程序.我一直在寻找可以用来在构建过程中指纹资产(.js,.css等)的东西,但是还没有找到解决这个问题的东西.
我想在内容发生变化时更改资产文件名,这样我就可以告诉浏览器将它们缓存很长时间,但是每当它们发生变化时仍然会下载最新的.我还需要对这些资产进行任何引用,以便在它们发生变化时进行更新.无论我使用什么,都必须使用RequireJS.
有什么建议?
我最近通过使用 RequireJS 的urlArgs
配置选项解决了这个问题。我怀疑实际上重命名文件以包含时间戳是否可行,这会使构建和 RequireJS 配置变得更加复杂,并且很可能需要对开发或生产进行修改。因此,按照逻辑顺序:
在 pom.xml 中:
<properties>
(...)
<build.version>${maven.build.timestamp}</build.version>
</properties>
Run Code Online (Sandbox Code Playgroud)在主 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 工作非常重要
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)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}”参数的存在和缺乏缓存清除在实践中并不是问题。
一路上还有许多其他障碍和陷阱,但我假设您已经解决了这些问题,因为您只是专门要求指纹识别。希望有帮助!
归档时间: |
|
查看次数: |
1530 次 |
最近记录: |