33

Tôi đang bắt đầu một dự án mới trong Rails và có vẻ như tệp manifest ứng dụng đang làm điều gì đó vui nhộn với javascripts mà tôi tham chiếu - có lưu vào bộ nhớ cache như một phần của đường ống tài sản?Xóa bộ nhớ cache khỏi đường ống nội dung Rails

Đây là những gì đã xảy ra. Tôi đã thêm một tập tin javascript tên jquery.autoresize.js vào thư mục vendor/tài sản/javascripts, và sau đó tham chiếu các tập tin trong application.js manifest như thế này:

//= require jquery.autoresize.js 

Sau đó, tôi bắt đầu lên máy chủ ray. Nhưng sau khi điều hướng xung quanh trong ứng dụng của mình, tôi nhận ra rằng tôi đã vô tình thêm phiên bản sai của tệp jquery.autoresize.js. Vì vậy, tôi đã xóa tệp đó và sau đó thêm phiên bản chính xác vào thư mục vendor/assets/javascripts. Nhưng, để kinh dị của tôi, khi tôi tải lại trang, nó vẫn đang tải tập tin javascript cũ.

Tôi đã thử xóa bộ nhớ cache của trình duyệt, sau đó thoát và khởi động lại máy chủ Rails nhưng không có kết quả. Tôi đã tấn công một giải pháp với nhau bằng cách đổi tên tệp javascript của tôi và tham chiếu tên mới, điều này hoạt động tốt. Nhưng phải có một giải pháp tốt hơn cho việc này.

Đường dẫn nội dung mới có lưu vào bộ nhớ cache các tệp mà bạn tham chiếu không? Nếu vậy, làm cách nào để xóa bộ nhớ cache đó? Cảm ơn vì bất kì sự giúp đỡ!

Trả lời

48

Tôi giả sử chúng ta đang nói về môi trường sản xuất.

Khi bạn thay đổi bất kỳ javascripts hoặc bảng định kiểu nào trong môi trường sản xuất, bạn cần chạy rake assets:precompile; tác vụ này biên dịch và nén các tệp .js và .css khác nhau và tạo tệp application.js và application.css được tải bởi chế độ xem của bạn.

Có thể nếu bạn thay thế jquery.autoresize.js bằng phiên bản cũ hơn dấu thời gian cũ hơn, bước biên dịch trước có thể bỏ qua, nghĩ phiên bản đã biên dịch được cập nhật. Bạn có thể tránh điều đó bằng cách chạy rake assets:clean trước tiên, buộc nó phải xây dựng lại mọi thứ trong thư mục public/assets từ đầu.

+0

Ahh, rất thú vị, cảm ơn những suy nghĩ của bạn. Tôi đã thực sự làm điều này trên môi trường phát triển địa phương của tôi, và tôi không bao giờ chạy tài sản cào: biên dịch trước. Vì vậy, có lẽ điều đó làm cho nó hoạt động khác nhau? Bạn có nghĩ rằng môi trường phát triển sẽ khiến nó hoạt động theo cách tôi mô tả ban đầu? –

+2

Trong môi trường phát triển, tên tệp băm không được sử dụng, vì vậy mọi thứ đều dựa trên ngày sửa đổi tệp. (Do xem nguồn trong trình duyệt để xem các liên kết kịch bản trong tiêu đề HTML.) Đoán của tôi là trong môi trường dev, tệp thay thế có ngày sửa đổi cũ hơn và do đó trình duyệt chỉ sử dụng phiên bản được lưu trong bộ nhớ cache của nó. Bản chỉnh sửa của bạn đã cập nhật thời gian chỉnh sửa của tệp và đó là lý do tại sao trình duyệt cuối cùng đã tìm nạp phiên bản mới. – benzado

+0

Tuyệt vời. Cảm ơn vì đã giúp tôi hình dung điều này. Tôi sẽ sửa đổi nội dung của câu hỏi và nội dung để giải thích tốt hơn và cung cấp cho bạn tín dụng để trợ giúp. –

23

Đường ray tự động xóa bộ nhớ cache cho một tệp riêng lẻ mỗi khi nội dung được chỉnh sửa. Để xóa bộ nhớ cache cho một tệp, chỉ cần mở tệp, chỉnh sửa một dòng mã và lưu lại. Đường ray sẽ xóa bộ nhớ cache cho tệp đó và trình duyệt sẽ tải tệp mới vào lần tiếp theo trang được tải.

Lý do jquery.autoresize.js đang sử dụng phiên bản được lưu trong bộ nhớ cache cũ của tệp là do phiên bản cũ đã bị xóa và sau đó phiên bản mới được sao chép và dán với cùng tên vào cùng một thư mục. Bởi vì bản thân tệp không bao giờ được chỉnh sửa, Rails tiếp tục sử dụng tệp cũ đã được lưu trong bộ nhớ cache.

Điều này là do đường dẫn nội dung sử dụng vân tay cho bộ nhớ cache.

In dấu vân tay là kỹ thuật giúp đặt tên tệp phụ thuộc vào nội dung của tệp. Khi nội dung tập tin thay đổi, tên tệp cũng được thay đổi. Đối với nội dung tĩnh hoặc không thường xuyên thay đổi, điều này cung cấp cách dễ dàng để biết liệu hai phiên bản của tệp có giống hệt hay không, ngay cả trên các máy chủ hoặc ngày triển khai khác nhau.

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 các trình duyệt web) để giữ bản sao riêng của họ 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ụ: tệp CSS toàn cầu.css có thể được đổi tên với một MD5 tiêu hóa nội dung của nó:

global-908e25f4bf641868d8683022a5b62f54.css 

Vì vậy, nếu bạn xóa một tập tin mà bạn đang tham khảo trong biểu hiện, và sau đó sao chép vào một tập tin mới có cùng tên, bộ nhớ cache phá sản không bao giờ xảy ra. Khi bạn chỉnh sửa các tập tin, các dấu vân tay đá, và một băm mới được tạo ra cho tên tập tin. Thao tác này sẽ chuyển bộ nhớ cache cho tệp đó.

Để xem toàn bộ câu chuyện, hãy xem What is Fingerprinting and Why Should I Care?.

+1

Tôi không nghĩ điều này là chính xác. Dấu vân tay dựa trên nội dung của tệp. Nếu bạn xóa một tệp và thay thế tệp đó bằng một tệp * khác * có cùng tên, bạn sẽ nhận được một dấu vân tay khác và một tên tệp khác. – benzado

+1

Cảm ơn bạn đã tham gia. Bạn đã thử điều này trong một trong các dự án của riêng mình gần đây chưa? Bởi vì tôi chắc chắn có thể xác nhận rằng khi tôi tạo ra câu hỏi này, cách duy nhất tôi có thể tải tệp mới được trình duyệt của tôi tải là chỉnh sửa một dòng mã và lưu lại nó. Nếu nó làm việc cho bạn bằng cách xóa tập tin và thay thế nó bằng một cái mới có cùng tên, tôi rất thích nghe về nó. –

+0

Tôi gặp vấn đề về đường ống nội dung khác nhau, đó là cách tôi gặp phải câu hỏi này. Bạn nói "nếu bạn xóa một tập tin bạn đang tham chiếu trong tệp kê khai, và sau đó sao chép trong một tệp mới có cùng tên, bộ đệm ẩn bộ nhớ cache không bao giờ xảy ra"; điều đó sẽ * chỉ * là đúng nếu tệp mới/cũ có * nội dung giống nhau *, trong trường hợp nào quan tâm đến phiên bản bạn có? Nếu bạn đang nói về chế độ sản xuất, bạn cần chạy 'rake asset: precompile' để đặt các tập tin trong thư mục' public/assets'; đó sẽ là giải pháp trừ khi bạn đã thay đổi cấu hình mặc định. – benzado

6

Tôi sử dụng config.assets.version = '1.01019' trong số application.rb để chặn toàn bộ bộ nhớ cache. Khi tôi muốn đẩy một phiên bản hoàn chỉnh mới, tôi tăng phiên bản và thực hiện điều đó. Điều này sẽ chăm sóc những trường hợp cạnh đó Rails không biên dịch lại thành tài sản vì bất kỳ lý do gì.

25

Đồng thời thử rake assets:clobber. Điều này sẽ hoàn toàn thiết lập lại tất cả mọi thứ và xóa tất cả các tài sản biên dịch. Ngoài ra, tôi thường cần thiết lập môi trường trước khi đẩy sản xuất bằng cách đi: RAILS_ENV=production rake assets:precompile.

+0

+1! Giải pháp này làm việc cho tôi. Tôi đang phát triển một bộ xử lý nội dung tùy chỉnh-đường ống và điều này làm cho Sprockets nhập vào bộ xử lý một lần nữa. Thx – MegaTux

6

rake tmp:clear đã thực hiện thủ thuật cho tôi, tôi đang sử dụng ít đường ray hơn.

+1

Tôi cũng phải thực hiện điều này để có được trình duyệt-đường ray cập nhật, nếu không nó sẽ tìm và sử dụng các tệp cũ đã bị xóa. 'đường ray tài sản: sạch' không làm việc cho việc này. – Ryan

+0

Lệnh này cũng sẽ xóa các tệp pid trong thư mục tmp. – caiguanhao

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