เว็บแอปที่โหลดทันทีด้วยสถาปัตยกรรม Application Shell

Application Shell คือ HTML, CSS และ JavaScript ที่ขับเคลื่อนอินเทอร์เฟซผู้ใช้ Application Shell ควร

  • โหลดเร็ว
  • มีการแคช
  • แสดงเนื้อหาแบบไดนามิก

Application Shell คือความลับของประสิทธิภาพการทำงานที่เชื่อถือได้ ลองจินตนาการว่า App Shell เป็นชุดโค้ดที่จะเผยแพร่ใน App Store หากคุณกำลังสร้างแอปที่มาพร้อมเครื่อง ซึ่งทั้งหมดจำเป็นต้องมีการดำเนินการเพื่อเริ่มใช้งาน แต่ก็อาจไม่ใช่เรื่องราวทั้งหมด ซึ่งจะทำให้ UI อยู่ในเครื่องและดึงข้อมูลเข้ามาผ่าน API

การแยก App Shell ของ HTML, JS และ CSS Shell และเนื้อหา HTML

ที่มา

บทความ Progressive Web App ของ Alex Russell อธิบายถึงวิธีที่เว็บแอปสามารถเปลี่ยนการใช้งานและความยินยอมของผู้ใช้อย่างก้าวหน้าเพื่อมอบประสบการณ์การใช้งานที่เหมือนกับแอปที่มาพร้อมเครื่องมากขึ้น พร้อมการรองรับแบบออฟไลน์ ข้อความ Push และความสามารถในการเพิ่มลงในหน้าจอหลัก ขึ้นอยู่กับฟังก์ชันและประโยชน์ด้านประสิทธิภาพของโปรแกรมทำงานของบริการ และความสามารถในการแคชเป็นอย่างมาก ซึ่งช่วยให้คุณสามารถมุ่งเน้นไปที่ความเร็ว โดยทำให้เว็บแอปมีการโหลดทันทีและการอัปเดตตามปกติเหมือนที่คุณเคยเห็นในแอปพลิเคชันที่มาพร้อมเครื่อง

เพื่อใช้ประโยชน์จากความสามารถเหล่านี้อย่างเต็มที่ เราจำเป็นต้องมีแนวคิดใหม่เกี่ยวกับเว็บไซต์ นั่นก็คือสถาปัตยกรรม Application Shell

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

ตัวอย่างด้านล่างจะแสดงข้อมูลการโหลดครั้งแรกของแอปโดยใช้สถาปัตยกรรมนี้ โปรดสังเกตว่าข้อความ "แอปพร้อมใช้งานแบบออฟไลน์แล้ว" ที่ด้านล่างของหน้าจอ หากการอัปเดต Shell พร้อมใช้งานในภายหลัง เราสามารถแจ้งให้ผู้ใช้รีเฟรชสำหรับเวอร์ชันใหม่ได้

รูปภาพ Service Worker ที่ทำงานอยู่ในเครื่องมือสำหรับนักพัฒนาเว็บสำหรับ Application Shell

Service Worker คืออะไรนะ

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

นอกจากนี้ โปรแกรมทำงานของบริการยังมี API ที่จำกัดเมื่อเทียบกับ JavaScript ในบริบทการท่องเว็บปกติ นี่เป็นมาตรฐานสำหรับผู้ปฏิบัติงานบนเว็บ Service Worker ไม่สามารถเข้าถึง DOM แต่สามารถเข้าถึงสิ่งต่างๆ เช่น Cache API และสามารถส่งคำขอเครือข่ายโดยใช้ Fetch API นอกจากนี้ IndexedDB API และ postMessage() ยังใช้ได้เพื่อความต่อเนื่องของข้อมูลและการรับส่งข้อความระหว่าง Service Worker กับหน้าที่โปรแกรมควบคุม เหตุการณ์พุชที่ส่งจากเซิร์ฟเวอร์จะเรียกใช้ Notification API เพื่อเพิ่มการมีส่วนร่วมของผู้ใช้

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

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับ Service Worker โดยละเอียด โปรดอ่านข้อมูลเบื้องต้นเกี่ยวกับ Service Worker

ประโยชน์ด้านประสิทธิภาพ

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

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

ในการทดสอบสถาปัตยกรรมนี้กับอุปกรณ์จริง เราได้เรียกใช้ตัวอย่างเปลือกแอปพลิเคชันใน WebPageTest.org และแสดงผลลัพธ์ด้านล่างนี้

การทดสอบ 1: การทดสอบสายเคเบิลกับ Nexus 5 โดยใช้ Chrome Dev

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

แผนภาพการแสดงผลการทดสอบหน้าเว็บสำหรับการต่อสายเคเบิล

การทดสอบ 2: การทดสอบ 3G ด้วย Nexus 5 โดยใช้ Chrome Dev

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

แผนภาพการแสดงผลการทดสอบหน้าเว็บสำหรับการเชื่อมต่อ 3G

มุมมองอื่นๆ ก็เล่าเรื่องคล้ายๆ กัน เปรียบเทียบ 3 วินาทีเพื่อให้ได้การแสดงผลที่มีความหมายครั้งแรกใน Application Shell

แสดงผลไทม์ไลน์สําหรับการดูครั้งแรกจากการทดสอบหน้าเว็บ

เป็น 0.9 วินาทีเมื่อหน้าเว็บเดียวกันโหลดจากแคชของ Service Worker ผู้ใช้ปลายทางของเราประหยัดเวลาได้กว่า 2 วินาที

แสดงผลไทม์ไลน์สำหรับการดูซ้ำจากการทดสอบหน้าเว็บ

ประสิทธิภาพการทำงานที่คล้ายคลึงกันและเชื่อถือได้สำหรับแอปพลิเคชันของคุณเองนั้นเป็นไปได้ด้วยสถาปัตยกรรม Application Shell

เราต้องทบทวนโครงสร้างของแอปไหมเมื่อใช้โปรแกรมทำงานของบริการ

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

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

แล้วการเพิ่มประสิทธิภาพแบบต่อเนื่องล่ะ

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

คุณสามารถดูเวอร์ชันเต็มที่แสดงผลใน Chrome, Firefox Nightly และ Safari ได้ที่ด้านล่าง ทางด้านซ้ายสุด คุณจะเห็นเวอร์ชันของ Safari ที่เนื้อหาแสดงผลบนเซิร์ฟเวอร์ที่ไม่มีโปรแกรมทำงานของบริการ ทางด้านขวาเราจะเห็นเวอร์ชันของ Chrome และ Firefox Nightly ที่ขับเคลื่อนโดย Service Worker

รูปภาพแสดงเชลล์ของแอปพลิเคชันที่โหลดใน Safari, Chrome และ Firefox

เมื่อใดที่ควรใช้สถาปัตยกรรมนี้

สถาปัตยกรรม Application Shell เหมาะกับแอปและเว็บไซต์แบบไดนามิกมากที่สุด หากเว็บไซต์มีขนาดเล็กและคงที่ คุณอาจไม่จำเป็นต้องใช้ Application Shell และสามารถแคชทั้งเว็บไซต์ในขั้นตอน oninstall ของ Service Worker ได้ ใช้วิธีการที่เหมาะสมกับโปรเจ็กต์ของคุณมากที่สุด เฟรมเวิร์ก JavaScript จำนวนหนึ่งส่งเสริมให้แยกตรรกะแอปพลิเคชันออกจากเนื้อหาแล้ว ทำให้ใช้รูปแบบนี้ได้ทันที

มีแอปเวอร์ชันที่ใช้งานจริงที่ใช้รูปแบบนี้หรือยัง

สถาปัตยกรรม Application Shell เป็นไปได้ด้วยการเปลี่ยนแปลง UI ของแอปพลิเคชันโดยรวมเพียงเล็กน้อย และทำงานได้ดีสำหรับเว็บไซต์ขนาดใหญ่ เช่น Progressive Web App ของ I/O 2015 และกล่องจดหมายของ Google

รูปภาพการโหลด Google Inbox แสดงกล่องจดหมายโดยใช้ Service Worker

Application Shell แบบออฟไลน์ถือเป็นผู้ชนะด้านประสิทธิภาพที่สำคัญ และยังแสดงให้เห็นเป็นอย่างดีในแอป Wikipedia แบบออฟไลน์ของ Jake Archibald และเว็บแอปแบบโพรเกรสซีฟของ Flipkart Lite

ภาพหน้าจอเดโม Wikipedia ของ Jake Archibald

อธิบายเกี่ยวกับสถาปัตยกรรม

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

การโหลดครั้งแรกและโหลดหน้าอื่นๆ

แผนภาพการโหลดครั้งแรกด้วย App Shell

โดยทั่วไป สถาปัตยกรรม Application Shell จะมีคุณสมบัติดังนี้

  • ให้ความสำคัญกับการโหลดเริ่มต้น แต่ให้โปรแกรมทำงานของบริการแคชแคชของแอปพลิเคชันเชลล์เพื่อให้การเข้าชมซ้ำไม่จำเป็นต้องมีการดึงข้อมูล Shell อีกครั้งจากเครือข่าย

  • การโหลดแบบ Lazy Loading หรือการโหลดอยู่เบื้องหลังจะเสร็จสิ้นทุกอย่าง ตัวเลือกที่ดีอย่างหนึ่งคือการใช้การแคชแบบอ่านผ่านสำหรับเนื้อหาแบบไดนามิก

  • ใช้เครื่องมือโปรแกรมทำงานของบริการ เช่น sw-precache เช่น เพื่อแคชและอัปเดตโปรแกรมทำงานของบริการที่จัดการเนื้อหาคงที่ได้อย่างน่าเชื่อถือ (ดูเพิ่มเติมเกี่ยวกับ sw-precache ในภายหลัง)

เพื่อให้บรรลุเป้าหมายนี้

  • เซิร์ฟเวอร์จะส่งเนื้อหา HTML ที่ไคลเอ็นต์สามารถแสดงและใช้ส่วนหัวการหมดอายุของแคช HTTP ในอนาคตเพื่อพิจารณาเบราว์เซอร์ที่ไม่มีการรองรับโปรแกรมทำงานของบริการ โดยจะแสดงชื่อไฟล์ที่ใช้แฮชเพื่อเปิดใช้ทั้ง "การกำหนดเวอร์ชัน" และการอัปเดตที่ง่ายดายในภายหลังในวงจรของแอปพลิเคชัน

  • หน้าเว็บจะมีรูปแบบ CSS ในบรรทัดในแท็ก <style> ภายในเอกสาร <head> เพื่อแสดงผลครั้งแรกของ Application Shell อย่างรวดเร็ว แต่ละหน้าจะโหลด JavaScript ที่จำเป็นสำหรับมุมมองปัจจุบันแบบอะซิงโครนัส เนื่องจาก CSS ไม่สามารถโหลดแบบไม่พร้อมกัน เราจึงสามารถขอสไตล์โดยใช้ JavaScript เป็นแบบไม่พร้อมกัน แทนที่จะใช้โปรแกรมแยกวิเคราะห์และแบบซิงโครนัส นอกจากนี้ เรายังใช้ประโยชน์จาก requestAnimationFrame() เพื่อหลีกเลี่ยงกรณีที่อาจเกิดการพบแคชอย่างรวดเร็วและทำให้สไตล์กลายเป็นส่วนหนึ่งของเส้นทางการแสดงผลวิกฤติโดยไม่ตั้งใจได้ requestAnimationFrame() บังคับให้แสดงผลเฟรมแรกก่อนโหลดรูปแบบ อีกตัวเลือกหนึ่งคือการใช้โปรเจ็กต์ เช่น loadCSS ของ Filament Group เพื่อขอ CSS แบบไม่พร้อมกันโดยใช้ JavaScript

  • Service Worker จะจัดเก็บรายการที่แคชไว้ของ Application Shell เพื่อให้มีการโหลดเชลล์จากแคชของ Service Worker เมื่อมีการเข้าชมซ้ำ เว้นแต่มีอัปเดตบนเครือข่าย

App Shell สำหรับเนื้อหา

การนำไปใช้งานจริง

เราได้เขียนตัวอย่างที่ทำงานอย่างเต็มรูปแบบโดยใช้สถาปัตยกรรม Application Shell, JavaScript vanilla ES2015 สำหรับไคลเอ็นต์ และ Express.js สำหรับเซิร์ฟเวอร์ ไม่มีสิ่งใดที่จะหยุดคุณไม่ให้ใช้สแต็กของคุณเองสำหรับส่วนของไคลเอ็นต์หรือเซิร์ฟเวอร์ (เช่น PHP, Ruby, Python)

วงจรชีวิตของโปรแกรมทำงานของบริการ

สำหรับโปรเจ็กต์ Application Shell เราใช้ sw-precache ซึ่งมีวงจรชีวิตของโปรแกรมทำงานของบริการต่อไปนี้

เหตุการณ์ การดำเนินการ
ติดตั้ง แคช Application Shell และทรัพยากรอื่นๆ ของแอปในหน้าเดียว
เปิดใช้งาน ล้างแคชเก่า
ดึงข้อมูล แสดงเว็บแอปหน้าเว็บเดียวสำหรับ URL และใช้แคชสำหรับเนื้อหาและส่วนที่กำหนดไว้ล่วงหน้า ใช้เครือข่ายสำหรับคำขออื่นๆ

บิตของเซิร์ฟเวอร์

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

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

แผนภาพสถาปัตยกรรม App Shell
  • ปลายทางได้รับการกำหนดไว้สำหรับแอปพลิเคชัน 3 ส่วน ได้แก่ URL ที่แสดงต่อผู้ใช้ (ดัชนี/ไวลด์การ์ด), Application Shell (โปรแกรมทำงานของบริการ) และบางส่วนของ HTML

  • อุปกรณ์ปลายทางแต่ละรายการจะมีตัวควบคุมที่ดึงเลย์เอาต์แฮนเดิลบาร์เข้ามา ซึ่งในทางกลับกันจะดึงบางส่วนของแถบควบคุมและมุมมองออกได้ พูดง่ายๆ ก็คือ บางส่วนคือมุมมองที่ประกอบไปด้วย HTML ที่ถูกคัดลอกลงในหน้าสุดท้าย หมายเหตุ: เฟรมเวิร์ก JavaScript ที่มีการซิงค์ข้อมูลขั้นสูงขึ้นมักจะย้ายไปยังสถาปัตยกรรม Application Shell ได้ง่ายกว่า มีแนวโน้มที่จะใช้การเชื่อมโยงและการซิงค์ข้อมูลมากกว่าบางส่วน

  • ในตอนแรก ระบบจะแสดงหน้าเว็บแบบคงที่ที่มีเนื้อหาให้แก่ผู้ใช้ หน้านี้จะลงทะเบียน Service Worker หากมีการรองรับ ซึ่งจะแคช App Shell และข้อมูลทุกอย่างที่ต้องใช้ (CSS, JS ฯลฯ)

  • จากนั้น App Shell จะทำหน้าที่เป็นเว็บแอปในหน้าเดียวโดยใช้ JavaScript ไปยัง XHR ในเนื้อหาสำหรับ URL ที่เฉพาะเจาะจง การเรียก XHR จะทำไปยังปลายทาง /partials* ซึ่งส่งคืนกลุ่ม HTML, CSS และ JS ขนาดเล็กที่จำเป็นต่อการแสดงเนื้อหานั้น หมายเหตุ: มีหลายวิธีที่จะดำเนินการนี้ และ XHR เป็นเพียงหนึ่งในนั้น บางแอปพลิเคชันจะแทรกในบรรทัดข้อมูล (อาจใช้ JSON) ในการแสดงผลครั้งแรก ดังนั้นจึงไม่ "คงที่" ในแบบ HTML ที่ถูกแยกเป็นหลายรายการ

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

การกำหนดเวอร์ชันของไฟล์

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

  • ให้เครือข่ายก่อนแล้วใช้เวอร์ชันที่แคชไว้

  • เครือข่ายเท่านั้นและล้มเหลวหากออฟไลน์

  • แคชเวอร์ชันเก่าและอัปเดตในภายหลัง

สำหรับตัว Application Shell เอง อาจมีการใช้แนวทางแบบแคชเป็นอันดับแรกสำหรับการตั้งค่าโปรแกรมทำงานของบริการ หากไม่ได้แคช Application Shell แสดงว่าคุณไม่ได้นำสถาปัตยกรรมมาใช้อย่างถูกต้อง

เครื่องมือ

เราดูแลรักษาไลบรารีตัวช่วยของ Service Worker ต่างๆ จำนวนหนึ่ง ซึ่งทำให้ขั้นตอนการแคช Shell ของแอปพลิเคชันล่วงหน้าหรือการจัดการรูปแบบการแคชทั่วไปนั้นทำได้ง่ายขึ้น

ภาพหน้าจอของเว็บไซต์ Service Worker Library ใน Web Fundamentals

ใช้ sw-precache สำหรับ Application Shell ของคุณ

การใช้ sw-precache เพื่อแคช Application Shell ควรจัดการข้อกังวลเกี่ยวกับการแก้ไขไฟล์ คำถามเกี่ยวกับการติดตั้ง/เปิดใช้งาน และสถานการณ์การดึงข้อมูลสำหรับ App Shell วาง sw-precache ลงในกระบวนการบิลด์ของแอปพลิเคชันและใช้ไวลด์การ์ดที่กำหนดค่าได้เพื่อรับทรัพยากรแบบคงที่ แทนที่จะเขียนสคริปต์ Service Worker ด้วยตนเอง ให้ sw-precache สร้างแคชที่จัดการแคชในที่ปลอดภัยและมีประสิทธิภาพโดยใช้ตัวแฮนเดิลสำหรับดึงข้อมูลที่ใช้แคชเป็นหลัก

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

ใช้กล่องเครื่องมือ Sw-tool สำหรับการแคชรันไทม์

ใช้ sw-toolbox สำหรับการแคชรันไทม์ที่มีกลยุทธ์ต่างๆ โดยขึ้นอยู่กับทรัพยากร ดังนี้

  • cacheFirst สำหรับรูปภาพ รวมถึงแคชที่มีชื่อเฉพาะที่มีนโยบายวันหมดอายุที่กำหนดเองเป็น N maxEntries

  • networkFirst หรือเร็วที่สุดสำหรับคำขอ API ขึ้นอยู่กับความใหม่ของเนื้อหาที่ต้องการ ความเร็วสูงสุดอาจช่วยได้ แต่หากมีฟีด API เฉพาะที่อัปเดตบ่อยครั้ง ให้ใช้ networkFirst

บทสรุป

สถาปัตยกรรม Application Shell มีประโยชน์หลายอย่าง แต่เหมาะกับแอปพลิเคชันบางคลาสเท่านั้น โมเดลนี้ยังอายุน้อยและควรประเมินความพยายามและประโยชน์ด้านประสิทธิภาพโดยรวมของสถาปัตยกรรมนี้

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

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

ขอขอบคุณผู้รีวิวของเรา ได้แก่ Jeff Posnick, Paul Lewis, Alex Russell, Seth Thompson, Rob Dodson, Taylor Savage และ Joe Medley