2013-01-16 48 views
6

Tôi có một ứng dụng chạy trên máy chủ. Khi tôi thực hiện thay đổi đối với tệp js người dùng của tôi không thấy thay đổi cho đến khi họ xóa bộ nhớ cache của họ. Đây có phải là tùy chọn duy nhất để đẩy các thay đổi vào ứng dụng của tôi không? Về cơ bản, tôi phải thực hiện thay đổi, cập nhật các tệp và sau đó yêu cầu tất cả người dùng xóa bộ nhớ cache của họ?cách xóa bộ nhớ cache của khách hàng của tôi lần sau khi họ đăng nhập

Trả lời

10

Bạn cần sử dụng phiên bản trên tệp của mình bao gồm. Bất cứ khi nào bạn thay đổi URI của tệp của bạn bao gồm, trình duyệt sẽ không tìm thấy một kết hợp bộ nhớ cache và sẽ tải xuống lại bao gồm.

Ví dụ:

<script type="text/javascript" src="include/232/init.js"></script> 

đâu 232 là số phiên bản sửa đổi của bạn mà nên được thay đổi bất cứ khi nào bạn phát hành mã mới.

Ngoài ra, bạn có thể sử dụng các chuỗi truy vấn:

<script type="text/javascript" src="include/init.js?232"></script> 

Điểm có ích là bạn nên thay đổi các tập tin bao gồm URI trong một số cách bất cứ khi nào bạn muốn truy cập của bạn để tái tải file.

Nếu bạn sử dụng PHP hoặc một ngôn ngữ server-side, bạn có thể thiết lập phiên bản này xảy ra tự động bất cứ khi nào tập tin của bạn bao gồm được sửa đổi: http://derek.io/blog/2009/auto-versioning-javascript-and-css-files/

3

Bạn có thể thêm các chuỗi truy vấn giả đến URL tài sản:

<link href="http://mysite.com/main.css?v=1" rel="stylesheet" /> 

Sau đó, bất cứ khi nào bạn thực hiện bất kỳ thay đổi CSS của bạn, chỉ cần bump lên số phiên bản.

Kỹ thuật này được gọi là bộ nhớ cache busting. Search Google for that và bạn sẽ nhận được nhiều biến thể khác nhau.

2

Một mẹo nhỏ để làm được việc này là để nối thêm một chuỗi truy vấn với một số loại của phiên bản hoặc dấu thời gian cho các cuộc gọi Javascript link của bạn. Ví dụ:

<script src="myexternal.js?20130116" type="text/javascript"></script> 

Ví dụ này đơn giản, nhưng chứng minh quan điểm. Về cơ bản, điều này sẽ cho trình duyệt tải tệp nếu nó không nhận ra đường dẫn đầy đủ. Bất cứ khi nào bạn thay đổi tệp javascript của bạn và muốn người dùng của bạn đón phiên bản mới nhất, chỉ cần cập nhật dấu thời gian hoặc giá trị đó sau dấu chấm hỏi (chuỗi truy vấn).

2

Bạn không thể xóa bộ nhớ cache của trình duyệt của khách hàng của bạn, nhưng bạn có thể sử dụng kỹ thuật bộ nhớ cache busting chẳng hạn như thêm phiên bản cho tập tin của bạn

<link rel="stylesheet" href="/css/example.css?v1.0" type="text/css" /> 

Và sau đó khi bạn thực hiện một sự thay đổi

<link rel="stylesheet" href="/css/example.css?v1.1" type="text/css" /> 

Nó có thể là một dấu thời gian hay bất cứ điều gì, chỉ cần phải khác nhau.

1

Một mẹo đơn giản mà tôi sử dụng đôi khi là thêm một số thông số giả vào đường dẫn của tệp JavaScript/CSS. Trình duyệt về cơ bản sẽ thấy một URL khác và sẽ không sử dụng phiên bản được lưu trong bộ nhớ cache của nó.

$jsFile = '/js/myFile.js';    // probably cached 
$jsFile = '/js/myFile.js?r='.time();  // won't ever be cached 

Bạn có thể không thực sự rõ ràng cho khách hàng bộ nhớ cache, nhưng bạn có thể lừa trình duyệt khách hàng vào nghĩ rằng đây là lần đầu tiên nó được nhìn thấy tập tin này và nó sẽ tải về nó một lần nữa.

Đừng quên tắt tính năng này khi bạn đã đến phiên bản ổn định. Caching files là một cách tuyệt vời để tăng tốc thời gian tải của ứng dụng.

1

Bí quyết tôi sử dụng để tránh sự cố này là sửa đổi url của tập lệnh được cập nhật. Điều này sẽ buộc khách hàng tải xuống tập lệnh một lần nữa vì tên ressource khác.

Cách dễ nhất để thực hiện: sử dụng số phiên bản ở cuối url js/my-script.js?v=1.0.

Cách tốt hơn để làm điều đó (100% được hỗ trợ cho tất cả các trình điều hướng): thay đổi tên tệp chính nó js/my-script.v1.0.js.

+0

Tại sao người đầu tiên không được hỗ trợ 100%? – Ian

+0

Dường như thêm chuỗi truy vấn vào tài nguyên tĩnh [ngăn chặn bộ nhớ đệm trên một số proxy] (http://www.mikebrittain.com/blog/2009/06/11/caching-urls-with-query-strings/). Chúng tôi muốn có thể xóa phiên bản tệp được lưu trong bộ nhớ cache tại một số thời điểm, không ngăn chặn hoàn toàn cơ chế lưu vào bộ nhớ cache. Tuy nhiên, nếu bạn không phải là một guru hiệu suất, giải pháp đầu tiên là tuyệt vời. Đó là cái được sử dụng cho các chủ đề Wordpress. –

+0

Hmm rất thú vị, cảm ơn bạn đã cung cấp liên kết. Mặc dù tôi không nghĩ rằng Squid được sử dụng trong các trình duyệt (chỉ là proxy, như bạn đã chỉ ra). Vì vậy, trong khi nó sẽ được tốt đẹp để có thể "lừa" bộ nhớ đệm ở mọi nơi, vào thời điểm chính xác bạn muốn, điều quan trọng là để lừa trình duyệt ... do đó, bằng cách sử dụng chuỗi truy vấn không phải là một vấn đề. Mặc dù nhúng "phiên bản" vào tên tệp và sử dụng quy tắc viết lại khá thông minh ... Tôi sẽ xem xét điều đó cho một số nội dung của riêng tôi. – Ian

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