Codelab นี้แสดงวิธีเปลี่ยนส่วนหัวการแคช HTTP ที่แสดงผลโดยเว็บเซิร์ฟเวอร์ที่ใช้ Node.js ซึ่งใช้เฟรมเวิร์กการแสดงผล Express นอกจากนี้ยังแสดงวิธียืนยันว่าลักษณะการแคชที่คุณคาดหวังนั้นมีการใช้งานจริง โดยใช้แผงเครือข่ายในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
ทำความคุ้นเคยกับโปรเจ็กต์ตัวอย่าง
ไฟล์หลักที่คุณจะใช้ในโปรเจ็กต์ตัวอย่างมีดังนี้
server.jsมีโค้ด Node.js ที่แสดงเนื้อหาของเว็บแอป โดยใช้ Express เพื่อจัดการคำขอ HTTP และการตอบกลับ โดยเฉพาะอย่างยิ่งexpress.static()จะใช้เพื่อแสดงไฟล์ในเครื่องทั้งหมดในไดเรกทอรีสาธารณะ ดังนั้นเอกสารประกอบของserve-staticจะมีประโยชน์มากpublic/index.htmlคือ HTML ของเว็บแอป เช่นเดียวกับไฟล์ HTML ส่วนใหญ่ ไฟล์นี้ไม่มีข้อมูลการกำหนดเวอร์ชันเป็นส่วนหนึ่งของ URLpublic/app.15261a07.jsและpublic/style.391484cf.cssคือชิ้นงาน JavaScript และ CSS ของเว็บแอป ไฟล์เหล่านี้แต่ละไฟล์มีแฮชใน URL ซึ่งสอดคล้องกับเนื้อหาของไฟล์index.htmlมีหน้าที่ติดตามว่าควรโหลด URL เวอร์ชันใดที่เฉพาะเจาะจง
กำหนดค่าส่วนหัวการแคชสำหรับ HTML
เมื่อตอบกลับคำขอ URL ที่ไม่มีข้อมูลการกำหนดเวอร์ชัน ให้ตรวจสอบว่าคุณได้เพิ่ม Cache-Control: no-cache ลงในข้อความตอบกลับ นอกจากนี้ เราขอแนะนำให้ตั้งค่าส่วนหัวการตอบกลับเพิ่มเติม 1 ใน 2 รายการ ได้แก่ Last-Modified หรือ ETag index.html จัดอยู่ในหมวดหมู่นี้ คุณสามารถแบ่งขั้นตอนนี้ออกเป็น 2 ขั้นตอน
ก่อนอื่น ส่วนหัว Last-Modified และ ETag จะควบคุมโดยตัวเลือกการกำหนดค่า etag และ lastModified ทั้ง 2 ตัวเลือกนี้มีค่าเริ่มต้นเป็น true สำหรับการตอบกลับ HTTP ทั้งหมด ดังนั้นในการตั้งค่าปัจจุบัน คุณจึงไม่จำเป็นต้องเลือกใช้เพื่อให้ได้ลักษณะการทำงานดังกล่าว แต่คุณสามารถระบุอย่างชัดเจนในการกำหนดค่าได้
ประการที่ 2 คุณต้องเพิ่มส่วนหัว Cache-Control: no-cache ได้ แต่เฉพาะสำหรับเอกสาร HTML (ในกรณีนี้คือ index.html) วิธีที่ง่ายที่สุดในการตั้งค่าส่วนหัวนี้แบบมีเงื่อนไขคือการเขียน setHeaders function ที่กำหนดเอง และตรวจสอบภายในนั้นว่าคำขอที่เข้ามาเป็นเอกสาร HTML หรือไม่
การกำหนดค่าการแสดงผลแบบคงที่ใน server.js จะเริ่มต้นดังนี้
app.use(express.static('public'));
- ทำการเปลี่ยนแปลงตามที่อธิบายไว้ข้างต้น แล้วคุณจะได้โค้ดที่มีลักษณะดังนี้
app.use(express.static('public', {
etag: true, // Just being explicit about the default.
lastModified: true, // Just being explicit about the default.
setHeaders: (res, path) => {
if (path.endsWith('.html')) {
// All of the project's HTML files end in .html
res.setHeader('Cache-Control', 'no-cache');
}
},
}));
กำหนดค่าส่วนหัวการแคชสำหรับ URL ที่มีการกำหนดเวอร์ชัน
เมื่อตอบสนองต่อคำขอ URL ที่มีข้อมูล "ลายนิ้วมือ" หรือข้อมูลการกำหนดเวอร์ชัน และเนื้อหาที่ไม่มีการเปลี่ยนแปลง ให้เพิ่ม Cache-Control: max-age=31536000 ลงในการตอบกลับ app.15261a07.js และ style.391484cf.css จัดอยู่ในหมวดหมู่นี้
ต่อยอดจาก
setHeaders function
ที่ใช้ในขั้นตอนสุดท้าย คุณสามารถเพิ่มตรรกะเพิ่มเติมเพื่อตรวจสอบว่าคำขอที่ระบุเป็น URL ที่กำหนดเวอร์ชันหรือไม่ และหากเป็นเช่นนั้น ให้เพิ่มส่วนหัว Cache-Control:
max-age=31536000
วิธีที่มีประสิทธิภาพที่สุดในการดำเนินการนี้คือการใช้นิพจน์ทั่วไปเพื่อดูว่าชิ้นงานที่ขอตรงกับรูปแบบเฉพาะที่คุณทราบว่าแฮชจะตรงกันหรือไม่ ในกรณีของโปรเจ็กต์ตัวอย่างนี้ จะเป็นอักขระ 8 ตัวจากชุดตัวเลข 0-9 และตัวอักษรพิมพ์เล็ก a-f (เช่น อักขระเลขฐาน 16) เสมอ แฮชจะคั่นด้วยอักขระ . เสมอในแต่ละด้าน
นิพจน์ทั่วไปที่ตรงกับกฎทั่วไปเหล่านั้นสามารถแสดงเป็น new RegExp('\\.[0-9a-f]{8}\\.')
- แก้ไขฟังก์ชัน
setHeadersให้มีลักษณะดังนี้
app.use(express.static('public', {
etag: true, // Just being explicit about the default.
lastModified: true, // Just being explicit about the default.
setHeaders: (res, path) => {
const hashRegExp = new RegExp('\\.[0-9a-f]{8}\\.');
if (path.endsWith('.html')) {
// All of the project's HTML files end in .html
res.setHeader('Cache-Control', 'no-cache');
} else if (hashRegExp.test(path)) {
// If the RegExp matched, then we have a versioned URL.
res.setHeader('Cache-Control', 'max-age=31536000');
}
},
}));
ยืนยันลักษณะการทำงานใหม่โดยใช้เครื่องมือสำหรับนักพัฒนาเว็บ
เมื่อแก้ไขเซิร์ฟเวอร์ไฟล์แบบคงที่แล้ว คุณสามารถตรวจสอบว่าได้ตั้งค่าส่วนหัวที่ถูกต้องโดยดูตัวอย่างแอปเวอร์ชันที่เผยแพร่อยู่โดยเปิดแผงเครือข่ายของเครื่องมือสำหรับนักพัฒนาเว็บไว้
- ปรับแต่งคอลัมน์ที่แสดงในแผงเครือข่ายเพื่อรวมข้อมูลที่เกี่ยวข้องมากที่สุด โดยคลิกขวาที่ส่วนหัวของคอลัมน์

ในกรณีนี้ คอลัมน์ที่ควรให้ความสนใจคือ Name, Status, Cache-Control, ETag และ Last-Modified
- เมื่อเครื่องมือสำหรับนักพัฒนาเว็บเปิดแผงเครือข่ายแล้ว ให้รีเฟรชหน้าเว็บ
หลังจากหน้าเว็บโหลดแล้ว คุณควรเห็นรายการในแผงเครือข่ายที่มีลักษณะดังนี้

แถวแรกมีไว้สำหรับเอกสาร HTML ที่คุณไปยังส่วนต่างๆ ซึ่งแสดงผลอย่างถูกต้องด้วย Cache-Control: no-cache สถานะการตอบกลับ HTTP สำหรับคำขอนั้นคือ 304 ซึ่งหมายความว่าเบราว์เซอร์ทราบว่าไม่ควรใช้ HTML ที่แคชไว้ทันที แต่ให้ส่งคำขอ HTTP ไปยังเว็บเซิร์ฟเวอร์แทน โดยใช้ข้อมูล Last-Modified และ ETag เพื่อดูว่ามีการอัปเดต HTML ที่มีอยู่ในแคชแล้วหรือไม่ การตอบกลับ HTTP 304 บ่งชี้ว่าไม่มี HTML ที่อัปเดต
2 แถวถัดไปมีไว้สำหรับเนื้อหา JavaScript และ CSS ที่กำหนดเวอร์ชัน คุณควรเห็นหน้าเว็บเหล่านั้นแสดงด้วย Cache-Control: max-age=31536000 และสถานะ HTTP ของแต่ละหน้าคือ 200
เนื่องจากการกำหนดค่าที่ใช้ จึงไม่มีการส่งคำขอจริงไปยังเซิร์ฟเวอร์ Node.js และการคลิกรายการจะแสดงรายละเอียดเพิ่มเติม รวมถึงการตอบกลับที่มาจาก "(จากแคชดิสก์)"

ค่าจริงสำหรับคอลัมน์ ETag และ Last-Modified ไม่สำคัญมากนัก สิ่งสำคัญคือการยืนยันว่ามีการตั้งค่าคุกกี้
กำลังสรุปข้อมูล
เมื่อทำตามขั้นตอนใน Codelab นี้แล้ว คุณจะคุ้นเคยกับวิธีกำหนดค่าส่วนหัวการตอบกลับ HTTP ในเว็บเซิร์ฟเวอร์ที่ใช้ Node.js โดยใช้ Express เพื่อการใช้แคช HTTP อย่างมีประสิทธิภาพสูงสุด นอกจากนี้ คุณยังมีขั้นตอนที่จำเป็นในการยืนยันว่ามีการใช้ลักษณะการทำงานของการแคชที่คาดไว้ผ่านแผงเครือข่ายในเครื่องมือสำหรับนักพัฒนาเว็บของ Chrome