6

Compojure Web サーバーからページをフェッチするクライアントのパフォーマンスを改善しようとしています。を使用して一連の静的ファイル (JS、CSS) を(compojure.route/resources "/")提供します。これは、ファイル システム上のファイルを検索し、それらを URL に変換してから、Ring にストリームとして提供します。ストリームに変換することで、mod 時間などのすべてのファイル メタデータが失われるようです。

static-resource ハンドラーをラップしてExpiresorCache-Control: max-ageヘッダーを追加することはできますが、それではクライアントがリクエストをまったく送信できなくなります。便利ですが、これらのファイルはときどき変更されます (リリースを出すとき)。

理想的には、クライアントがキャッシュされた独自のバージョンをたとえば 1 時間信頼し、If-Modified-Sinceその時間が経過した後にヘッダーを使用してリクエストを行うようにしたいと考えています。その後、戻るだけ304 Not Modifiedで、クライアントは数百キロの JavaScript のダウンロードを回避できます。

応答を提供するときにヘッダーを設定できるように見えます。Last-Modifiedこれにより、クライアントは後続の要求をIf-Modified-Sinceヘッダーで修飾します。compojure.route/resources追加するためにほとんどのコードを書き直さなければならないことを除けば、素晴らしいことですLast-Modified- 難しいことではありませんが、退屈です - そして、If-Modified-Sinceヘッダーを認識して応答するためのコードをさらに発明します。記念碑的な仕事ではありませんが、単純なものでもありません。

これはすでにどこかに存在しますか?私はそれを見つけることができませんでしたが、それは十分に一般的で、十分に大きなタスクであるように思えます。

4

2 に答える 2

5

FWIW、Ringのwrap-file-infoミドルウェアを使用してこれを機能させました。RingではなくCompojureでこれを探したのはちょっと恥ずかしいです。ただし、とcompojure.routeハンドラーはどちらもファイルやURLではなくストリームを提供します。もちろん、Ringはそこからメタデータを把握することはできません。filesresources

基本的に、代わりにresourcesそのコピーを作成する必要がありました。Fileそれで包まれたときwrap-file-info、私のニーズを満たしました。それでも、Compojureからコードのチャンクをコピーすることを含まない少し良い解決策を気にしないでしょう。

于 2011-05-25T17:29:50.210 に答える
1

ring-etag-middleware の使用を検討しましたか? ファイルの最終更新日を使用してエンティティ タグを生成します。次に、リクエスト内の if-none-match ヘッダーとの一致で 304 をキー入力します。

于 2011-05-25T06:31:14.077 に答える