ใน Codelab นี้ คุณจะใช้การดึงข้อมูลล่วงหน้า 2 วิธี ได้แก่ ด้วย <link rel="prefetch">
และส่วนหัว HTTP Link
แอปตัวอย่างคือเว็บไซต์ที่มีหน้า Landing Page สำหรับโปรโมชันพร้อมส่วนลดพิเศษสำหรับเสื้อยืดที่ขายดีที่สุดของร้าน เนื่องจากหน้า Landing Page นั้นลิงก์กับผลิตภัณฑ์รายการเดียว จึงน่าจะเดาได้ว่าผู้ใช้ที่ไปยังหน้ารายละเอียดผลิตภัณฑ์นั้นมีเปอร์เซ็นต์สูง ซึ่งจะทำให้หน้าผลิตภัณฑ์เป็นตัวเลือกที่ดีที่จะดึงข้อมูลล่วงหน้าในหน้า Landing Page
วัดประสิทธิภาพ
ก่อนอื่นให้สร้างประสิทธิภาพพื้นฐาน
- คลิกรีมิกซ์เพื่อแก้ไขเพื่อทำให้โปรเจ็กต์แก้ไขได้
- หากต้องการดูตัวอย่างเว็บไซต์ ให้กดดูแอป แล้วกดเต็มหน้าจอ
- กด "Control+Shift+J" (หรือ "Command+Option+J" ใน Mac) เพื่อเปิดเครื่องมือสำหรับนักพัฒนาเว็บ
คลิกแท็บเครือข่าย
ในรายการแบบเลื่อนลง Throttling ให้เลือก Fast 3G เพื่อจำลองประเภทการเชื่อมต่อที่ช้า
หากต้องการโหลดหน้าผลิตภัณฑ์ ให้คลิกซื้อเลยในแอปตัวอย่าง
หน้าเว็บ product-details.html
จะใช้เวลาประมาณ 600 มิลลิวินาทีในการโหลด:
ดึงข้อมูลหน้าผลิตภัณฑ์ล่วงหน้าด้วย <link rel="prefetch">
หากต้องการปรับปรุงการนำทาง ให้แทรกแท็ก prefetch
ในหน้า Landing Page เพื่อดึงข้อมูลหน้า product-details.html
ล่วงหน้า โดยทำดังนี้
- เพิ่มองค์ประกอบ
<link>
ต่อไปนี้ในส่วนหัวของไฟล์views/index.html
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet">
<link rel="prefetch" href="/product-details.html" as="document">
...
</head>
แอตทริบิวต์ as
เป็นแอตทริบิวต์ที่ไม่บังคับ แต่แนะนำให้มี เพราะจะช่วยให้เบราว์เซอร์ตั้งค่าส่วนหัวที่ถูกต้องและกำหนดว่าแหล่งข้อมูลอยู่ในแคชแล้วหรือไม่ ค่าตัวอย่างสำหรับแอตทริบิวต์นี้ ได้แก่ document
, script
, style
, font
, image
และ อื่นๆ
วิธียืนยันว่าการดึงข้อมูลล่วงหน้าใช้งานได้
- หากต้องการดูตัวอย่างเว็บไซต์ ให้กดดูแอป แล้วกดเต็มหน้าจอ
- กด "Control+Shift+J" (หรือ "Command+Option+J" ใน Mac) เพื่อเปิดเครื่องมือสำหรับนักพัฒนาเว็บ
คลิกแท็บเครือข่าย
ในรายการแบบเลื่อนลง Throttling ให้เลือก Fast 3G เพื่อจำลองประเภทการเชื่อมต่อที่ช้า
ล้างช่องทำเครื่องหมาย ปิดใช้งานแคช
โหลดแอปซ้ำ
ตอนนี้เมื่อหน้า Landing Page โหลดขึ้น หน้า product-details.html
จะโหลดเช่นกัน แต่จะมีลำดับความสำคัญต่ำสุดดังนี้
หน้าเว็บจะเก็บไว้ในแคช HTTP เป็นเวลา 5 นาที หลังจากนั้นกฎ Cache-Control
ปกติสำหรับเอกสารจะมีผล ในกรณีนี้ product-details.html
มีส่วนหัว cache-control
ที่มีค่าเป็น public, max-age=0
ซึ่งหมายความว่าหน้าเว็บจะคงอยู่เป็นเวลาทั้งหมด 5 นาที
ประเมินประสิทธิภาพอีกครั้ง
- โหลดแอปซ้ำ
- หากต้องการโหลดหน้าผลิตภัณฑ์ ให้คลิกซื้อเลยในแอปตัวอย่าง
ลองดูที่แผงเครือข่าย การติดตามเครือข่ายเริ่มต้นมีความแตกต่าง 2 ประการดังนี้
- คอลัมน์ขนาดจะแสดง "ดึงข้อมูลแคชล่วงหน้า" ซึ่งหมายความว่ามีการดึงข้อมูลทรัพยากรนี้จากแคชของเบราว์เซอร์ไม่ใช่เครือข่าย
- คอลัมน์เวลาจะแสดงว่าเวลาที่ใช้ในการโหลดเอกสารตอนนี้คือประมาณ 10 มิลลิวินาที
อัตรานี้ลดลงประมาณ 98% เมื่อเทียบกับเวอร์ชันก่อนหน้า ซึ่งใช้เวลาประมาณ 600 มิลลิวินาที
เครดิตเพิ่มเติม: ใช้ prefetch
เป็นการเพิ่มประสิทธิภาพแบบต่อเนื่อง
การดึงข้อมูลล่วงหน้าเป็นตัวเลือกที่ดีที่สุดสำหรับการเพิ่มประสิทธิภาพแบบต่อเนื่องสำหรับผู้ใช้ที่เรียกดูจากการเชื่อมต่อที่รวดเร็ว คุณใช้ Network Information API เพื่อตรวจสอบเงื่อนไขของเครือข่ายและตามการแทรกแท็กการดึงข้อมูลล่วงหน้าแบบไดนามิกได้ ด้วยวิธีนี้ คุณสามารถลดปริมาณการใช้อินเทอร์เน็ตและประหยัดค่าใช้จ่ายสำหรับผู้ใช้ที่ใช้แพ็กเกจอินเทอร์เน็ตที่ช้าหรือแพง
หากต้องการใช้การดึงข้อมูลล่วงหน้าแบบปรับอัตโนมัติ ให้นำแท็ก <link rel="prefetch">
ออกจาก views/index.html
ก่อน:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet">
<link rel="prefetch" href="/product-details.html" as="document">
...
</head>
จากนั้นเพิ่มโค้ดต่อไปนี้ลงใน public/script.js
เพื่อประกาศฟังก์ชันที่แทรกแท็ก prefetch
แบบไดนามิกเมื่อผู้ใช้มีการเชื่อมต่อที่รวดเร็ว
function injectLinkPrefetchIn4g(url) {
if (window.navigator.connection.effectiveType === '4g') {
//generate link prefetch tag
const linkTag = document.createElement('link');
linkTag.rel = 'prefetch';
linkTag.href = url;
linkTag.as = 'document';
//inject tag in the head of the document
document.head.appendChild(linkTag);
}
}
ฟังก์ชันนี้จะทำงานดังนี้
- โดยจะตรวจสอบพร็อพเพอร์ตี้ effectiveType ของ Network Information API เพื่อระบุว่าผู้ใช้ใช้การเชื่อมต่อ 4G (หรือเร็วกว่า) หรือไม่
- หากเงื่อนไขดังกล่าวเป็นไปตามเงื่อนไข ก็จะสร้างแท็ก
<link>
ที่มีprefetch
เป็นประเภทคำแนะนำ ส่ง URL ที่จะถูกดึงข้อมูลล่วงหน้าในแอตทริบิวต์href
และระบุว่าทรัพยากรเป็นdocument
ของ HTML ในแอตทริบิวต์as
- สุดท้ายจะแทรกสคริปต์แบบไดนามิกใน
head
ของหน้าเว็บ
จากนั้น เพิ่ม script.js
ลงใน views/index.html
ก่อนแท็กปิด </body>
:
<body>
...
<script src="/script.js"></script>
</body>
การส่งคำขอ script.js
ที่ส่วนท้ายของหน้าเว็บจะช่วยให้มั่นใจได้ว่าระบบจะโหลดและดำเนินการหลังจากที่มีการแยกวิเคราะห์และโหลดหน้าเว็บแล้ว
เพิ่มข้อมูลโค้ดต่อไปนี้เพื่อเรียกใช้ injectLinkPrefetchIn4g()
ในเหตุการณ์ window.load
เพื่อให้มั่นใจว่าการดึงข้อมูลล่วงหน้าจะไม่รบกวนทรัพยากรที่สำคัญของหน้าปัจจุบัน
<body>
...
<script src="/script.js"></script>
<script>
window.addEventListener('load', () => {
injectLinkPrefetchIn4g('/product-details.html');
});
</script>
</body>
ตอนนี้หน้า Landing Page จะดึงข้อมูล product-details.html
ล่วงหน้าสำหรับการเชื่อมต่อที่มีความเร็วเท่านั้น โดยทำดังนี้
- หากต้องการดูตัวอย่างเว็บไซต์ ให้กดดูแอป แล้วกดเต็มหน้าจอ
- กด "Control+Shift+J" (หรือ "Command+Option+J" ใน Mac) เพื่อเปิดเครื่องมือสำหรับนักพัฒนาเว็บ
- คลิกแท็บเครือข่าย
- ในรายการแบบเลื่อนลง Throttling ให้เลือก Online
- โหลดแอปซ้ำ
คุณควรเห็น product-details.html
ในแผงเครือข่ายดังนี้
วิธียืนยันว่าหน้าผลิตภัณฑ์ไม่ได้ถูกดึงข้อมูลล่วงหน้าจากการเชื่อมต่อที่ช้า
- ในรายการแบบเลื่อนลง "การควบคุม" ให้เลือก 3G ช้า
- โหลดแอปซ้ำ
แผงเครือข่ายควรรวมเฉพาะทรัพยากรสำหรับหน้า Landing Page ที่ไม่มี product-details.html
ดังนี้
ดึงสไตล์ชีตสำหรับหน้าผลิตภัณฑ์ที่มีส่วนหัว HTTP Link
ล่วงหน้า
ส่วนหัว HTTP Link
สามารถใช้เพื่อดึงข้อมูลทรัพยากรประเภทเดียวกันกับแท็ก link
ล่วงหน้า การตัดสินใจว่าเมื่อใดควรใช้สิ่งหนึ่งหรือทางเลือกอื่นๆ ขึ้นอยู่กับความต้องการของคุณเป็นหลัก เนื่องจากความแตกต่างของประสิทธิภาพนั้นไม่มีนัยสำคัญ ในกรณีนี้ คุณจะใช้ค่าดังกล่าวเพื่อดึงข้อมูล CSS หลักของหน้าผลิตภัณฑ์ล่วงหน้าเพื่อปรับปรุงการแสดงผลให้ดียิ่งขึ้น
เพิ่มส่วนหัว HTTP Link
สำหรับ style-product.css
ในการตอบกลับของเซิร์ฟเวอร์สำหรับหน้า Landing Page ดังนี้
- เปิดไฟล์
server.js
แล้วมองหาตัวแฮนเดิลget()
เพื่อหา URL ราก/
- เพิ่มบรรทัดต่อไปนี้ที่จุดเริ่มต้นของเครื่องจัดการ
app.get('/', function(request, response) {
response.set('Link', '</style-product.css>; rel=prefetch');
response.sendFile(__dirname + '/views/index.html');
});
- หากต้องการดูตัวอย่างเว็บไซต์ ให้กดดูแอป แล้วกดเต็มหน้าจอ
- กด "Control+Shift+J" (หรือ "Command+Option+J" ใน Mac) เพื่อเปิดเครื่องมือสำหรับนักพัฒนาเว็บ
- คลิกแท็บเครือข่าย
- โหลดแอปซ้ำ
ขณะนี้ ระบบจะดึงข้อมูล style-product.css
ล่วงหน้าที่ลำดับความสำคัญต่ำสุดหลังจากหน้า Landing Page โหลด
หากต้องการไปที่หน้าผลิตภัณฑ์ ให้คลิกซื้อเลย ลองดูที่แผงเครือข่าย
ไฟล์ style-product.css
ดึงมาจาก "การดึงข้อมูลแคชล่วงหน้า" และใช้เวลาโหลดเพียง 12 มิลลิวินาที