บังคับให้เบราว์เซอร์รีเฟรช css, javascript ฯลฯ


88

ฉันกำลังพัฒนาเว็บไซต์โดยใช้ซอร์สโค้ด Wordpress ผ่าน XAMPP บางครั้งฉันเปลี่ยนโค้ด CSS, scrips หรืออย่างอื่นและฉันสังเกตว่าเบราว์เซอร์ของฉันต้องใช้เวลาในการปรับเปลี่ยน สิ่งนี้ทำให้ฉันต้องใช้เบราว์เซอร์หลายตัวเพื่อรีเฟรชและหากไม่ใช้รูปแบบใหม่ฉันลองใช้รูปแบบที่สองและเป็นแบบนี้เสมอ

มีวิธีหลีกเลี่ยงปัญหานี้หรือไม่? บางครั้งฉันเปลี่ยนรหัสโดยไม่ได้แจ้งให้ทราบถึงการแก้ไขก่อนหน้านี้


4
แคชของเบราว์เซอร์ ทุกครั้งที่คุณทำการเปลี่ยนแปลง CSS, JavaScript และกำลังดูเพจที่คุณอัปเดตคุณจะเห็นข้อกังวลนี้ คุณสามารถบังคับให้รีเฟรชได้โดยกด CTRL + F5 บนเบราว์เซอร์และจะได้รับเวอร์ชันล่าสุด ฉันพบว่า Chrome บางครั้งต้องใช้ลำดับนั้นสองสามครั้ง ...
anAgent

คุณสามารถล้างแคชเบราว์เซอร์โดยใช้โปรแกรมได้
Pawan


คำตอบที่นี่: คำตอบของ Fermin
JWC

คำตอบ:


111

วิธีแก้ปัญหาทั่วไป

กดCtrl+ F5(หรือCtrl+ Shift+ R) เพื่อบังคับให้แคชโหลดซ้ำ ผมเชื่อว่าแม็คการใช้งานCmd+ +ShiftR

PHP

ใน PHP คุณสามารถปิดการใช้งานแคชได้โดยตั้งค่าวันหมดอายุเป็นเวลาในอดีตด้วยส่วนหัว:

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");

โครเมียม

คุณสามารถปิดการใช้งานแคชของ Chrome ได้โดยเปิดเครื่องมือสำหรับนักพัฒนาโดยF12คลิกที่ไอคอนรูปเฟืองที่มุมล่างขวาแล้วเลือกปิดการใช้งานแคชในกล่องโต้ตอบการตั้งค่าดังนี้:

ป้อนคำอธิบายภาพที่นี่
ภาพที่นำมาจากคำตอบนี้

Firefox

พิมพ์about:configลงในแถบ URL network.http.use-cacheแล้วหารายการที่ชื่อว่า falseตั้งค่านี้


ขอบคุณ JamWaffles สำหรับคำอธิบายโดยละเอียดและขอบคุณทุกคนสำหรับการตอบกลับ ขอบคุณมาก.
user1511579

ใน Chrome เวอร์ชันล่าสุด: CTRL + R
Alix Axel

1
สำหรับ Chrome อินเทอร์เฟซที่คุณแชร์เปลี่ยนไปเล็กน้อย เพียงกดแท็บเครือข่ายแล้วคุณจะพบช่องทำเครื่องหมายที่นั่น
Baz Guvenkaya

5
FYI: สำหรับ Opera บน Mac คือ cmd-alt-R
Derwent

52

หากคุณต้องการหลีกเลี่ยงสิ่งนั้นในฝั่งไคลเอ็นต์คุณสามารถเพิ่มบางอย่างเช่น?v=1.xลิงค์ไฟล์ css เมื่อเนื้อหาไฟล์มีการเปลี่ยนแปลง ตัวอย่างเช่นหากมี<link rel="stylesheet" type="text/css" href="css-file-name.css">คุณสามารถเปลี่ยนเป็น<link rel="stylesheet" type="text/css" href="css-file-name.css?v=1.1">จะข้ามการแคช


1
จุดดี แต่เบราว์เซอร์มักจะถามเกี่ยวกับไฟล์ แน่นอนเซิร์ฟเวอร์จะส่งคืน "304 Not Modified"
Andrzej Jozwik

@ajozwik ฉันทดสอบกับ Firefox 26.0 และ Chromium 31.0.1650.57 เช่นเดียวกับที่คุณกล่าวไว้ Firefox จะสร้างข้อความค้นหาใหม่ทุกครั้งหาก URL ของ CSS มีเครื่องหมายคำถาม (และเซิร์ฟเวอร์ให้การตอบกลับ 304 ด้วยเนื้อหาที่ว่างเปล่า) Firefox จะไม่ทำการค้นหาใหม่หาก URL ของ CSS ไม่มีเครื่องหมายคำถาม Chromium ไม่ทำการค้นหาใหม่แม้จะมีเครื่องหมายคำถาม อาจถือได้ว่าเป็นจุดบกพร่องของ Firefox
Jaan

เพื่อนของฉันใช้วิธีนี้ไม่ได้ เฉพาะในกรณีที่ชื่อไฟล์แตกต่างกัน เหตุใดจึงมีการโหวตมากขึ้น?
Gediminas

ฉันพบในที่อื่น ๆ อีกหลายวิธีที่ให้ไว้ในคำตอบนี้ฉันเชื่อว่าสิ่งนี้ใช้ได้ผลในอดีต แต่ใช้ไม่ได้อีก หากคุณอยู่ในโหมดการพัฒนาแนวทางที่ดีที่สุดและเป็นสากลคือปิดใช้งานการแคชในเบราว์เซอร์ผ่านเมตาแท็ก HTML ดูคำตอบของฉันด้านล่าง
ePi272314

9

หากคุณสามารถเขียน php คุณสามารถเขียน:

<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(); ?>" />

มันจะสดชื่นเสมอ!

แก้ไข: แน่นอนว่ามันไม่สามารถใช้ได้จริงสำหรับทั้งเว็บไซต์เนื่องจากคุณจะไม่เพิ่มสิ่งนี้ด้วยตนเองสำหรับทุกสิ่ง


วิธีนี้ใช้ไม่ได้! เฉพาะในกรณีที่ชื่อไฟล์คือการรีโหลดเบราว์เซอร์อื่น หรืออาจจะมีคำใบ้นี้สำหรับเบราว์เซอร์บางตัวเท่านั้นถ้ามันได้ผลสำหรับคุณ
Gediminas

8

ตรวจสอบสิ่งนี้: ฉันจะบังคับให้เบราว์เซอร์ใช้สไตล์ชีตเวอร์ชันล่าสุดได้อย่างไร

สมมติว่าไฟล์ css ของคุณคือfoo.cssคุณสามารถบังคับให้ไคลเอนต์ใช้เวอร์ชันล่าสุดได้โดยการต่อท้ายสตริงข้อความค้นหาดังที่แสดงด้านล่าง

<link rel="stylesheet" href="foo.css?v=1.1">

5

มุมมองของนักพัฒนา
หากคุณอยู่ในโหมดการพัฒนา (เช่นในคำถามเดิม) แนวทางที่ดีที่สุดคือปิดการใช้งานแคชในเบราว์เซอร์ผ่านเมตาแท็ก HTML เพื่อให้แนวทางนี้เป็นสากลคุณต้องแทรกเมตาแท็กอย่างน้อยสามรายการดังที่แสดงด้านล่าง

<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" />

ด้วยวิธีนี้คุณในฐานะนักพัฒนาเพียง แต่ต้องรีเฟรชหน้าเพื่อดูการเปลี่ยนแปลง แต่อย่าลืมแสดงความคิดเห็นว่าโค้ดเมื่ออยู่ในการผลิตหลังจากการแคชทั้งหมดเป็นสิ่งที่ดีสำหรับลูกค้าของคุณ

โหมดการผลิต
เนื่องจากในการใช้งานจริงคุณจะอนุญาตให้แคชและลูกค้าของคุณไม่จำเป็นต้องรู้วิธีบังคับให้โหลดใหม่ทั้งหมดหรือเคล็ดลับอื่นใดคุณต้องรับประกันว่าเบราว์เซอร์จะโหลดไฟล์ใหม่ และใช่ในกรณีนี้แนวทางที่ดีที่สุดที่ฉันรู้คือเปลี่ยนชื่อไฟล์


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

มันจะรีเฟรชหากแก้ไข


ทางออกที่ดีมากสำหรับโครงการทั้งหมดที่ไม่ได้ใช้ webpack หรือเครื่องมือบรรจุที่เพิ่มการกำหนดเวอร์ชันให้กับทรัพยากรโดยอัตโนมัติ
Richi González

ฉันไม่ได้ลงคะแนน แต่โซลูชันนี้ใช้งานได้ไม่ดีใน Chrome ล่าสุด ณ วันนี้ แต่ยังคงดึงไฟล์ JavaScript เวอร์ชันก่อนหน้า
Mikaël Mayer

1

ตรวจสอบให้แน่ใจว่าไม่ได้เกิดขึ้นจาก DNS ของคุณ ตัวอย่างเช่น Cloudflare มีที่คุณสามารถเปิดโหมดการพัฒนาซึ่งบังคับให้ล้างสไตล์ชีทและรูปภาพของคุณเนื่องจาก Cloudflare มีแคชแบบเร่ง การดำเนินการนี้จะปิดใช้งานและบังคับให้อัปเดตทุกครั้งที่มีผู้เยี่ยมชมไซต์ของคุณ



0

คุณสามารถปิดการแคชด้วยแถบเครื่องมือนักพัฒนาเว็บของ Firefox



0

คำตอบที่ยอมรับข้างต้นถูกต้อง อย่างไรก็ตามหากคุณต้องการโหลดแคชซ้ำเป็นระยะ ๆ และคุณกำลังใช้ Firefox เครื่องมือสำหรับนักพัฒนาเว็บ (ภายใต้รายการเมนูเครื่องมือ ณ เดือนพฤศจิกายน 2015) จะมีตัวเลือกเครือข่าย ซึ่งรวมถึงปุ่มโหลดซ้ำ เลือกโหลดซ้ำเพื่อรีเซ็ตแคชครั้งเดียว


0

หากคุณต้องการให้แน่ใจว่า Chrome ได้รับการรีเฟรชไฟล์เหล่านี้อย่างเหมาะสมสำหรับผู้ใช้ทุกคนคุณจะต้องมีmust-revalidateในCache-Controlส่วนหัว วิธีนี้จะทำให้ Chrome ตรวจสอบไฟล์อีกครั้งเพื่อดูว่าจำเป็นต้องดึงข้อมูลอีกครั้งหรือไม่

แนะนำส่วนหัวการตอบกลับต่อไปนี้:

Cache-Control: must-validate

สิ่งนี้จะบอกให้ Chrome ตรวจสอบกับเซิร์ฟเวอร์และดูว่ามีไฟล์ใหม่กว่าหรือไม่ หากมีไฟล์ใหม่กว่าจะได้รับในการตอบกลับ หากไม่เป็นเช่นนั้นจะได้รับการตอบกลับ 304 และการรับรองว่าข้อมูลในแคชเป็นข้อมูลล่าสุด

หากคุณไม่ได้ตั้งค่าส่วนหัวนี้หากไม่มีการตั้งค่าอื่นใดที่ทำให้ไฟล์ไม่ถูกต้อง Chrome จะไม่ตรวจสอบกับเซิร์ฟเวอร์เพื่อดูว่ามีเวอร์ชันที่ใหม่กว่าหรือไม่

นี่คือบล็อกโพสต์ที่กล่าวถึงปัญหาเพิ่มเติม


0

แทน link-tag ใน html-head ไปยังไฟล์ css ภายนอกให้ใช้ php-include:

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

แฮ็ค แต่ใช้ได้กับฉัน :)


1
คุณคิดว่า OP อาจไม่ใช้ php หรือไม่?
Oram

0

ฉันตัดสินใจแล้วว่าเนื่องจากเบราว์เซอร์ไม่ได้ตรวจสอบไฟล์ css และ js เวอร์ชันใหม่ฉันจึงเปลี่ยนชื่อไดเรกทอรี css และ js ทุกครั้งที่ฉันทำการเปลี่ยนแปลง ฉันใช้ css1 ถึง css9 และ js1 ถึง js9 เป็นชื่อไดเร็กทอรี เมื่อฉันได้ 9 ฉันเริ่มต้นใหม่ที่ 1 มันเป็นความเจ็บปวด แต่มันก็ทำงานได้ดีทุกครั้ง เป็นเรื่องน่าขันที่ต้องบอกให้ผู้ใช้พิมพ์


0

ฉันมีกรณีที่ฉันต้องสามารถสร้างและเปลี่ยนสไตล์ชีตของฉันได้จากระยะไกลซึ่งส่งผลกระทบต่อลูกค้าหลายพันราย แต่เนื่องจากความเสี่ยงที่เครือข่ายจะโหลดหนักฉันจึงไม่ได้ปิดแคช

เนื่องจากฉันสามารถเปลี่ยนเนื้อหา HTML ได้จากระยะไกลฉันจึงเชื่อมโยงสไตล์ชีตด้วยแฮชโค้ดที่ตรงกับเนื้อหาของสไตล์ชีท

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

ที่กล่าวว่าฉันยังใช้ฟังก์ชันจาวาสคริปต์ฝั่งไคลเอ็นต์เพื่อแทนที่โหนดและแอตทริบิวต์อย่างระมัดระวังเมื่อเนื้อหา HTML เปลี่ยนแปลงซึ่งหมายความว่าแท็กลิงก์สไตล์ชีทจะไม่ถูกแทนที่มีเพียงแอตทริบิวต์ href เท่านั้นที่จะเปลี่ยน

สถานการณ์นี้ใช้งานได้ดีใน Chrome, Firefox และ Edge บน Windows รวมถึง Chrome บน Android แต่ไม่สามารถใช้งานได้กับผู้ใช้เว็บบน Android เสมอไป ดังนั้นฉันไม่มากก็น้อยกำลังมองหาสิ่งที่จะบังคับ / ทริกเกอร์การอัปเดตโดยใช้จาวาสคริปต์ - อย่างเหมาะสมที่สุดโดยไม่จำเป็นต้องโหลดหน้าซ้ำ


0

คุณสามารถใช้แถบเครื่องมือสำหรับนักพัฒนา Firefox / Chrome:

  1. เปิด Dev Toolbar Ctrl+ Shift+I
  2. ไปที่แท็บเครือข่าย
  3. กดช่องทำเครื่องหมาย "ปิดการใช้งานแคช" (Firefox: ด้านบนขวาของแถบเครื่องมือ Chrome: ตรงกลางด้านบนของแถบเครื่องมือ)

-1

ลองสิ่งนี้:

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

หากคุณต้องการบางสิ่งบางอย่างหลังจาก "?" ซึ่งจะแตกต่างกันทุกครั้งที่เข้าถึงเพจจากนั้นก็time()จะทำ การปล่อยสิ่งนี้ไว้ในโค้ดของคุณอย่างถาวรไม่ใช่ความคิดที่ดีจริงๆเนื่องจากจะทำให้การโหลดหน้าเว็บช้าลงและอาจไม่จำเป็น

ฉันพบว่าการบังคับให้รีเฟรชสไตล์ชีตมีประโยชน์หากคุณได้ทำการเปลี่ยนแปลงอย่างมากกับเค้าโครงของหน้าและการเข้าถึงสไตล์ชีตใหม่มีความสำคัญต่อการมีสิ่งที่เหมาะสมปรากฏบนหน้าจอ


1
วิธีนี้ใช้ไม่ได้! เฉพาะในกรณีที่ชื่อไฟล์คือการรีโหลดเบราว์เซอร์อื่น หรืออาจใช้คำใบ้นี้สำหรับเบราว์เซอร์บางตัวเท่านั้นถ้ามันใช้ได้ผลสำหรับคุณ Downvote
Gediminas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.