最近、RequireJS の構成urlArgs
オプションを使用して、この問題を解決しました。タイムスタンプを含むようにファイルの名前を実際に変更することは実現可能ではないかと思います。ビルドと RequireJS の構成が非常に複雑になり、開発または運用のいずれかでハックが必要になる可能性が高くなります。したがって、論理的な順序で:
pom.xml で:
<properties>
(...)
<build.version>${maven.build.timestamp}</build.version>
</properties>
メインの 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>
urlArgs を機能させるには、require.js インポートの前require
にオブジェクトを定義することが重要です。
pom.xml、再び:
<resources>
(...)
<resource>
<targetPath>${project.build.directory}/filteredWebapp</targetPath>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
</resource>
</resources>
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 から直接読み取っていました。それは正常に機能しましたが、maven フィルタリングをバイパスしていました (つまり、r.js によってコンパイルされた出力にはまだ${build.timestamp}
プレースホルダーが含まれていました)
注: このメカニズムを使用するように開発バージョンを構成するのはおそらく難しいでしょう (可能であれば、試したことはありません)。私にとっては、「v=${build.timestamp}」パラメーターの存在とキャッシュ無効化の欠如は、実際には問題ではありませんでした。
途中で他にも多くの障害や落とし穴がありましたが、具体的にフィンガープリントを求めているだけなので、それらを解決できたと思います。それが役立つことを願っています!