5

単一の JSP と RequireJS を使用して単一ページの Javascript を多用するアプリを提供する単純な Maven Web アプリケーションがあります。ビルド プロセス中にアセットをフィンガープリントするために使用できるもの (.js、.css など) を探していましたが、この問題を解決するものは見つかりませんでした。

コンテンツが変更されるたびにアセット ファイル名を変更して、ブラウザーに非常に長い間キャッシュするように指示できるようにしたいのですが、変更されるたびに最新のものをダウンロードします。また、アセットが変更されるたびに、それらのアセットへの参照を更新する必要があります。私が使用するものはすべて、RequireJS でも動作する必要があります。

助言がありますか?

4

2 に答える 2

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>
    

    urlArgs を機能させるには、require.js インポートのrequireにオブジェクトを定義することが重要です。

  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 から直接読み取っていました。それは正常に機能しましたが、maven フィルタリングをバイパスしていました (つまり、r.js によってコンパイルされた出力にはまだ${build.timestamp}プレースホルダーが含まれていました)

注: このメカニズムを使用するように開発バージョンを構成するのはおそらく難しいでしょう (可能であれば、試したことはありません)。私にとっては、「v=${build.timestamp}」パラメーターの存在とキャッシュ無効化の欠如は、実際には問題ではありませんでした。

途中で他にも多くの障害や落とし穴がありましたが、具体的にフィンガープリントを求めているだけなので、それらを解決できたと思います。それが役立つことを願っています!

于 2013-02-03T20:32:04.947 に答える
1

クエリ パラメータを「キャッシュ キラー」として使用すると、いわゆるキャッシュ ポイズニングが発生する可能性があるため、実際には強くお勧めしません。例: cdn またはフロント エンド キャッシュ サーバーと複数のアプリ サーバーがあるとします。ファイルの新しいバージョンをアップロードし、クエリ パラメータを変更します。ただし、新しいファイルはまだありませんでした。すべてのアプリ サーバーに配信されます。次に、キャッシュ サーバーは、(クエリ パラメータが変更されたことがわかるため) 古いバージョンをまだ含んでいるサーバーの 1 つに移動し、それを取得してキャッシュします。そのため、キャッシュサーバーには古いファイルがあり、新しいキャッシュキラーは最新であると考えており、サーバーから取得しようとしなくなりました。

于 2013-12-31T06:54:49.190 に答える