Buộc trình duyệt làm mới css, javascript, v.v.


86

Tôi đang phát triển một trang web dựa trên mã nguồn Wordpress thông qua XAMPP. Đôi khi tôi thay đổi mã CSS, tập lệnh hoặc thứ gì đó khác và tôi nhận thấy trình duyệt của mình cần thời gian để áp dụng các sửa đổi. Điều này dẫn đến việc tôi phải sử dụng nhiều trình duyệt để làm mới một trình duyệt và nếu không áp dụng các kiểu mới, tôi sẽ thử trình duyệt thứ hai và nó luôn như vậy.

Có một số cách để tránh vấn đề này? Đôi khi tôi đang thay đổi mã mà không nhận thấy các sửa đổi trước đó.


3
Bộ nhớ cache của trình duyệt. Bất cứ khi nào bạn thực hiện thay đổi đối với CSS, JavaScript và đang xem trang bạn đã cập nhật - bạn sẽ thấy mối quan tâm này. Bạn có thể buộc làm mới bằng cách nhấn CTRL + F5 trên trình duyệt và điều đó sẽ nhận được phiên bản mới nhất. Tôi thấy Chrome đôi khi yêu cầu trình tự đó vài lần ...
anAgent

bạn cũng có thể xóa bộ nhớ cache của trình duyệt programatically
Pawan


Câu trả lời ở đây: Câu trả lời của Fermin .
JWC ngày

Câu trả lời:


108

Giải pháp chung

Nhấn Ctrl+ F5(hoặc Ctrl+ Shift+ R) để buộc tải lại bộ nhớ cache. Tôi tin rằng máy Mac sử dụng Cmd+ Shift+ R.

PHP

Trong PHP, bạn có thể tắt bộ nhớ cache bằng cách đặt ngày hết hạn thành một thời điểm trong quá khứ với tiêu đề:

header("Expires: Tue, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

Trình duyệt Chrome

Bạn có thể tắt bộ nhớ cache của Chrome bằng cách mở công cụ dành cho nhà phát triển F12, nhấp vào biểu tượng bánh răng ở góc dưới bên phải và chọn Tắt bộ nhớ cache trong hộp thoại cài đặt, như sau:

nhập mô tả hình ảnh ở đây
Hình ảnh lấy từ câu trả lời này .

Firefox

about:configvào thanh URL sau đó tìm mục tiêu đề network.http.use-cache. Đặt cái này thành false.


Cảm ơn JamWaffles về mô tả chi tiết và cảm ơn tất cả các câu trả lời của bạn. Cảm ơn rât nhiều.
user1511579

Trong các phiên bản Chrome gần đây: CTRL + R.
Alix Axel

1
Đối với Chrome, giao diện bạn đã chia sẻ đã thay đổi một chút. Chỉ cần nhấn tab Mạng và bạn sẽ tìm thấy hộp kiểm ở đó.
Baz Guvenkaya

5
FYI: cho Opera trên Mac nó cmd-alt-R
Derwent

52

Nếu bạn muốn tránh điều đó ở phía máy khách, bạn có thể thêm một cái gì đó như ?v=1.xliên kết tệp css khi nội dung tệp bị thay đổi. Ví dụ: nếu có, <link rel="stylesheet" type="text/css" href="css-file-name.css">bạn có thể thay đổi nó thành <link rel="stylesheet" type="text/css" href="css-file-name.css?v=1.1">điều này sẽ bỏ qua bộ nhớ đệm.


1
Điểm tốt, nhưng sau đó trình duyệt luôn hỏi về tệp. Tất nhiên máy chủ sẽ trả về "304 Not Modified".
Andrzej Jozwik

@ajozwik Tôi đã thử nghiệm với Firefox 26.0 và Chromium 31.0.1650.57. Như bạn đã nói, Firefox thực sự luôn tạo một truy vấn mới nếu URL CSS chứa một dấu chấm hỏi (và máy chủ đưa ra phản hồi 304 với nội dung trống); Firefox không tạo truy vấn mới nếu URL CSS không chứa dấu chấm hỏi. Chromium không thực hiện một truy vấn mới ngay cả với dấu chấm hỏi. Có lẽ đây có thể coi là một lỗi của Firefox.
Jaan

không làm việc bạn bè của tôi theo cách này. Chỉ khi tên tệp khác nhau. Tại sao rất nhiều ủng hộ?
Gediminas

Tôi đã tìm thấy ở nhiều nơi khác cách tiếp cận tương tự được đưa ra trong câu trả lời này, tôi tin rằng cách này đã hiệu quả trong quá khứ nhưng không còn hiệu quả nữa. Nếu bạn đang ở chế độ phát triển, cách tiếp cận phổ biến và tốt nhất là tắt bộ nhớ đệm trong trình duyệt thông qua thẻ meta HTML. Xem câu trả lời của tôi bên dưới.
ePi272314

9

Nếu bạn có thể viết php, bạn có thể viết:

<script src="foo.js<?php echo '?'.mt_rand(); ?>" ></script>
<link rel="stylesheet" type="text/css" href="foo.css<?php echo '?'.mt_rand(); ?>" />
<img src="foo.png<?php echo '?'.mt_rand(); ?>" />

Nó sẽ luôn làm mới!

CHỈNH SỬA: Tất nhiên, nó không thực sự thiết thực cho toàn bộ trang web, vì bạn sẽ không thêm nó theo cách thủ công cho mọi thứ.


Nó không hoạt động theo cách này! Chỉ khi tên tệp là trình duyệt khác nhau tải lại. Hoặc có thể với gợi ý này chỉ cho một số trình duyệt hoạt động, nếu nó hoạt động với bạn
Gediminas


5

Quan điểm của nhà phát triển
Nếu bạn đang ở chế độ phát triển (như trong câu hỏi ban đầu), cách tốt nhất là tắt bộ nhớ đệm trong trình duyệt thông qua thẻ meta HTML. Để làm cho cách tiếp cận này trở nên phổ biến, bạn phải chèn ít nhất ba thẻ meta như hình dưới đây.

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

Theo cách này, bạn với tư cách là nhà phát triển, chỉ cần làm mới trang để xem các thay đổi. Nhưng đừng quên nhận xét rằng mã khi đang được sản xuất, sau tất cả, bộ nhớ đệm là một điều tốt cho khách hàng của bạn.

Chế độ Sản xuất
Vì trong quá trình sản xuất, bạn sẽ cho phép lưu vào bộ nhớ đệm và khách hàng của bạn không cần biết cách buộc tải lại toàn bộ hoặc bất kỳ thủ thuật nào khác, bạn phải bảo đảm trình duyệt sẽ tải tệp mới. Và vâng, trong trường hợp này, cách tốt nhất mà tôi biết là thay đổi tên của tệp.


2
<script src="foo.js?<?php echo date('YmdHis',filemtime('foo.js'));?>"></script>

Nó sẽ làm mới nếu sửa đổi.


Giải pháp rất hay cho tất cả những dự án không sử dụng webpack hoặc công cụ đóng gói tự động thêm phiên bản cho tài nguyên.
Richi González

Tôi không downvote nó, nhưng giải pháp này không làm việc tốt trong chrome mới nhất của ngày hôm nay, nó vẫn fetches các phiên bản trước của tập tin JavaScript
Mikaël Mayer

1

Đảm bảo rằng điều này không xảy ra từ DNS của bạn. Ví dụ: Cloudflare có nó, nơi bạn có thể bật chế độ phát triển, nơi nó buộc thanh lọc các bảng định kiểu và hình ảnh của bạn vì Cloudflare cung cấp bộ nhớ đệm tăng tốc. Điều này sẽ vô hiệu hóa nó và buộc nó phải cập nhật mỗi khi ai đó truy cập trang web của bạn.



0

Bạn có thể tắt bộ nhớ đệm bằng thanh công cụ dành cho nhà phát triển web của Firefox.



0

Câu trả lời được chấp nhận ở trên là đúng. Tuy nhiên, nếu bạn chỉ muốn tải lại bộ nhớ cache định kỳ và bạn đang sử dụng Firefox, các công cụ Web Developer (trong mục menu Tools kể từ tháng 11 năm 2015) sẽ cung cấp tùy chọn Network. Điều này bao gồm một nút Tải lại. Chọn Tải lại để đặt lại bộ nhớ cache một lần.


0

Nếu bạn muốn chắc chắn rằng các tệp này được Chrome làm mới đúng cách cho tất cả người dùng, thì bạn cần phải có must-revalidatetrong Cache-Controltiêu đề. Điều này sẽ khiến Chrome kiểm tra lại các tệp để xem liệu chúng có cần được tìm nạp lại hay không.

Đề xuất tiêu đề phản hồi sau:

Cache-Control: must-validate

Điều này yêu cầu Chrome kiểm tra với máy chủ và xem có tệp mới hơn không. Nếu có một tệp mới hơn, nó sẽ nhận nó trong phản hồi. Nếu không, nó sẽ nhận được phản hồi 304 và đảm bảo rằng phản hồi trong bộ nhớ cache được cập nhật.

Nếu bạn KHÔNG đặt tiêu đề này, thì trong trường hợp không có bất kỳ cài đặt nào khác làm mất hiệu lực tệp, Chrome sẽ không bao giờ kiểm tra với máy chủ để xem có phiên bản mới hơn hay không.

Đây là một bài đăng trên blog thảo luận thêm về vấn đề này.


0

Thay vì thẻ liên kết trong html-head sang tệp css bên ngoài, hãy sử dụng php-include:

<style>
<?php
include("style.css");
?>      
</style>

Loại hack, nhưng hiệu quả với tôi :)


1
Bạn đã xem xét OP có thể không sử dụng php?
Oram

0

Tôi đã quyết định rằng vì trình duyệt không kiểm tra các phiên bản mới của tệp css và js, nên tôi đổi tên các thư mục css và js của mình bất cứ khi nào tôi thực hiện thay đổi. Tôi sử dụng css1 đến css9 và js1 đến js9 làm tên thư mục. Khi tôi lên 9, lần tiếp theo tôi bắt đầu lại từ 1. Đó là một nỗi đau, nhưng lần nào nó cũng hoạt động hoàn hảo. Thật nực cười khi phải bảo người dùng gõ.


0

Tôi có một trường hợp, trong đó tôi cần có thể tạo và thay đổi bảng định kiểu của mình từ xa ảnh hưởng đến hàng nghìn khách hàng, nhưng do rủi ro tải mạng nặng, tôi không tắt bộ nhớ cache.

Vì tôi có thể thay đổi nội dung HTML từ xa, sau đó tôi liên kết biểu định kiểu với một mã băm phù hợp với nội dung của biểu định kiểu.

https://example.com/contents/stylesheetctrl?id=12345&hash=-1456405808

Điều đó nói rằng, tôi cũng sử dụng hàm javascript phía máy khách để thay thế cẩn thận các nút và thuộc tính khi nội dung HTML thay đổi, nghĩa là thẻ liên kết biểu định kiểu sẽ không bị thay thế, chỉ thuộc tính href thay đổi.

Tình huống này hoạt động tốt trong Chrome, Firefox và Edge trên Windows, cũng như Chrome trên Android, nhưng không phải lúc nào cũng hoạt động trong webclients trên Android. Vì vậy, ít nhiều tôi đang tìm kiếm thứ gì đó để buộc / kích hoạt cập nhật bằng javascript - một cách tối ưu mà không cần tải lại trang.


-1

Thử đi:

link href="styles/style.css?=time()" rel="stylesheet" type="text/css"

Nếu bạn cần thứ gì đó sau dấu '?' điều đó khác nhau mỗi khi trang được truy cập thì ý time()muốn thực hiện. Để điều này vĩnh viễn trong mã của bạn không thực sự là một ý tưởng hay vì nó sẽ chỉ làm chậm quá trình tải trang và có lẽ không cần thiết.

Tôi nhận thấy rằng việc buộc làm mới biểu định kiểu sẽ hữu ích nếu bạn đã thực hiện các thay đổi sâu rộng đối với bố cục của trang và truy cập biểu định kiểu mới là điều quan trọng để có một cái gì đó hợp lý xuất hiện trên màn hình.


1
Nó không hoạt động theo cách này! Chỉ khi tên tệp là trình duyệt khác nhau tải lại. Hoặc có thể với gợi ý này chỉ cho một số trình duyệt hoạt động, nếu nó đã làm việc cho bạn. Phản đối
Gediminas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.