แอปพลิเคชั่นหน้าเดียว: ข้อดีและข้อเสีย [ปิด]


203

ฉันเคยอ่านเกี่ยวกับสปาและข้อดีแล้ว ฉันพบว่าพวกเขาส่วนใหญ่ไม่มั่นใจ มี 3 ข้อได้เปรียบที่กระตุ้นความสงสัยของฉัน

คำถาม: คุณสามารถทำหน้าที่เป็นผู้สนับสนุนของ SPA และพิสูจน์ได้ว่าฉันผิดเกี่ยวกับสามข้อความแรก?

                              === ADVANTAGES ===

1. SPA นั้นดีมากสำหรับเว็บไซต์ที่ตอบสนองได้ดีมาก:

การเรนเดอร์ฝั่งเซิร์ฟเวอร์นั้นยากที่จะนำไปใช้กับสถานะกลางทั้งหมด - สถานะมุมมองขนาดเล็กไม่ได้จับคู่กับ URL ได้ดี

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

เกิดอะไรขึ้นกับการถือเลเยอร์โมเดลสำหรับผู้ที่ไม่ใช่สปา SPA เป็นสถาปัตยกรรมที่เข้ากันได้กับ MVC เพียงด้านเดียวหรือไม่

2. ด้วย SPA เราไม่จำเป็นต้องใช้ข้อความค้นหาพิเศษไปยังเซิร์ฟเวอร์เพื่อดาวน์โหลดหน้าต่างๆ

ฮะและผู้ใช้สามารถดาวน์โหลดได้กี่หน้าในระหว่างการเยี่ยมชมเว็บไซต์ของคุณ สองสาม? มีปัญหาด้านความปลอดภัยอื่นปรากฏขึ้นและคุณต้องแยกหน้าเข้าสู่ระบบหน้าผู้ดูแลระบบ ฯลฯ ออกเป็นหน้าอื่น ๆ ในทางกลับกันมันขัดแย้งกับสถาปัตยกรรม SPA

3. อาจเป็นข้อได้เปรียบอื่น ๆ ? ไม่ได้ยินเรื่องอื่นเลย ..

                            === DISADVANTAGES ===
  1. ลูกค้าจะต้องเปิดใช้งานจาวาสคริปต์
  2. เพียงหนึ่งจุดเข้าสู่ไซต์
  3. ความปลอดภัย

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


1
2. และ 3. ไม่ใช่ปัญหา
Wiktor Zychla

1
ฉันขอแนะนำว่าแทนที่จะอ่านเกี่ยวกับสปาคุณสามารถใช้เวลาเล่นกับกรอบจริงเช่น extjs เวลาที่นั่นจะชำระและคุณจะสามารถตอบคำถามของคุณเอง
Wiktor Zychla

3
@WiktorZychla ฉันทำงานในโครงการสปา ฉันใช้ JQuery + Backbone ฉันยังเขียนไซต์ JSP ด้วย ฉันไม่สามารถตอบคำถามเหล่านั้น คุณสามารถ?
VB_

3
@VolodymyrBakhmatiuk: ไม่เป็นไรสิ่งที่ผู้ใช้สามารถประนีประนอมได้คือกุยไม่ใช่ข้อมูลเพราะข้อมูลได้รับการปกป้องที่ฝั่งเซิร์ฟเวอร์
Wiktor Zychla

4
เกิดอะไรขึ้นถ้าคำถามนี้เป็นไปตามความคิดเห็น ฉันมักจะสงสัยว่าทำไมและเมื่อใดที่ฉันควรจะเขียนสปา มันจะเป็นประโยชน์หากอนุญาตให้ใช้คำถาม Pros และ Cons ได้เช่นกัน
Anurag Awasthi

คำตอบ:


144

มาดูหนึ่งในไซต์สปาที่ได้รับความนิยมมากที่สุดของ GMail

1. SPA นั้นดีมากสำหรับเว็บไซต์ที่ตอบสนองได้ดีมาก:

การแสดงผลด้านเซิร์ฟเวอร์เป็นไม่ยากอย่างที่มันเคยเป็นด้วยเทคนิคง่ายๆเช่นการรักษา #hash ใน URL หรือเมื่อเร็ว ๆ นี้HTML5 pushStateด้วยวิธีนี้สถานะที่แน่นอนของแอปพลิเคชันเว็บจะถูกฝังใน URL ของหน้า เช่นเดียวกับใน GMail ทุกครั้งที่คุณเปิดเมลแท็กแฮชพิเศษจะถูกเพิ่มเข้าไปใน URL หากคัดลอกและวางไปที่หน้าต่างเบราว์เซอร์อื่นสามารถเปิดอีเมลเดียวกันได้ (หากพวกเขาสามารถรับรองความถูกต้อง) วิธีการนี้แมปโดยตรงกับสายอักขระแบบสอบถามแบบดั้งเดิมมากขึ้นความแตกต่างเป็นเพียงการดำเนินการ ด้วย HTML5 pushState () คุณสามารถกำจัด#hashและใช้ URL คลาสสิกอย่างสมบูรณ์ซึ่งสามารถแก้ไขได้บนเซิร์ฟเวอร์ในคำขอแรกจากนั้นโหลดผ่าน ajax ในคำขอถัดไป

2. ด้วย SPA เราไม่จำเป็นต้องใช้ข้อความค้นหาพิเศษไปยังเซิร์ฟเวอร์เพื่อดาวน์โหลดหน้าต่างๆ

จำนวนหน้าที่ผู้ใช้ดาวน์โหลดระหว่างการเยี่ยมชมเว็บไซต์ของฉัน จริงๆแล้วมีกี่เมล์ที่อ่านเมื่อเขา / เธอเปิดบัญชีเมล์ของเขา / เธอ ฉันอ่าน> 50 ครั้งเดียว ตอนนี้โครงสร้างของอีเมลก็เกือบจะเหมือนกัน หากคุณจะใช้รูปแบบการเรนเดอร์ฝั่งเซิร์ฟเวอร์เซิร์ฟเวอร์จะทำการเรนเดอร์มันในทุกคำร้องขอ (กรณีทั่วไป) - ความกังวลด้านความปลอดภัย - คุณควร / ไม่ควรแยกหน้าสำหรับผู้ดูแลระบบ / การเข้าสู่ระบบที่ขึ้นอยู่กับโครงสร้างของเว็บไซต์ของคุณที่จะใช้ paytm.com เช่นกันการทำเว็บไซต์ SPA ไม่ได้หมายความว่าคุณเปิดจุดสิ้นสุดทั้งหมดสำหรับทุก ผู้ใช้ฉันหมายถึงฉันใช้แบบฟอร์มรับรองความถูกต้องกับเว็บไซต์สปาของฉัน - ในเฟรมเวิร์ก SPA ที่มีการใช้งานมากที่สุด Angular JS ผู้พัฒนาสามารถโหลดทั้ง html temple จากเว็บไซต์เพื่อให้สามารถทำได้ขึ้นอยู่กับระดับการพิสูจน์ตัวตนของผู้ใช้ การโหลด html ล่วงหน้าสำหรับทุกประเภทการรับรองความถูกต้อง '

3. อาจมีข้อได้เปรียบอื่น ๆ ? ไม่ได้ยินเรื่องอื่นเลย ..

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

ข้อดีที่ฉันคิดได้คือ:

  1. การแสดงผล html เห็นได้ชัดว่าต้องใช้ทรัพยากรบางอย่างในขณะนี้ผู้ใช้ทุกคนที่เยี่ยมชมไซต์ของคุณกำลังทำสิ่งนี้อยู่ นอกจากนี้ยังไม่เพียง แต่การเรนเดอร์หลักเท่านั้นที่ทำในฝั่งไคลเอ็นต์แทนที่จะเป็นฝั่งเซิร์ฟเวอร์
  2. ปัญหาเวลาวันที่ - ฉันแค่ให้เวลา UTC กับลูกค้าเป็นรูปแบบที่กำหนดไว้ล่วงหน้าและไม่สนใจเกี่ยวกับเขตเวลาที่ฉันปล่อยให้จาวาสคริปต์จัดการ นี่เป็นข้อได้เปรียบที่ดีมากที่ฉันต้องเดาโซนเวลาตามสถานที่ที่ได้รับจากผู้ใช้ IP
  3. สำหรับฉันแล้วรัฐได้รับการดูแลเป็นอย่างดีใน SPA เพราะเมื่อคุณตั้งค่าตัวแปรแล้วคุณจะรู้ว่ามันจะอยู่ที่นั่น สิ่งนี้ให้ความรู้สึกในการพัฒนาแอพมากกว่าหน้าเว็บ สิ่งนี้ช่วยได้มากในการทำเว็บไซต์เช่น foodpanda, flipkart, amazon เพราะถ้าคุณไม่ได้ใช้สถานะฝั่งไคลเอ็นต์คุณกำลังใช้เซสชันราคาแพง
  4. เว็บไซต์มีการตอบสนองอย่างมาก - ฉันจะยกตัวอย่างมากสำหรับการลองทำเครื่องคิดเลขในเว็บไซต์ที่ไม่ใช่สปา (ฉันรู้ว่ามันแปลก)

อัปเดตจากความคิดเห็น

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

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


4
ดีสำหรับคุณในการทำให้ชุมชนนี้เป็นคำตอบของ Wiki :) นอกจากนี้ยังเป็นจุดที่ยอดเยี่ยม
Jason Sperske

@Parv Sharma อธิบายให้กว้างยิ่งขึ้นว่าทำไมการรักษาสถานะจึงสามารถใช้กับ SPA ได้มากกว่า
VB_

4
คุณไม่สามารถสร้างดัชนีหน้าเพื่อเพิ่มประสิทธิภาพ SEO ด้วย SPA ได้อย่างง่ายดาย
Ankit_Shah55

2
@ Ankit_Shah55 สิ่งนี้อาจไม่เป็นจริงอีกต่อไป (อย่างน้อยสำหรับ google ซึ่งเป็นเจ้าของส่วนแบ่งการตลาดของเครื่องมือค้นหาส่วนใหญ่) ดูที่ "การยกเลิก AJAX การรวบรวมข้อมูลของเรา" จาก Google ความเข้าใจของฉันคือคุณไม่ต้องทำอะไรเป็นพิเศษสำหรับ Google เพื่อสร้างดัชนีสปาของคุณอีกต่อไป ฉันคิดว่าคุณจะต้องให้การสนับสนุน pushstate อย่างไรก็ตามเนื่องจากฉันไม่คิดว่าชิ้นส่วนแฮชดัชนีของ Google
เควินล้อ

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

66

ฉันเป็นนักปฏิบัติดังนั้นฉันจะพยายามมองเรื่องนี้ในแง่ของต้นทุนและผลประโยชน์

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

ข้อดี

  • การติดตามสถานะที่ง่ายขึ้น - ไม่จำเป็นต้องใช้คุกกี้, การส่งแบบฟอร์ม, ที่จัดเก็บในตัวเครื่อง, ที่เก็บข้อมูลเซสชันและอื่น ๆ เพื่อจดจำสถานะระหว่างการโหลด 2 หน้า
  • เนื้อหาจานหม้อไอน้ำที่อยู่ในทุกหน้า (ส่วนหัวส่วนท้ายโลโก้แบนเนอร์ลิขสิทธิ์ ฯลฯ ) โหลดเพียงครั้งเดียวต่อเซสชันเบราว์เซอร์ทั่วไป
  • ไม่มีค่าเวลาแฝงในการสลับ "เพจ"

ข้อเสีย

  • การตรวจสอบประสิทธิภาพ - มือที่เชื่อมโยงกัน: โซลูชันการตรวจสอบประสิทธิภาพระดับเบราว์เซอร์ส่วนใหญ่ที่ฉันเห็นมุ่งเน้นเฉพาะเวลาโหลดหน้าเว็บเท่านั้นเช่นเวลาถึงไบต์แรกเวลาในการสร้าง DOM, การเดินทางไปกลับรอบเครือข่ายสำหรับ HTML, กิจกรรม onload เป็นต้น post-load ผ่าน AJAX จะไม่ถูกวัด มีวิธีแก้ไขที่ให้คุณใช้รหัสของคุณในการบันทึกการวัดที่ชัดเจนเช่นเมื่อคลิกลิงก์เริ่มตัวจับเวลาจากนั้นสิ้นสุดตัวจับเวลาหลังจากแสดงผลลัพธ์ AJAX และส่งข้อเสนอแนะนั้น ตัวอย่างเช่น New Relic รองรับฟังก์ชั่นนี้ ด้วยการใช้สปาคุณได้ผูกติดกับเครื่องมือที่เป็นไปได้เพียงไม่กี่อย่าง
  • การทดสอบความปลอดภัย / การเจาะระบบ - การเชื่อมโยงมือ: การสแกนความปลอดภัยอัตโนมัติอาจมีปัญหาในการค้นหาลิงก์เมื่อเพจทั้งหมดของคุณถูกสร้างขึ้นแบบไดนามิกโดยกรอบงาน SPA อาจมีวิธีแก้ไขปัญหานี้ แต่คุณ จำกัด ตัวเองอีกครั้ง
  • Bundling: ง่ายต่อการรับสถานการณ์เมื่อคุณดาวน์โหลดรหัสทั้งหมดที่จำเป็นสำหรับเว็บไซต์ทั้งหมดในการโหลดหน้าแรกซึ่งสามารถทำงานได้อย่างมากสำหรับการเชื่อมต่อที่มีแบนด์วิดท์ต่ำ คุณสามารถรวมไฟล์ JavaScript และ CSS ของคุณเพื่อพยายามโหลดชิ้นงานที่เป็นธรรมชาติมากขึ้นในขณะที่คุณไป แต่ตอนนี้คุณต้องดูแลการจับคู่นั้นและดูไฟล์ที่ไม่ตั้งใจเพื่อดึงผ่านการอ้างอิงที่ไม่เกิดขึ้นจริง (เพิ่งเกิดขึ้นกับฉัน) อีกครั้งแก้ไขได้ แต่มีค่าใช้จ่าย
  • การปรับโครงสร้างบิกแบงใหม่: หากคุณต้องการเปลี่ยนแปลงสถาปัตยกรรมที่สำคัญเช่นพูดเปลี่ยนจากกรอบหนึ่งไปอีกกรอบหนึ่งเพื่อลดความเสี่ยงมันเป็นสิ่งที่พึงปรารถนาที่จะทำการเปลี่ยนแปลงเพิ่มเติม นั่นคือเริ่มต้นใช้งานใหม่โยกย้ายบนพื้นฐานเช่นต่อหน้าต่อคุณสมบัติ ฯลฯ แล้วปล่อยเก่าหลัง ด้วยแอพหลายหน้าแบบดั้งเดิมคุณสามารถสลับหนึ่งหน้าจาก Angular เป็น React จากนั้นสลับหน้าอื่นในการวิ่งครั้งต่อไป ด้วยสปามันทั้งหมดหรือเปล่า หากคุณต้องการเปลี่ยนคุณต้องเปลี่ยนแอปพลิเคชันทั้งหมดในครั้งเดียว
  • ความซับซ้อนของการนำทาง: มีการใช้เครื่องมือเพื่อช่วยรักษาบริบทการนำทางใน SPA ของเช่น history.js, Angular 2 ซึ่งส่วนใหญ่อาศัยเฟรมเวิร์ก URL (#) หรือ API ประวัติที่ใหม่กว่า หากทุกหน้าเป็นหน้าแยกกันคุณไม่จำเป็นต้องทำอะไรเลย
  • ความซับซ้อนของการหารหัส: โดยปกติเราคิดว่าเว็บไซต์เป็นหน้าเว็บ แอพที่มีหลายหน้ามักจะแบ่งพาร์ติชันโค้ดตามหน้าซึ่งช่วยบำรุงรักษา

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


2
ฉันคิดว่าการตอบสนองนี้ให้ผลตอบรับที่ถูกต้องมากจากคนที่สร้างระบบที่ซับซ้อนขนาดใหญ่และประสบกับความสูญเสียในระยะยาวที่ SPA นำมา (หรือดูเหมือนว่าเป็นเช่นนั้น)
DanielCuadra

4
สิ่งที่ฉันได้รับจากคำตอบนี้คือหลีกเลี่ยงสปาหากคุณกำลังทำอะไรแม้แต่อย่างจริงจังจากระยะไกล
IvanP

ฉันคิดว่าคุณให้ภาพรวมที่เป็นประโยชน์แก่คุณมากกว่าเพียงแค่ตอบ ในทางปฏิบัติจริง ๆ
Hos Mercury

3
ฉันเห็นด้วย. สปาดูดีมากเมื่อเราพิสูจน์แนวคิด 3 ปีข้างถนนตอนนี้เราได้เห็นทุกปัญหาที่กล่าวถึงในคำตอบนี้และเรายังคงใช้เวลามากในการพยายามแก้ปัญหา การเปลี่ยนแปลงกรอบงานไม่ใช่ตัวเลือกอีกต่อไปและเราติดอยู่กับกรอบงานที่หยุดการพัฒนาโดยทั่วไป
Qi Fan

1
ฉันได้รับคะแนนข้อเสีย 4 รายการสุดท้ายโดยตรง ฉันได้สร้างแอพพลิเคชั่นเว็บ 10K LOC โดยใช้ Angular, Bootstrap & PHP ในฐานะผู้เล่นหลักที่มีโค้ด Angular JS ประมาณ 5K มีคุณสมบัติบางอย่างที่ประณีตของ Angular แต่ ณ จุดนี้ฉันหวังว่าฉันจะใช้วิธีการตามหน้าดั้งเดิมและฉันคิดว่ามันจะเร่งการพัฒนาเว็บไซต์อย่างมีนัยสำคัญ
Zack Macomber

41

ข้อเสีย

1. ลูกค้าจะต้องเปิดใช้งานจาวาสคริปต์ ใช่นี่เป็นข้อเสียที่ชัดเจนของ SPA ในกรณีของฉันฉันรู้ว่าฉันสามารถคาดหวังให้ผู้ใช้ของฉันเปิดใช้งาน JavaScript ถ้าคุณทำไม่ได้คุณจะทำสปาไม่ได้ นั่นเหมือนกับการพยายามปรับใช้แอป. NET กับเครื่องที่ไม่ได้ติดตั้ง. NET Framework

2. จุดเข้าสู่ไซต์เพียงจุดเดียว ผมแก้ปัญหานี้โดยใช้SammyJS 2-3 วันของการทำงานเพื่อให้การตั้งค่าการกำหนดเส้นทางของคุณถูกต้องและผู้คนจะสามารถสร้างที่คั่นหน้าลึกลงในแอปของคุณที่ทำงานอย่างถูกต้อง เซิร์ฟเวอร์ของคุณจะต้องเปิดเผยจุดปลายเดียว - จุดสิ้นสุด "ให้ HTML + CSS + JS สำหรับแอปนี้" แก่ฉัน (คิดว่าเป็นตำแหน่งดาวน์โหลด / อัปเดตสำหรับแอปพลิเคชันที่เตรียมไว้ล่วงหน้า) - และ JavaScript ฝั่งไคลเอ็นต์ที่คุณเขียนจะ จัดการรายการจริงลงในแอปพลิเคชัน

3. ความปลอดภัยปัญหานี้ไม่ได้มีเฉพาะใน SPAs คุณต้องจัดการกับความปลอดภัยในลักษณะเดียวกับเมื่อคุณมีแอพไคลเอ็นต์เซิร์ฟเวอร์ "โรงเรียนเก่า" (รุ่น HATEOAS ของการใช้ Hypertext เพื่อเชื่อมโยงระหว่างหน้า) เป็นเพียงว่าผู้ใช้กำลังร้องขอมากกว่า JavaScript ของคุณและผลลัพธ์เป็น HTML แทนที่จะเป็น JSON หรือบางรูปแบบข้อมูล ในแอพที่ไม่ใช่สปาคุณต้องรักษาความปลอดภัยของแต่ละหน้าบนเซิร์ฟเวอร์ในขณะที่ในแอพสปาคุณต้องรักษาความปลอดภัยจุดปลายข้อมูล (และหากคุณไม่ต้องการให้ไคลเอ็นต์ของคุณเข้าถึงรหัสทั้งหมดคุณต้องแยกจาวาสคริปต์ที่ดาวน์โหลดได้ออกเป็นส่วนต่าง ๆ ด้วยฉันแค่ผูกมันลงใน SammyJS-based routing ของเราเพื่อให้เบราว์เซอร์ร้องขอเท่านั้น สิ่งที่ลูกค้ารู้ว่าควรเข้าถึงโดยขึ้นอยู่กับภาระเริ่มต้นของบทบาทของผู้ใช้

ข้อดี

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

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

  3. ความยืดหยุ่นในการออกแบบ UI ของคุณอาจเป็นข้อได้เปรียบที่สำคัญอื่น ๆ ที่ฉันได้พบ เมื่อฉันกำหนด API ของฉัน (ด้วย SDK ใน JavaScript) ฉันสามารถเขียนส่วนหน้าของฉันใหม่โดยไม่มีผลกระทบกับเซิร์ฟเวอร์นอกเหนือจากไฟล์ทรัพยากรคงที่บางตัว ลองทำด้วยแอป MVC แบบดั้งเดิม! :) (สิ่งนี้จะมีค่าเมื่อคุณมีการปรับใช้แบบสดและความสอดคล้องของ API ที่คุณกังวล)

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


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

7
3. เป็นเรื่องง่ายเหมือนในแอป MVC แบบดั้งเดิม หากคุณทำงานด้วยข้อมูลเดียวกันคุณเพียงแค่ทำการเปลี่ยนแปลงในส่วน V (มุมมอง) ของแอปของคุณ นี่เป็นเทมเพลต css และ js
karantan

เวอร์ชันของ SPA สามารถมีลิงก์ไปยังคำถามแต่ละข้อที่จะแบ่งปันหรือจะมีข้อดีและข้อเสียอะไรบ้างยกตัวอย่างเช่นในแง่ของ SEO (ความสามารถในการค้นหาคำถามที่ผ่านมาจากเครื่องมือค้นหา)
Selçuk

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

29

ข้อเสียอย่างหนึ่งที่สำคัญของ SPA - SEO เฉพาะเมื่อเร็ว ๆ นี้ Google และ Bing เริ่มทำดัชนีหน้าเว็บที่ใช้ Ajax โดยการเรียกใช้ JavaScript ในระหว่างการรวบรวมข้อมูลและยังมีหลายกรณีที่หน้าถูกทำดัชนีไม่ถูกต้อง

ในขณะที่การพัฒนา SPA คุณจะถูกบังคับให้จัดการกับปัญหา SEO ซึ่งอาจเกิดจากการแสดงผลเว็บไซต์ทั้งหมดของคุณและสร้างสแนปชอต html แบบคงที่เพื่อการใช้งานของโปรแกรมรวบรวมข้อมูล นี้จะต้องมีการลงทุนที่มั่นคงในโครงสร้างพื้นฐานที่เหมาะสม

อัปเดต 19.06.16:

นับตั้งแต่ที่เขียนคำตอบนี้เมื่อไม่นานมานี้ฉันได้รับประสบการณ์มากขึ้นกับแอพ Single Page (เช่น AngularJS 1.x) - ดังนั้นฉันจึงมีข้อมูลเพิ่มเติมที่จะแบ่งปัน

ในความคิดของฉันข้อเสียเปรียบหลักของแอปพลิเคชัน SPA คือ SEO ทำให้พวกเขา จำกัด เฉพาะแอป "แดชบอร์ด" เท่านั้น นอกจากนี้คุณจะมีช่วงเวลาที่ยากขึ้นในการแคชเมื่อเทียบกับโซลูชั่นแบบดั้งเดิม ตัวอย่างเช่นในการแคช ASP.NET ทำได้ง่ายมากเพียงแค่เปิด OutputCaching และคุณทำได้ดี: เพจ HTML ทั้งหมดจะถูกแคชตาม URL (หรือพารามิเตอร์อื่น ๆ ) อย่างไรก็ตามใน SPA คุณจะต้องจัดการแคชด้วยตนเอง (โดยใช้วิธีแก้ปัญหาบางอย่างเช่นแคชระดับที่สองแคชแม่แบบและอื่น ๆ )


SEO ดีกว่าหรือไม่ที่จะมีปริมาณการใช้งานที่ถูกส่งต่อไปยังหน้าเว็บเดียวและกระจายไปทั่วหน้าเว็บสองหน้า?
เงียบ

@SILENT - ไม่แน่ใจ แต่เนื่องจากทุกหน้าในโดเมนเดียวกันฉันไม่คิดว่าควรจะมีความแตกต่าง
Illidan

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

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

12

ฉันต้องการทำให้กรณีสำหรับ SPA ดีที่สุดสำหรับแอปพลิเคชันที่ขับเคลื่อนด้วยข้อมูล แน่นอนว่า gmail นั้นเกี่ยวกับข้อมูลและเป็นตัวเลือกที่ดีสำหรับสปา

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

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

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

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


1
หลังจากหลายปีของการพัฒนาเว็บนั่นคือสิ่งที่ฉันสามารถยืนยันได้ คุณควรผสมแอปทั้งสปาและ mvc เข้าด้วยกัน คุณไม่สามารถมีคำตอบทั้งหรือ ฉันมีแอปทั้งหมดของฉันเป็นสปาก่อนพบว่าแอปของฉันไม่ได้อยู่ในรายการอย่างถูกต้องโดย google ดังนั้นฉันจึงย้ายไปที่ mpa และใช้สปาเฉพาะในสถานการณ์ที่จำเป็นเท่านั้น WordPress ยังไม่ได้เป็นสปาและกรอบที่เป็นที่นิยมด้วยเหตุผลที่ดี
Rudolf Schmidt

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

8

สำหรับ บริษัท เช่น google, amazon และอื่น ๆ ที่เซิร์ฟเวอร์ทำงานด้วยความจุสูงสุดในโหมด 24/7 ลดการรับส่งข้อมูลหมายถึงเงินจริง - ฮาร์ดแวร์น้อยกว่าพลังงานน้อยกว่าการบำรุงรักษาน้อยลง ลดการใช้งาน CPU จากเซิร์ฟเวอร์ไปยังไคลเอนต์และ SPAs เปล่งประกาย ข้อดีข้อเสียที่มีน้ำหนักเกินโดยไกล ดังนั้น SPA หรือไม่ SPA ขึ้นอยู่กับกรณีการใช้งาน

สำหรับการกล่าวถึงอื่น ๆ อาจไม่ชัดเจนนัก (สำหรับผู้พัฒนาเว็บ) ใช้สำหรับ SPAs: ขณะนี้ฉันกำลังมองหาวิธีที่จะใช้ GUIs ในระบบฝังตัวและสถาปัตยกรรมบนเบราว์เซอร์ดูเหมือนน่าสนใจสำหรับฉัน ตามเนื้อผ้ามีความเป็นไปได้ไม่มากนักสำหรับ UIs ในระบบฝังตัว - Java, Qt, wx, etc หรือเฟรมเวิร์กเชิงพาณิชย์ที่เหมาะสม หลายปีก่อน Adobe พยายามเข้าสู่ตลาดพร้อมแฟลช แต่ดูเหมือนจะไม่ประสบความสำเร็จ

ทุกวันนี้ในขณะที่ "ระบบสมองกลฝังตัว" มีประสิทธิภาพเทียบเท่ากับเมนเฟรมเมื่อหลายปีก่อน UI ที่อิงกับเบราว์เซอร์ที่เชื่อมต่อกับหน่วยควบคุมผ่านทาง REST เป็นวิธีแก้ปัญหาที่เป็นไปได้ ข้อดีคือเครื่องมือจานใหญ่สำหรับ UI โดยไม่มีค่าใช้จ่าย (เช่น Qt ต้องการ 20-30 $ ต่อหน่วยที่ขายโดยคิดค่าสิทธิ์เพิ่ม 3,000-4,000 $ ต่อนักพัฒนา

สำหรับสถาปัตยกรรมดังกล่าว SPA มีข้อได้เปรียบมากมาย - เช่นแนวทางการพัฒนาที่คุ้นเคยมากขึ้นสำหรับนักพัฒนาแอปเดสก์ท็อปการเข้าถึงเซิร์ฟเวอร์ที่ลดลง (มักจะอยู่ในอุตสาหกรรมรถยนต์ UI และ muddles ระบบเป็นฮาร์ดแวร์แยกต่างหาก

เนื่องจากไคลเอนต์เดียวคือเบราว์เซอร์ในตัวข้อเสียดังกล่าวเช่นความพร้อมใช้งาน JS, การบันทึกด้านเซิร์ฟเวอร์การรักษาความปลอดภัยจะไม่นับรวมอีกต่อไป


1
อเมซอนไม่ได้กังวลเกี่ยวกับแบนด์วิดท์หรือคำขอจำนวนมากเกินไป แต่ละหน้ามีขนาดประมาณ 10MB และมากกว่า 200 คำขอ
Matthew Whited

3

2. ด้วย SPA เราไม่จำเป็นต้องใช้ข้อความค้นหาพิเศษไปยังเซิร์ฟเวอร์เพื่อดาวน์โหลดหน้าต่างๆ

ฉันยังต้องเรียนรู้มาก แต่เนื่องจากฉันเริ่มเรียนรู้เกี่ยวกับสปาฉันรักพวกเขา

จุดนี้อาจสร้างความแตกต่างอย่างมาก

ในเว็บแอปมากมายที่ไม่ใช่ SPA คุณจะเห็นว่าพวกเขาจะยังคงดึงข้อมูลและเพิ่มเนื้อหาลงในหน้าเว็บที่ส่งคำขอ ajax ดังนั้นฉันคิดว่า SPA นั้นเกินกว่าจะพิจารณา: จะเกิดอะไรขึ้นถ้าเนื้อหาที่จะถูกดึงและแสดงโดยใช้ ajax เป็นหน้าทั้งหมด? และไม่ใช่เพียงส่วนเล็ก ๆ ของหน้าใช่ไหม

ให้ฉันนำเสนอสถานการณ์ พิจารณาว่าคุณมี 2 หน้า:

  1. หน้าที่มีรายการผลิตภัณฑ์
  2. หน้าเพื่อดูรายละเอียดของผลิตภัณฑ์เฉพาะ

พิจารณาว่าคุณอยู่ที่หน้ารายการ จากนั้นคุณคลิกที่ผลิตภัณฑ์เพื่อดูรายละเอียด แอปฝั่งไคลเอ็นต์จะทริกเกอร์คำขอ ajax 2 คำขอ:

  1. คำขอให้รับวัตถุ json พร้อมรายละเอียดผลิตภัณฑ์
  2. คำขอเพื่อรับเทมเพลต html ที่จะแทรกรายละเอียดผลิตภัณฑ์

จากนั้นแอปฝั่งไคลเอ็นต์จะแทรกข้อมูลลงในเทมเพลต html และแสดงมัน

จากนั้นคุณกลับไปที่รายการ (ไม่มีการร้องขอสำหรับสิ่งนี้!) และคุณเปิดผลิตภัณฑ์อื่น เวลานี้จะมีเพียงคำขอ ajax เพื่อรับรายละเอียดของผลิตภัณฑ์ เทมเพลต html จะเหมือนกันดังนั้นคุณไม่จำเป็นต้องดาวน์โหลดอีกครั้ง

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

นอกจากนี้ลองพิจารณาว่าภาษาฝั่งเซิร์ฟเวอร์ของคุณคือ Java หากคุณวิเคราะห์คำขอ 2 ข้อที่ฉันกล่าวถึง 1 ข้อมูลการดาวน์โหลด (คุณไม่จำเป็นต้องโหลดไฟล์มุมมองใด ๆ และเรียกเครื่องมือการแสดงผลมุมมอง) และการดาวน์โหลดอื่น ๆ และเทมเพลต html แบบคงที่เพื่อให้คุณสามารถมี HTTP เว็บเซิร์ฟเวอร์ที่สามารถเรียกคืนได้ โดยตรงโดยไม่ต้องโทรไปที่เซิร์ฟเวอร์แอปพลิเคชัน Java ไม่มีการคำนวณใด ๆ !

ในที่สุด บริษัท ใหญ่ ๆ ก็ใช้ SPA: Facebook, GMail, Amazon พวกเขาไม่เล่นพวกเขามีวิศวกรที่ยิ่งใหญ่ที่สุดที่เรียนทั้งหมดนี้ ดังนั้นหากคุณไม่เห็นข้อได้เปรียบคุณสามารถไว้วางใจพวกเขาในตอนแรกและหวังว่าจะค้นพบพวกเขาตามถนน

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


1
Facebook ไม่ใช่ SPA จริง ๆ แล้วเป็นแอปสไตล์ MPA พวกเขาใช้ ReactJS ที่นี่และมีความคิดเห็นแชท ฯลฯ Instagram เป็นตัวอย่างที่ดีสำหรับหน้า SPA แบบเต็มโดยเปิดใช้งาน PWA ใช้สำหรับ Amazon, Youtube ทั้งสองเป็นแอป MPA
Peter Húbek

3

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

  • a) ความปลอดภัย: แอปพลิเคชันหน้าเดียวมีความปลอดภัยน้อยกว่าเมื่อเทียบกับหน้าเว็บแบบดั้งเดิมเนื่องจาก cross site scripting (XSS)
  • b) Memory Leak: การรั่วไหลของหน่วยความจำใน JavaScript สามารถทำให้คอมพิวเตอร์ที่ทรงพลังทำงานช้าลงได้ ในฐานะที่เป็นเว็บไซต์ดั้งเดิมสนับสนุนให้นำทางระหว่างหน้าดังนั้นหน่วยความจำรั่วใด ๆ ที่เกิดจากหน้าก่อนหน้าเกือบจะถูกชะล้างเหลือทิ้งน้อย
  • c) ไคลเอนต์ต้องเปิดใช้งาน JavaScript เพื่อเรียกใช้ SPA แต่ในแอปพลิเคชันหลายหน้า JavaScript สามารถหลีกเลี่ยงได้อย่างสมบูรณ์
  • d) SPA มีขนาดที่เหมาะสมทำให้เวลารอนาน เช่นทำงานกับ Gmail ด้วยการเชื่อมต่อที่ช้าลง

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

ลิงค์นี้จะอธิบายข้อดีและข้อเสียของแอปพลิเคชันหน้าเดียว


12
สิ่งนี้ไม่ถูกต้อง a) XSS มีผลต่อหน้าที่สร้างจากเซิร์ฟเวอร์เช่นเดียวกับเอกสารที่สร้างบนไคลเอนต์ ฉันจะโต้แย้ง moreso เนื่องจากมีโซลูชั่นการบรรเทา XSS ง่ายและมีประสิทธิภาพในลูกค้า หากคุณไม่ต้องการอนุญาต XSS อย่าตีความเนื้อหาที่ผู้ใช้ส่งเป็น HTML โปรแกรมเมอร์ที่ดีคนใดสามารถจัดการสิ่งนี้ได้ การนำทางเป็นเรื่องง่ายโดยใช้เทคนิคที่มีอยู่ (pushState, hash routing, ฯลฯ ) AFT สำหรับ SPA ที่สร้างขึ้นอย่างถูกต้องเหมือนกับแอปพลิเคชันเว็บอื่น ๆ สรุปคำตอบของคุณคือคุณไม่รู้วิธีสร้างสำหรับลูกค้า
Jason Miller

@JasonMiller: เห็นด้วย ฉันเพิ่งรู้ว่าบทสรุปไม่ใช่บริบทของบล็อกทั้งหมด ฉันจะทำการเปลี่ยนแปลงในมัน ขอบคุณ.
Vish

6
คะแนน a และ b นั้นไม่ถูกต้องสมบูรณ์ ทั้งสองมีส่วนเกี่ยวข้องกับการเขียนโปรแกรมต่ำกว่าลักษณะของสปาและทั้งคู่นั้นเป็นไปได้อย่างสมบูรณ์แบบกับเว็บไซต์ดั้งเดิม ช่องโหว่ XSS สามารถส่งผลกระทบต่อเว็บไซต์ของคุณแม้ว่าคุณจะไม่ได้เขียนบรรทัดของ JS การรั่วไหลของหน่วยความจำเป็นเพียงฝั่งเซิร์ฟเวอร์เท่าที่เป็นไปได้ฝั่งไคลเอ็นต์ สำหรับประเด็น c ผู้ที่ปิดการใช้งาน Javascript ในวันนี้และอายุมีแนวโน้มที่จะพบการใช้งานเว็บโดยทั่วไปเป็นปัญหาใหญ่ซึ่งเป็น IMHO ที่ไม่ใช่ปัญหา
garryp

2

ในการพัฒนาของฉันฉันพบข้อดีสองประการที่แตกต่างกันสำหรับการใช้สปา ที่ไม่ได้บอกว่าต่อไปนี้ไม่สามารถทำได้ในเว็บแอปแบบดั้งเดิมเพียงที่ฉันเห็นผลประโยชน์ที่เพิ่มขึ้นโดยไม่ต้องแนะนำข้อเสียเพิ่มเติม

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

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

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


1

พยายามอย่าใช้ SPA โดยไม่ได้กำหนดวิธีรักษาความปลอดภัยและความเสถียรของ API ที่ฝั่งเซิร์ฟเวอร์ จากนั้นคุณจะเห็นข้อดีที่แท้จริงของการใช้สปา หากคุณใช้เซิร์ฟเวอร์ RESTful ที่ใช้ OAUTH 2.0 เพื่อความปลอดภัยคุณจะได้รับข้อกังวลพื้นฐานสองประการที่จะช่วยลดต้นทุนในการพัฒนาและบำรุงรักษา

  1. สิ่งนี้จะย้ายเซสชั่น (และความปลอดภัย) ไปยังสปาและคลายเซิร์ฟเวอร์ของคุณจากค่าใช้จ่ายทั้งหมด
  2. API ของคุณมีทั้งความเสถียรและยืดขยายได้ง่าย

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


0

ฉันเข้าใจว่านี่เป็นคำถามที่เก่ากว่า แต่ฉันต้องการเพิ่มข้อเสียอีกประการของแอปพลิเคชันหน้าเดียว:

หากคุณสร้าง API ที่ส่งคืนผลลัพธ์ในภาษาข้อมูล (เช่น XML หรือ JSON) แทนที่จะเป็นภาษาการจัดรูปแบบ (เช่น HTML) แสดงว่าคุณกำลังเปิดใช้งานการทำงานร่วมกันของแอปพลิเคชันที่มากขึ้นเช่นในแอปพลิเคชัน ความสามารถในการทำงานร่วมกันดังกล่าวมีประโยชน์อย่างมาก แต่อนุญาตให้ผู้คนเขียนซอฟต์แวร์เพื่อ "ขุด" (หรือขโมย) ข้อมูลของคุณ ข้อเสียนี้เป็นเรื่องปกติสำหรับ API ทั้งหมดที่ใช้ภาษาข้อมูลและไม่ใช่ SPA ทั่วไป (จริง ๆ แล้ว SPA ที่ขอให้เซิร์ฟเวอร์ใช้ HTML ที่แสดงผลล่วงหน้าจะหลีกเลี่ยงสิ่งนี้ แต่มีค่าใช้จ่ายในการแยกโมเดล / มุมมองที่ไม่ดี) ความเสี่ยงที่เกิดจากข้อเสียนี้สามารถบรรเทาได้ด้วยวิธีการต่าง ๆ เช่นการ จำกัด การร้องขอและการบล็อกการเชื่อมต่อเป็นต้น


2
1. ) การไม่มี API ไม่ได้หมายความว่าจะไม่สามารถขุดหน้า HTML ได้ 2. ) คุณสามารถป้องกันการใช้ API ของคุณในทางที่ผิด 3. ) เมื่อใช้ API คุณสามารถสร้างเว็บเพจได้อย่างง่ายดาย แต่ยังสามารถใช้งานแอพพลิเคชั่นบนมือถือได้อีกด้วย
Honza Kalfus

1. ฉันไม่ได้บอกว่าไม่ใช่ API เพื่อป้องกันการขุดข้อมูล ฉันเพิ่งบอกว่า API สามารถทำให้การขุดข้อมูลง่ายขึ้น 2. นั่นคือสิ่งที่ประโยคสุดท้ายของฉันพูดถึง 3. มีข้อดีหลายประการในการมี API และโดยส่วนตัวแล้วฉันชอบการผสมผสาน API / SPA สำหรับกรณีการใช้งานส่วนใหญ่ที่ฉันพบ อย่างไรก็ตามฉันเพียงแค่ต้องการเพิ่มข้อเสียเดียวในรายการ (ซึ่งในการหวนกลับฉันควรจะเพิ่มเป็นความคิดเห็นมากกว่าคำตอบที่สมบูรณ์)
แมกนัส

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

ตกลง มันไม่ชัดเจนพอ ข้อมูลที่ฝังใน HTML สามารถขุดได้ ข้อมูลที่ฝังอยู่ใน JSON / XML / ฯลฯ นั้นสามารถขุดได้ง่ายขึ้นด้วย
แมกนัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.