ความท้าทายและวิธีแก้ปัญหาชั่วคราวในการสร้าง Progressive Web App ในเว็บไซต์แบบหลายต้นทาง
เผยแพร่: 19 สิงหาคม 2019
ก่อนหน้านี้การใช้สถาปัตยกรรมแบบหลายต้นทางมีข้อดีบางประการ สำหรับ Progressive Web App แนวทางดังกล่าวมีอุปสรรคมากมาย โดยเฉพาะอย่างยิ่ง Same-Origin Policy จะกำหนดข้อจำกัดในการแชร์สิ่งต่างๆ เช่น Service Worker และแคช สิทธิ์ และการสร้างประสบการณ์การใช้งานแบบสแตนด์อโลนในหลายๆ ต้นทาง
ดูการใช้งานที่เหมาะสมและไม่เหมาะสมของหลายต้นทาง รวมถึงอธิบายความท้าทาย และวิธีแก้ปัญหาในการสร้าง Progressive Web App ในเว็บไซต์แบบหลายต้นทาง
การใช้ต้นทางหลายรายการที่ดีและไม่ดี
เว็บไซต์อาจใช้สถาปัตยกรรมแบบหลายต้นทางด้วยเหตุผลที่ถูกต้องหลายประการ ซึ่งส่วนใหญ่เกี่ยวข้องกับการให้บริการชุดเว็บแอปพลิเคชันอิสระ หรือเพื่อสร้างประสบการณ์ที่แยกออกจากกันโดยสิ้นเชิง นอกจากนี้ ยังมีกรณีการใช้งานที่ควรหลีกเลี่ยงด้วย
ข้อดี
มาดูเหตุผลที่มีประโยชน์กันก่อน
การแปลเป็นภาษาท้องถิ่น / ภาษา: ใช้โดเมนระดับบนสุดที่มีรหัสประเทศเพื่อแยกเว็บไซต์ที่จะแสดงในประเทศต่างๆ (เช่น
https://www.google.com.ar) หรือใช้โดเมนย่อยเพื่อแบ่งเว็บไซต์ที่กำหนดเป้าหมายไปยังสถานที่ต่างๆ (เช่นhttps://newyork.craigslist.org) หรือเพื่อเสนอเนื้อหาสำหรับภาษาใดภาษาหนึ่ง (เช่นhttps://en.wikipedia.org)เว็บแอปอิสระ: การใช้โดเมนย่อยที่แตกต่างกันเพื่อมอบประสบการณ์ที่มีวัตถุประสงค์แตกต่างจากเว็บไซต์ในต้นทางหลักอย่างมาก ตัวอย่างเช่น ในเว็บไซต์ข่าวสาร เว็บแอปปริศนาอักษรไขว้สามารถแสดงจาก
https://crosswords.example.comโดยเจตนา และติดตั้งและใช้เป็น PWA แบบอิสระได้โดยไม่ต้องแชร์ทรัพยากรหรือฟังก์ชันการทำงานกับเว็บไซต์หลัก
ข้อเสีย
หากคุณไม่ได้ทำสิ่งเหล่านี้ การใช้สถาปัตยกรรมแบบหลายต้นทางอาจเป็นข้อเสียเมื่อสร้าง Progressive Web App
อย่างไรก็ตาม เว็บไซต์จำนวนมากยังคงมีโครงสร้างในลักษณะนี้โดยไม่มีเหตุผลเฉพาะ หรือด้วยเหตุผลที่ว่า "สืบทอดมา" ตัวอย่างหนึ่งคือการใช้โดเมนย่อยเพื่อแยกส่วนต่างๆ ของเว็บไซต์โดยพลการ ซึ่งควรเป็นส่วนหนึ่งของประสบการณ์การใช้งานแบบรวม
เช่น เราไม่แนะนำให้ใช้รูปแบบต่อไปนี้
ส่วนของเว็บไซต์: แยกส่วนต่างๆ ของเว็บไซต์ในโดเมนย่อย ในเว็บไซต์ข่าว คุณมักจะเห็นหน้าแรกที่
https://www.example.comส่วนกีฬามักจะอยู่ที่https://sports.example.comการเมืองอยู่ที่https://politics.example.comและอื่นๆ ในกรณีของเว็บไซต์อีคอมเมิร์ซ ให้ใช้สิ่งต่างๆ เช่นhttps://category.example.comสำหรับหมวดหมู่ผลิตภัณฑ์https://product.example.comสำหรับหน้าผลิตภัณฑ์ เป็นต้นโฟลว์ของผู้ใช้: อีกแนวทางที่ไม่แนะนำคือการแยกส่วนเล็กๆ ต่างๆ ของเว็บไซต์ เช่น หน้าสำหรับโฟลว์การเข้าสู่ระบบหรือการซื้อในโดเมนย่อย เช่น ใช้
https://login.example.comและhttps://checkout.example.com
ในกรณีที่ย้ายข้อมูลไปยังต้นทางเดียวไม่ได้ สิ่งที่ตามมาคือรายการความท้าทายและ (หากเป็นไปได้) วิธีแก้ปัญหาโดยอ้อมที่อาจนำมาพิจารณาเมื่อสร้าง Progressive Web App
ความท้าทายและวิธีแก้ปัญหาสำหรับ PWA ในต้นทางต่างๆ
การสร้างเว็บไซต์ในหลายต้นทางเป็นเรื่องท้าทายในการมอบประสบการณ์ PWA ที่เป็นหนึ่งเดียวกัน ส่วนใหญ่เป็นเพราะนโยบายต้นทางเดียวกันซึ่งกำหนดข้อจำกัดหลายอย่าง มาดูแต่ละข้อกัน
Service Worker
ต้นทางของ URL สคริปต์ Service Worker ต้องเหมือนกับต้นทางของหน้าที่เรียก register() ซึ่งหมายความว่า เช่น หน้าเว็บที่ https://www.example.com จะเรียก register() ที่มี URL ของ Service Worker ที่ https://section.example.com ไม่ได้
อีกสิ่งที่ควรพิจารณาคือ Service Worker จะควบคุมได้เฉพาะหน้าที่โฮสต์ภายใต้ต้นทางและเส้นทางที่ Service Worker นั้นเป็นของ ซึ่งหมายความว่าหากโฮสต์ Service Worker ที่ https://www.example.com จะควบคุมได้เฉพาะ URL จากต้นทางนั้น (ตามเส้นทางที่กำหนดไว้ในพารามิเตอร์ขอบเขต) แต่จะไม่ควบคุมหน้าเว็บใดๆ ในโดเมนย่อยอื่นๆ เช่น หน้าเว็บใน https://section.example.com
ในกรณีนี้ วิธีแก้ปัญหาเดียวคือการใช้ Service Worker หลายรายการ (รายการละ 1 ต้นทาง)
กำลังแคช
นอกจากนี้ ออบเจ็กต์แคช, IndexedDB และ localStorage ยังจำกัดไว้ที่ต้นทางเดียวด้วย ซึ่งหมายความว่าคุณจะเข้าถึงแคชที่เป็นของ https://www.example.com ไม่ได้ เช่น จาก https://www.section.example.com
ต่อไปนี้คือสิ่งที่คุณทำได้เพื่อจัดการแคชอย่างเหมาะสมในสถานการณ์เช่นนี้
ใช้ประโยชน์จากการแคชของเบราว์เซอร์: เราขอแนะนำให้ใช้แนวทางปฏิบัติแนะนำเกี่ยวกับการแคชของเบราว์เซอร์แบบเดิมเสมอ เทคนิคนี้มีประโยชน์เพิ่มเติมคือการนำทรัพยากรที่แคชไว้กลับมาใช้ซ้ำในหลายต้นทาง ซึ่งทำไม่ได้ด้วยแคชของ Service Worker ดูแนวทางปฏิบัติแนะนำเกี่ยวกับวิธีใช้แคช HTTP กับ Service Worker ได้ที่โพสต์นี้
ทำให้การติดตั้ง Service Worker มีขนาดเล็ก: หากคุณดูแล Service Worker หลายรายการ ให้หลีกเลี่ยงการทำให้ผู้ใช้ต้องเสียค่าใช้จ่ายในการติดตั้งจำนวนมากทุกครั้งที่ไปยังต้นทางใหม่ กล่าวคือ แคชล่วงหน้าเฉพาะทรัพยากรที่จำเป็นจริงๆ เท่านั้น
สิทธิ์
นอกจากนี้ สิทธิ์ยังมีขอบเขตเป็นต้นทางด้วย ซึ่งหมายความว่าหากผู้ใช้ให้สิทธิ์ที่เฉพาะเจาะจงแก่ต้นทาง https://section.example.com สิทธิ์ดังกล่าวจะไม่ส่งต่อไปยังต้นทางอื่นๆ เช่น https://www.example.com
เนื่องจากไม่มีวิธีแชร์สิทธิ์ในแหล่งที่มาต่างๆ โซลูชันเดียวในที่นี้คือการขอสิทธิ์ในแต่ละโดเมนย่อยที่ต้องใช้ฟีเจอร์หนึ่งๆ (เช่น ตำแหน่ง) สำหรับสิ่งต่างๆ เช่น การแจ้งเตือนแบบพุชบนเว็บ คุณสามารถเก็บคุกกี้ไว้เพื่อติดตามว่าผู้ใช้ยอมรับสิทธิ์ในโดเมนย่อยอื่นหรือไม่ เพื่อหลีกเลี่ยงการขอสิทธิ์อีกครั้ง
การติดตั้ง
หากต้องการติดตั้ง PWA ต้นทางแต่ละรายการต้องมีไฟล์ Manifest ของตัวเองที่มี start_url ซึ่งสัมพันธ์กับตัวมันเอง ซึ่งหมายความว่าผู้ใช้ที่ได้รับข้อความแจ้งให้ติดตั้งในต้นทางหนึ่ง (เช่น https://section.example.com) จะติดตั้ง PWA ที่มี start_url ในต้นทางอื่น (เช่น https://www.example.com) ไม่ได้
กล่าวอีกนัยหนึ่งคือ ผู้ใช้ที่ได้รับข้อความแจ้งให้ติดตั้งในโดเมนย่อยจะติดตั้ง PWA สำหรับหน้าย่อยได้เท่านั้น ไม่ใช่สำหรับ URL หลักของแอป
นอกจากนี้ ยังมีปัญหาที่ผู้ใช้รายเดียวกันอาจได้รับการแจ้งให้ติดตั้งหลายครั้งเมื่อไปยังส่วนต่างๆ ของเว็บไซต์ หากแต่ละโดเมนย่อยเป็นไปตามเกณฑ์การติดตั้ง และแจ้งให้ผู้ใช้ติดตั้ง PWA
หากต้องการลดปัญหานี้ คุณสามารถตรวจสอบว่าข้อความแจ้งจะแสดงเฉพาะในต้นทางหลักเท่านั้น เมื่อผู้ใช้เข้าชมโดเมนย่อยที่ผ่านเกณฑ์การติดตั้ง
- ฟังเหตุการณ์
beforeinstallprompt - ป้องกันไม่ให้ข้อความแจ้งปรากฏโดยการเรียกใช้
event.preventDefault()
วิธีนี้จะช่วยให้คุณมั่นใจได้ว่าพรอมต์จะไม่แสดงในส่วนที่ไม่ต้องการของเว็บไซต์ ในขณะที่คุณยังคงแสดงพรอมต์ได้ เช่น ในต้นทางหลัก (เช่น หน้าแรก)
โหมดสแตนด์อโลน
ขณะไปยังส่วนต่างๆ ในหน้าต่างแบบสแตนด์อโลน เบราว์เซอร์จะทำงานแตกต่างออกไปเมื่อผู้ใช้ออกนอกขอบเขตที่กำหนดโดยไฟล์ Manifest ของ PWA ลักษณะการทำงานจะขึ้นอยู่กับเวอร์ชันและผู้ให้บริการของเบราว์เซอร์แต่ละราย เช่น Chrome เวอร์ชันล่าสุดจะเปิด Chrome Custom Tab เมื่อผู้ใช้ออกจากขอบเขตในโหมดสแตนด์อโลน
ในกรณีส่วนใหญ่ ปัญหานี้ไม่มีวิธีแก้ แต่คุณสามารถใช้ทางอ้อมกับประสบการณ์การใช้งานบางส่วนที่โฮสต์อยู่ในโดเมนย่อยได้ (เช่น เวิร์กโฟลว์การเข้าสู่ระบบ) โดยทำดังนี้
- URL ใหม่
https://login.example.comอาจเปิดภายใน iframe แบบเต็มหน้าจอ - เมื่อดำเนินการใน iframe เสร็จแล้ว (เช่น กระบวนการเข้าสู่ระบบ) คุณจะใช้ postMessage() เพื่อส่งข้อมูลที่ได้จาก iframe กลับไปยังหน้าหลักได้
- ขั้นตอนสุดท้ายคือเมื่อหน้าหลักได้รับข้อความแล้ว คุณจะยกเลิกการลงทะเบียน Listener และนำ iframe ออกจาก DOM ได้
บทสรุป
นโยบายต้นทางเดียวกันกำหนดข้อจำกัดมากมายสำหรับเว็บไซต์ที่สร้างขึ้นบนต้นทางหลายรายการซึ่งต้องการมอบประสบการณ์ PWA ที่สอดคล้องกัน ด้วยเหตุนี้ เราจึงขอแนะนำอย่างยิ่งไม่ให้แบ่งเว็บไซต์ออกเป็นต้นทางต่างๆ เพื่อมอบประสบการณ์ที่ดีที่สุดแก่ผู้ใช้
สำหรับเว็บไซต์ที่มีอยู่ซึ่งสร้างด้วยวิธีนี้ การทำให้ PWA แบบหลายต้นทางทำงานได้อย่างถูกต้องอาจเป็นเรื่องท้าทาย แต่เราได้สำรวจวิธีแก้ปัญหาที่เป็นไปได้บางอย่างแล้ว แต่ละวิธีอาจมีข้อดีข้อเสียแตกต่างกันไป ดังนั้นโปรดใช้วิจารณญาณในการตัดสินใจเลือกแนวทางที่จะใช้ในเว็บไซต์
เมื่อประเมินกลยุทธ์ระยะยาวหรือการปรับโฉมเว็บไซต์ ให้พิจารณาการย้ายข้อมูลไปยังต้นทางเดียว เว้นแต่จะมีเหตุผลสำคัญที่ต้องรักษาสถาปัตยกรรมแบบหลายต้นทางไว้
ขอขอบคุณ Penny Mclachlan, Paul Covell, Dominick Ng, Alberto Medina, Pete LePage, Joe Medley, Cheney Tsai, Martin Schierle และ Andre Bandarra เป็นอย่างยิ่งสำหรับคำแนะนำและการตรวจสอบทางเทคนิค