2012-04-05 40 views
5

Có ai biết giá trị thông báo tài sản chính xác được tính như thế nào không? Nếu tôi có hai tệp JS chứa nhiều tập lệnh JS khác nhau thì mỗi tệp sẽ duy trì cùng một băm thông báo nếu không có tập lệnh bên trong nào bị thay đổi? Hoặc là một giá trị tiêu hóa mới được tính toán mỗi khi các tài sản: hoạt động biên dịch trước được chạy?Giá trị đường dẫn nội dung đường ray và giá trị tiêu hóa

Trả lời

1

thu thập từ rails guides

Khi một tên tập tin là duy nhất và dựa trên nội dung của nó, tiêu đề HTTP có thể được thiết lập để khuyến khích lưu trữ ở khắp mọi nơi (dù ở CDN, tại ISP, trong thiết bị mạng, hoặc trong web trình duyệt) để giữ bản sao của riêng họ về nội dung. Khi nội dung được cập nhật, dấu vân tay sẽ thay đổi. Điều này sẽ khiến khách hàng ở xa yêu cầu bản sao mới của nội dung . Điều này thường được gọi là bộ nhớ cache busting.

Kỹ thuật mà Rails sử dụng để lấy dấu vân tay là chèn một hàm băm của nội dung vào tên, thường là ở cuối. Ví dụ một CSS tập tin global.css có thể được đổi tên với một MD5 tiêu hóa nội dung của nó

+0

Vì vậy, thao tác md5_file() đơn giản được thực hiện trên tệp cuối cùng sau khi tất cả quá trình hợp nhất và nén được thực hiện? Giá trị md5 đó kết thúc là thông báo cho tệp đúng không? – matsko

+0

Theo tài liệu, vâng. Bạn có thể tham khảo [hướng dẫn khác] (http://guides.rubyonrails.org/asset_pipeline.html#in-production) để biết thêm chi tiết. – Tomato

41

Câu trả lời được chấp nhận là không hoàn toàn đúng. Chúng tôi xây dựng tài sản tĩnh cho các máy chủ dàn dựng, demo và sản xuất của chúng tôi và cùng một nội dung được cung cấp các giá trị thông báo khác nhau trong từng trường hợp.

Hóa ra môi trường Rails cũng đang được xem xét. Sprockets tạo ra tiêu hóa như sau:

# Sprockets::Environment::initialize 
@digest_class = ::Digest::MD5 

# Sprockets::Base::digest 
@digest ||= digest_class.new.update(VERSION).update(version.to_s) 

# Sprockets::Base::file_digest(path) 
digest.file(path.to_s) 

# Sprockets::Asset::initialize 
@digest = environment.file_digest(pathname).hexdigest 

Rails móc vào sprockets như sau:

# Sprockets::Railtie 
app.assets = Sprockets::Environment.new(app.root.to_s) do |env| 
    env.version = ::Rails.env + "-#{config.assets.version}" 
    ... 
end 

Vì vậy, đường ray đang tạo ra một môi trường sprockets rằng có một phiên bản tương ứng với môi trường Rails, và sprockets sử dụng phiên bản khi tạo lớp thông báo.

+0

Đây là câu trả lời đúng. – Litmus

+1

Cảm ơn vì điều này. Tôi đã phải thay đổi thông báo trên tài sản của mình để vô hiệu hóa bộ nhớ cache Cloudflare mà không thay đổi nội dung tệp nội dung. Thay đổi config.assets.version từ "1.0" thành "1.1" thay đổi chữ ký;) – luigi7up

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