0

スプロケットを使用する場合、.coffee ファイルのディレクトリ全体がトランスパイルされ、マージされて「mobile_v2.js」になります。このファイルが提供されると、コンテンツの SHA1 ハッシュを使用して素晴らしい ETag が設定されます。これにより、キャッシュ無効化とその他すべての優れた機能が正しく機能します。つまり、ソース .coffee ファイルのいずれかを変更してページをリロードすると、Sprockets は「mobile_v2.js」を再生成してクライアントに送信します。何も変更しない場合、クライアントはそのリソースのキャッシュされたコピーを使用します。これはうまくいきます。

ここで、Web アプリの一部がBackbone.jsを使用し、ユーザーが完全な「更新」を行わずに 1 つのページに非常に長い時間を費やすことができるというシナリオがあります。つまり、非常に多くの AJAX 更新ですが、新しい「...」はありません。文字通り、クライアントはこのページに何週間も費やすことができます。したがって、JS/CSS リソースに更新をプッシュする場合、クライアントがこれを検出してページ全体のリロードをトリガーする方法が必要です。完全なリロードを行うと混乱が生じるため、必要以上に頻繁にリロードしたくありません。また、これらのリソースについてサーバーをポーリングしたくありません... 私はこれらすべての AJAX 呼び出しを持っているので、追加の応答ヘッダーを使用してそれらの呼び出しをピギーバックすることができます。私にできることはすべて。1 つの簡単な質問についてのサポートが必要です。

「mobile_v2.js」のような生成されたリソースが与えられた場合、Sprockets にクエリを実行してそのファイルの SHA1 ダイジェストを取得するにはどうすればよいですか? (私のルビーコードから)

4

2 に答える 2

1

正しく理解できたかどうかはわかりませんが、アセットをプリコンパイルしている場合、生成された manifest.yml からダイジェストを抽出するのが 1 つの方法です。

manifest = YAML.load(File.open(Rails.root.join("public", "assets", "manifest.yml")))
digest = manifest["mobile_v2.js"].gsub("mobile_v2-", "").gsub(".js", "")
于 2012-09-01T00:50:20.760 に答える
0

生成されたアセットのスプロケット ダイジェストを見つけるには:

Rails.application.assets.find_asset(asset_name).digest

本番環境ではスプロケット(*)がないため、git リビジョンを使用します (.git フォルダーでデプロイします)。または、DavidO の提案に従って manifest.yaml を読むこともできたと思います。

最終的に使用した完全なソリューションは次のとおりです。

def asset_digest(asset_name)
  if Rails.env == 'production'
    # Production
    Git.open(Rails.root).object('HEAD').sha
  else
    # Development / Test
    Rails.application.assets.find_asset(asset_name).digest
  end 
end

(*): 実際には、本番環境では sprockets 行が「機能」していましたが、プリコンパイルされたアセットを読み取る代わりに、すべてのアセットを再コンパイルすることで機能しました。

于 2012-09-02T20:06:07.707 に答える