เป็นความคิดที่ดีหรือไม่ที่จะทำ UI 100% ใน Javascript และให้ข้อมูลผ่าน API


19

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

ดังนั้นฉันสงสัยว่ามันอาจจะเป็นความคิดที่ดีที่จะย้าย UI ทั้งหมดไปยังด้าน JavaScript พัฒนาชุดการควบคุมที่สามารถนำกลับมาใช้ใหม่ได้ซึ่งปรับให้เหมาะกับความต้องการของเราโดยเฉพาะและแลกเปลี่ยนข้อมูลกับเซิร์ฟเวอร์เท่านั้น ใช่ฉันชอบกระบวนทัศน์ "ควบคุม" (aka "วิดเจ็ต") ซึ่งค่อนข้างเหมาะกับแอปพลิเคชันดังกล่าว ดังนั้นในฝั่งเซิร์ฟเวอร์เรายังคงมีรูปแบบพื้นฐานไปยังมาร์กอัป ASPX ปัจจุบันของเรา แต่จากนั้นจะถูกส่งไปยังลูกค้าเพียงครั้งเดียวและส่วน Javascript จะดูแลการปรับปรุง UI ต่อไปทั้งหมด

ปัญหาคือฉันไม่เคยทำแบบนี้มาก่อนและฉันไม่เคยเห็นใครทำแบบนี้มาก่อนเลยไม่รู้ว่าปัญหาจะเป็นอย่างไร โดยเฉพาะอย่างยิ่งฉันกังวลเกี่ยวกับ:

  • ประสิทธิภาพยังคง การเปรียบเทียบแสดงให้เห็นว่าในปัจจุบันความล่าช้าหลักอยู่ที่ฝั่งไคลเอ็นต์เมื่อเบราว์เซอร์พยายามที่จะแสดงผลหน้าส่วนใหญ่อีกครั้งหลังจากการอัพเดต AJAX มาร์กอัป ASP.NET webforms ที่สร้างขึ้นให้ความหมายใหม่กับคำว่า "เว็บ" และตัวควบคุม Devexpress ที่หลากหลายเพิ่มเลเยอร์ Javascript ที่ซับซ้อนของตัวเอง แต่จะเร็วกว่าที่จะคำนวณการเปลี่ยนแปลงที่จำเป็นทั้งหมดในด้าน Javascript แล้วอัปเดตเฉพาะสิ่งที่จำเป็นต้องได้รับการปรับปรุง โปรดทราบว่าฉันกำลังพูดถึงรูปแบบที่มีหลายมุมมองที่แก้ไขได้หลายช่องข้อความจำนวนมากดรอปดาวน์แต่ละอันมีรายการที่กรองได้ครึ่งล้านรายการ ฯลฯ
  • ความสะดวกในการพัฒนา จะมีจาวาสคริปต์มากขึ้นในตอนนี้และอาจผสมกับมาร์กอัพ HTML ของหน้า จะต้องมีการสร้างเอนจิ้นการดูใหม่ Intellisense สำหรับ Javascript นั้นแย่กว่า C # code มากและเนื่องจากจาวาสคริปต์ที่มีลักษณะแบบไดนามิกทำให้ไม่สามารถคาดหวังได้ดีกว่านี้มากนัก การเขียนโค้ดสามารถปรับปรุงได้เล็กน้อย แต่ไม่มากนัก นอกจากนี้นักพัฒนาของเราส่วนใหญ่เป็นนักพัฒนา C # เป็นหลักดังนั้นจะมีช่วงการเรียนรู้และข้อผิดพลาดเริ่มแรก
  • ความปลอดภัย การตรวจสอบความปลอดภัยจำนวนมากจะต้องทำสองครั้ง (ฝั่งเซิร์ฟเวอร์และฝั่ง UI) และฝั่งเซิร์ฟเวอร์ประมวลผลข้อมูลจะต้องรวมจำนวนมากขึ้น ในปัจจุบันหากคุณตั้งค่ากล่องข้อความให้อ่านอย่างเดียวทางฝั่งเซิร์ฟเวอร์คุณสามารถขึ้นอยู่กับค่าที่ไม่เปลี่ยนแปลงผ่านไคลเอนต์ไปกลับ เฟรมเวิร์กมีรหัสเพียงพอที่จะทำให้มั่นใจได้ว่า (ผ่านการเข้ารหัส viewstate) ด้วยวิธีการใช้ข้อมูลอย่างเดียวมันจะยากขึ้นเพราะคุณต้องตรวจสอบทุกอย่างด้วยตนเอง ในอีกด้านหนึ่งช่องโหว่ด้านความปลอดภัยอาจสังเกตเห็นได้ง่ายกว่าเพราะคุณจะมีเฉพาะข้อมูลที่ต้องกังวล

ทั้งหมดนี้จะช่วยแก้ปัญหาของเราหรือทำให้แย่ลง? มีใครเคยลองบ้างและผลลัพธ์คืออะไร มีกรอบใดบ้างที่ช่วยในความพยายามเช่นนี้ (jQuery และสิ่งที่เทียบเท่าคุณธรรม)


So on the server side we would still have a basic layout simliar to our current ASPX markup, but that then would get sent to the client only once, and the Javascript part would take care of all the subsequent UI updates.คุณกำลังอธิบายอย่างชัดเจนว่า ASP.NET คืออะไรซึ่งบอกฉันว่าคุณไม่ได้ใช้อย่างถูกต้อง :) ในแอปพลิเคชัน ASP.NET ของคุณหากคุณวางส่วนประกอบภายในแผงการอัพเดทไลบรารี ASP.NET javascript จะทำการ postbacks แบบอะซิงโครนัสไปยังฝั่งเซิร์ฟเวอร์และจะแสดงเฉพาะคอมโพเนนต์ที่คุณระบุอีกครั้ง
maple_shaft

@maple_shaft - ฉันรู้ แต่อย่างใดนี่ทำงานช้าเหมือนนรก นอกจากนี้กริดจะทำการโทรกลับแล้ว สำหรับทุกสิ่งทุกอย่างหากมี postback ในกรณีส่วนใหญ่คุณต้องรีเฟรชหน้าเว็บส่วนใหญ่เนื่องจากการควบคุมเปลี่ยนการมองเห็น / การเขียนได้ / ฯลฯ และนั่นคือช้า
Vilx-

3
ทุกครั้งที่ฉันเห็นแอพ ASP.NET ที่มีคนใส่ทุกอย่างไว้ในหน้าภายในแผงการอัปเดตฉันรู้สึกว่ากำลังโยนจอมอนิเตอร์ไว้ที่ผนัง>. <! นี่เป็นการทำลายจุดประสงค์ของ ASP.NET ทั้งหมด เพื่อรักษาวงจรชีวิตของฝั่งเซิร์ฟเวอร์และเหตุการณ์แอปพลิเคชันจำเป็นสำหรับการสื่อสารไปมากับ ViewState ทั้งหมดของหน้า หากคุณมีตัวควบคุม 200 ตัวและตารางข้อมูลดังนั้น Joel Spolsky จึงไม่สามารถคาดการณ์ได้ว่าคุณจะมีปัญหาด้านประสิทธิภาพ เอ็ดวูดค็อกและแอมโมคิวสรุปทุกอย่างได้อย่างสมบูรณ์แบบดังนั้นฉันไม่จำเป็นต้องให้คำตอบเพิ่มเติม
maple_shaft

1
@maple_shaft - ขออภัย แต่ฉันทำประวัติสิ่งนี้จริงๆ มันเป็น / ช้าในคอมพิวเตอร์นักพัฒนาท้องถิ่นเช่นกันและพู้ทำเล่นอย่างชัดเจนแสดงให้เห็นว่าการเชื่อมต่อ HTTP ถูกเปิดน้อยกว่าหนึ่งวินาทีในขณะที่หน้าปรากฏเพียงไม่กี่วินาทีต่อมาและในขณะที่เบราว์เซอร์ใช้ CPU มากเท่าที่จะทำได้ รับและถูกแช่แข็งโดยทั่วไป Viewstate นั้นไม่ใช่ bloated นั่นคือ HTML / Javascript ที่ป่อง
Vilx-

1
@ Vilx- ไม่มีอะไรผิดปกติกับ C # /. NET (นอกเหนือจาก windows เท่านั้น / ราคา) มีปัญหาใหญ่กับ bloat ที่ ASP.NET WebForms frameworks อยู่ด้านบนของมัน ดังกล่าวลองแนนซี่ถ้าคุณชอบ. NET แต่นี่เป็นหัวข้อที่สมบูรณ์แบบมันเป็นเพียงความคิดเห็นที่คุณจะได้ค่าที่ดีกว่าถ้าคุณหยุดใช้เว็บฟอร์ม
Raynos

คำตอบ:


10

Linkedin ทำสิ่งนี้สำหรับเว็บไซต์มือถือของพวกเขา (ดูhttp://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobileตอนที่ 4) และเห็นได้ว่าเป็นประโยชน์อย่างมากสำหรับพวกเขาจาก มุมมองประสิทธิภาพ

อย่างไรก็ตามฉันขอแนะนำให้คุณหลีกเลี่ยงการทำเช่นเดียวกันด้วยเหตุผลหลายประการ

ประการแรกคือการบำรุงรักษา: C # / ASP.net คือเนื่องจากเป็นเฟรมเวิร์กฝั่งเซิร์ฟเวอร์ที่ไม่ขึ้นกับไคลเอ็นต์ในขณะที่ Javascript ไม่ (แม้จะมีเฟรมเวิร์กเช่น jQuery คุณจะไม่สามารถใช้งานข้ามเบราว์เซอร์ได้ 100%) ไม่ใช่การพิสูจน์ในอนาคต) ฉันว่ามันง่ายกว่าในการตรวจสอบการทำงานของแอปพลิเคชั่นที่พิมพ์แบบคงที่มากกว่าแบบไดนามิกซึ่งเป็นสิ่งที่คุณต้องพิจารณาอย่างแน่นอนหากคุณกำลังสร้างเว็บไซต์ขนาดใหญ่

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

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

สำหรับความกังวลของคุณ:

  • ฉันจะไม่กังวลมากเกินไปเกี่ยวกับด้านความปลอดภัยไม่มีเหตุผลว่าทำไมคุณไม่สามารถผสมกระบวนทัศน์และทำการประมวลผลฝั่งเซิร์ฟเวอร์เมื่อคุณต้องการความปลอดภัย (คุณกำลังจะมีโค้ดการแสดงผลมุมมองอยู่ที่นั่นที่ส่งคืน HTML ไม่มีเหตุผลที่คุณไม่สามารถยกเลิกการโทร AJAX แทนได้เมื่อต้องการ)

  • ความง่ายในการพัฒนาไม่ได้เป็นเรื่องที่น่ากังวลเหมือนกันในความคิดของฉันมีเครื่องมือที่ดีมากสำหรับการพัฒนา JS ไม่เพียงแค่ใส่กล่องของตัวเองลงใน VisualStudio เพราะคุณคุ้นเคยกับมัน! (ลองใช้ JetBrains WebStorm เป็นต้น)

  • ประสิทธิภาพของเอ็นจิ้นการดู JS นั้นค่อนข้างดีในกรณีส่วนใหญ่ (จากประสบการณ์ของฉันอีกครั้ง) ฉันใช้มันอย่างหนักในแต่ละวัน สิ่งที่ฉันอยากจะแนะนำก็คือการหลีกเลี่ยงเฟรมเวิร์กที่มีน้ำหนักมากขึ้นเช่น knockout.js เป็นต้นและมุ่งไปที่สิ่งที่ต้องการเอ็นจิ้นเทมเพลตขนาดเล็กของ Jon Resig วิธีนี้คุณสามารถเสียบรหัสสนับสนุนในแบบที่คุณมั่นใจว่ารวดเร็วและเชื่อถือได้

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

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


ไม่อย่างที่ฉันได้แสดงความเห็นต่อคำตอบของ Darknights แล้วนี่เป็นแอพภายในที่ไม่มีส่วนสาธารณะ (ดีเล็ก ๆ น้อย ๆ ) ดังนั้นการพึ่งพา JavaScript จึงใช้ได้ และฉันได้ทำโปรไฟล์แล้ว ฝั่งเซิร์ฟเวอร์นั้นดี เป็นฝั่งไคลเอ็นต์ที่ชะงักลงภายใต้ HTML ที่สร้างขึ้นอย่างหนัก (อย่างที่ฉันพูดมาร์กอัปที่สร้างขึ้นของ ASP.NET นั้นกลุ้มใจ) และ Devexpress Javascript
Vilx-

1
@EdWoodcock เว็บไซต์ ASP.NET เป็นไปตามจาวาสคริปต์ เป็นวิธีจัดการการสื่อสารแบบอะซิงโครนัสของ ViewState และการสร้างองค์ประกอบหน้า
maple_shaft

@ Vilx- นี่อาจเป็นเรื่องที่น่าตกใจ แต่การควบคุมเช่น Data Grids นั้นซับซ้อนอย่างมาก บางทีคุณอาจมีองค์ประกอบมากเกินไปในหน้าเดียว
maple_shaft

@ Vilx- อาจถึงเวลาที่จะพิจารณาการใช้งานการควบคุมของคุณหากพวกเขากำลังสร้างมาร์กอัปที่บ้าคลั่ง (การควบคุมเริ่มต้น asp.net ไม่ได้เกิดขึ้นในกรณีส่วนใหญ่หากคุณใช้สิ่งต่าง ๆ เช่น Repeaters แทนที่จะเป็น DataGrids เป็นต้น) คุณควรม้วนการควบคุมของคุณเอง (หรือย้ายไปที่ HTML เขียนด้วยมือใน UserControls แทน)
Ed James

1
@maple_shaft - หรือ Flex เฉพาะเจาะจงมากขึ้นซึ่ง (เท่าที่ฉันเข้าใจ) นั้นถูกสร้างขึ้นบน Flash สำหรับวัตถุประสงค์ดังกล่าว มันเป็นความคิดอีกอย่างหนึ่งที่ฉันเล่นด้วยในบางครั้ง แต่ ... เท่าที่ฉันพยายามพูดถึงเรื่องนี้กับคนอื่นฉันได้รับการตอบกลับเชิงลบเท่านั้นดังนั้นฉันจึงไม่สามารถจินตนาการถึงสิ่งนี้ได้ มันยังต้องการให้เราทุกคนเรียนรู้สิ่งใหม่อย่างสมบูรณ์
Vilx-

8

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


1
ฉันสบายใจมากกับ Javascript ฉันรู้ว่าบางคนไม่ได้
Vilx-

2
ฉันทำอย่างนั้นมาหลายปีในงานก่อนหน้านี้ ExtJS นั้นดีมากและคุณสามารถทำเงินได้มหาศาล
Zachary K

@ZacharyK - มันทำงานในรูปแบบที่ซับซ้อนได้อย่างไร? คนอย่างที่ฉันเขียนไว้ที่นั่นพร้อมด้วย gridviews, tabpanels ฯลฯ
Vilx-

2
ค่อนข้างดี. คุณต้องคิดถึงโมเดลข้อมูลของคุณแน่นอน พูดตามตรงฉันพยายามหลีกเลี่ยงรูปแบบขนาดใหญ่และแต่งองค์ประกอบเล็ก ๆ แต่นั่นไม่เกี่ยวกับขีด จำกัด ของ ExtJS จากนั้นการออกแบบที่ดี ฯลฯ
Zachary K

@ZacharyK - ขี้เกียจเกินกว่าที่จะพูดซ้ำ อ่านความคิดเห็นของฉันเกี่ยวกับคำตอบของ Ed Woodcock ฉันไม่สามารถทำให้มันง่ายขึ้น :(
Vilx-

8

ทีมที่ฉันตัดสินใจย้ายไปยัง ExtJS เมื่อปลายปี 2551 เรามีแอพพลิเคชั่น PHP จำนวน 200,000 บรรทัดที่ได้รับผลกระทบจากปัญหาส่วนหน้า สถานการณ์ของเราแย่กว่าของคุณมากเนื่องจากเรามีกรอบการควบคุมแบบฟอร์มที่ส่งมาไม่ดีจริง ๆ และเราใช้ iframes เพื่อโหลดส่วนต่างๆของหน้า (สถาปัตยกรรมเชิงภาพย้อนหลังไปถึงปี 2005 และทีมไม่รู้ตัวเลย) ของอาแจ็กซ์ที่เริ่มต้น) เราจำเป็นต้องปรับโครงสร้างโค้ดใหม่ดังนั้นจึงทำให้ง่ายต่อการตัดสินใจออกแบบรหัสฐานข้อมูลอย่างหนักเพื่อให้เป็นฝั่งไคลเอ็นต์

ทุกวันนี้แอพนี้มี 300.000 บรรทัดซึ่ง 60.000 บรรทัดเป็นรหัส extjs และประมาณ 3 ใน 4 ของฟังก์ชั่นถูกย้ายไปยัง ExtJS รหัส extjs เป็นแอพพลิเคชั่นหน้าเดียว แต่ยังคงฝังรูปแบบดั้งเดิมบางอย่างไว้ใน iframes เราย้ายพอร์ตไปยังคอนเทนเนอร์นำทางก่อนแล้วจึงย้ายพื้นที่คุณลักษณะที่แตกต่างกันทีละน้อย ด้วยวิธีการนี้เราสามารถจัดการการโยกย้าย extjs ไปสู่กระบวนการพัฒนาคุณสมบัติปกติโดยไม่ทำให้เราช้าเกินไป

  • ประสิทธิภาพ

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

  • ความง่ายในการพัฒนา

    ความจริงแล้วกระเป๋าใบนี้เป็นของผสม ExtJS เป็น DSL ไม่ใช่การพัฒนาเว็บในแง่ดั้งเดิม นักพัฒนาของเราใช้เวลานานในการเรียนรู้เกี่ยวกับ API ของเฟรมเวิร์กและฉันไม่เห็นว่าเส้นโค้งนี้มีความชันน้อยกว่าในเฟรมเวิร์กฝั่งไคลเอ็นต์อื่น ๆ ทุกคนในทีมจะต้องเป็นนักพัฒนาจาวาสคริปต์ "รุ่นพี่" (ตามกฎทั่วไปหนังสือของ crockfordไม่ควรมีความลับ) เราประสบปัญหา bootstrapping กับนักพัฒนาใหม่เนื่องจากความเชี่ยวชาญด้านลูกค้ายังไม่แพร่หลายอย่างที่คุณคิดและความเชี่ยวชาญของ extjs นั้นแทบจะไม่มีเลย (ในเบลเยียมที่เราตั้งอยู่)

    ในทางกลับกันเมื่อคุณมีความเร็วสูงประสบการณ์การพัฒนาจะดีมาก ExtJS นั้นทรงพลังมากดังนั้นหากคุณอยู่ในร่องคุณสามารถยัดหน้าจอที่น่าทึ่งได้อย่างรวดเร็ว IDE-wise เราใช้ PHPStorm ซึ่งฉันพบว่ามีความสามารถเพียงพอกับรหัส ExtJS

  • ความปลอดภัย

    ความปลอดภัยเป็นหนึ่งในเหตุผลหลักในการทำ UI ฝั่งไคลเอ็นต์ เหตุผลง่าย: การลดพื้นผิวการโจมตี API บริการเว็บที่ใช้โดยรหัส ExtJS ของเรานั้นมีพื้นผิวการโจมตีที่เล็กกว่าเลเยอร์ UI ฝั่งเซิร์ฟเวอร์มาก ASVS ของ OWASP ระบุว่าคุณควรตรวจสอบความถูกต้องของอินพุตทั้งหมดบนเซิร์ฟเวอร์เพื่อความถูกต้องก่อนใช้งาน ในสถาปัตยกรรมเว็บเซอร์วิสมันชัดเจนและง่ายในการตรวจสอบความถูกต้องของอินพุตและเวลา ฉันพบว่าเหตุผลด้านความปลอดภัยในสถาปัตยกรรม UI ฝั่งไคลเอ็นต์ทำได้ง่ายขึ้น เรายังคงต่อสู้กับปัญหา XSS เพราะคุณไม่ได้รับการยกเว้นจากการเข้ารหัสเป็น HTML แต่โดยรวมแล้วเราดีกว่าเรื่องความปลอดภัยมากกว่าที่เราใช้ใน codebase เก่า ExtJS ทำให้ง่ายต่อการตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์ของเขตข้อมูลฟอร์มดังนั้นเราจึงไม่ต้องทนทุกข์ทรมานมากนักกับการเขียนโค้ดสองครั้ง


ฉันหวังว่าฉันจะสามารถทำได้มากกว่า +1 เพราะประสบการณ์จริงของคุณ!
Vilx-

4

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

ข้อดี:

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

จุดด้อย:

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

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


1

ใช่คุณทำได้ แต่ ..

คุณต้องตรวจสอบให้แน่ใจว่าคุณมี "การเสื่อมสภาพ" อย่างงดงามเพื่อให้ส่วนสำคัญของแอปพลิเคชันของคุณยังคงทำงานได้โดยไม่ต้องใช้ Javascript

นี่คือวิธีที่ฉันสร้างแอพพลิเคชั่นสไตล์ "HIJAX" ส่วนใหญ่


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

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

3
@Arkh คุณคิดว่าโปรแกรมเมอร์ไม่ใช่ผู้ใช้เราคิดว่าเป็นส่วนน้อยในโครงการที่ยิ่งใหญ่ ไม่เปลี่ยนเป็น "เพื่อ js หรือไม่ใช่ js?" เพราะมันถูกทำให้ตายรอบ ๆ ส่วนเหล่านี้ :)
Darknight

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

1
Maple_shaft ฉันชอบคุณดังนั้นฉันจะบอกว่ามันเป็นอย่างดีช่วยให้ไม่วิ่งลงไปในเส้นทางนั้น :) ขอบคุณ!
Darknight

1

เว็บไซต์ของฉันยังอยู่ในช่วงเริ่มต้น แต่ 100% js ui นั้นใช้ได้สำหรับฉันแล้ว ตรรกะเซิร์ฟเวอร์เดียวที่มีอยู่ในส่วนหน้าคือการแมปโมเดลและ URL อาแจ็กซ์ เซิร์ฟเวอร์ไม่มีความรู้เกี่ยวกับ UI เลยซึ่งสำหรับฉันนั้นง่ายต่อการบำรุงรักษา หากคุณสนใจคุณสามารถเช็คเอาเว็บไซต์ของฉันซึ่งถูกเขียนขึ้นใน ExtJS http://coffeedig.com/coffee/ ไซต์ของฉันไม่มีปัญหาด้านความปลอดภัย แต่ไคลเอนต์ให้ความช่วยเหลือผู้ใช้ปกติโดยการตรวจสอบความถูกต้องง่าย ๆ ฉันรู้ว่าผู้ใช้ที่เป็นอันตรายสามารถส่ง ajax ใด ๆ ไปยังเซิร์ฟเวอร์ดังนั้นตรรกะ "ความปลอดภัย" ทั้งหมดจะทำบนเซิร์ฟเวอร์

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

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