5

Trong chế độ phát triển Rails 3.1 (khi sử dụng đường ống nội dung), hình ảnh được phân phối ra khỏi nội dung/hình ảnh được phân phát với tiêu đề phản hồi "Kiểm soát bộ nhớ cache: phải xác thực lại".Bật bộ nhớ đệm hình ảnh ở chế độ phát triển trong Rails 3.1

Điều này có nghĩa là Google Chrome (và dường như chỉ Chrome) sẽ cố gắng tìm nạp lại hình ảnh nhiều lần — ngay cả trong một lần xem trang. Điều này đã dẫn đến các vấn đề khó khăn với tất cả các cách xử lý DOM thông qua JavaScript. Đến tên một vài ví dụ:

  • jQuery UI Draggable đôi khi có kịch tính bù đắp từ con trỏ chuột
  • Thêm hoặc loại bỏ một lớp CSS tham chiếu đến một hình ảnh sẽ nhấp nháy hoặc thay đổi kích thước trong khi yêu cầu hình ảnh (mà sẽ luôn luôn trả về một 304 chưa sửa đổi) đang được tiến hành.
  • Việc đính kèm hoặc thay thế các nút HTML chứa hình ảnh sẽ kích hoạt nhiều lần tìm nạp hình ảnh hơn sẽ khiến toàn bộ các nút bên dưới chúng nhấp nháy khi Chrome chờ phản hồi 304 cho mỗi hình ảnh.

Tôi hoàn toàn có thể hiểu rằng đó là điều hợp lý để máy chủ phát triển thực hiện. Tôi thậm chí có thể hiểu rằng Chrome từ chối cache hình ảnh, ngay cả bên trong một lượt xem trang, là hoàn toàn hợp lý.

Vì vậy, có cách nào để thay đổi tiêu đề Kiểm soát bộ nhớ cache mà Rails áp dụng cho phản hồi hình ảnh trong quá trình phát triển không?

Cập nhật: như được đề xuất bởi một vài người, một câu hỏi thú vị hơn nữa là tại sao Chrome tìm nạp lại hình ảnh nhiều lần trong lần truy cập trang khi không có trình duyệt nào khác? (Và tại sao điều này không gây ra sự cố cho các nhà phát triển khác?)

Cập nhật x2: Tôi sẽ không gửi câu trả lời vì đây chỉ là giải pháp thay thế đủ cho mục đích của tôi, nhưng chúng tôi có thể giải quyết vấn đề này bằng cách biên dịch trước các tài sản và sau đó loại bỏ CSS & JS chưa hoàn chỉnh. (. Điều này đòi hỏi sprockets gỡ lỗi để được quay sang false trong development.rb)

rake assets:precompile 
cd public/assets 
find . -name "*.js*" -exec rm -rf {} \; 
find . -name "*.css*" -exec rm -rf {} \; 
+0

Tôi không thể nghĩ ra một cấu hình Rails cho điều này, có thể làm một số đào xung quanh cấu hình Sprockets thay thế? –

Trả lời

1

http://code.google.com/p/chromium/issues/detail?id=102706

Điều này có vẻ là vấn đề được ghi nhận bằng chrome. Tôi đang gặp vấn đề tương tự: Thêm hoặc xóa lớp CSS tham chiếu hình ảnh sẽ nhấp nháy hoặc thay đổi kích thước trong khi yêu cầu hình ảnh (sẽ luôn trả lại 304 chưa được sửa đổi) đang được tiến hành.

4

Cách duy nhất tôi đã nhìn thấy để thao tác tiêu đề Cache-Control đối với tài sản là tài sản bằng cách cấu hình tĩnh với:

config.serve_static_assets = true 

config.static_cache_control = "public, max-age=3600" 
+1

Cảm ơn @MitchKett, nhưng tiếc là điều đó dường như không làm cho tôi khi tài sản phải được xử lý bởi sprockets (có nghĩa là ở trên có thể sẽ hoạt động nếu chúng là tệp trong tài khoản/công khai, nhưng dường như sẽ không ứng dụng/tài sản/hình ảnh) –

+0

Eh, tôi đã cho nó một shot :). Chúc may mắn tìm một giải pháp! –

1

Sprockets hoặc là sẽ gửi tiêu đề bộ nhớ đệm hoặc lực lượng revalidation (xem the source).

Tôi không thể thấy các tùy chọn có sẵn công khai để thay đổi hành vi này.

Để sửa đổi điều này, tôi nghĩ bạn sẽ phải vá khỉ Sprockets.

Có thể quan tâm lớn hơn là tại sao Chrome hoạt động theo cách đó?

+0

Vâng, trên thực tế, tôi chỉ thử nghiệm trong việc lấy cắp nguồn sprockets và nó hoạt động * tuyệt vời *. Ý chính của chỉnh sửa: https://gist.github.com/1636038 –

+0

Một vấn đề cần xem. Sau khi lưu vào bộ nhớ cache, bạn sẽ phải thực hiện tải lại cưỡng bức để cập nhật bất kỳ hình ảnh nào thay đổi. Bạn có thể muốn làm điều này ngắn hơn cho dev, và kích hoạt nó chỉ cho hình ảnh. –

+0

vâng, tất nhiên, đây không phải là một sửa chữa, chỉ cần xác minh rằng việc thay đổi tiêu đề giải quyết vấn đề. –

Các vấn đề liên quan