- React Native เวอร์ชัน 0.76 ได้เปิดตัวบน npm แล้ว โดยเวอร์ชันนี้มาพร้อมสถาปัตยกรรมใหม่เป็นค่าเริ่มต้น และรองรับฟีเจอร์ล่าสุดของ React ได้อย่างสมบูรณ์
- สถาปัตยกรรมใหม่นี้รองรับฟีเจอร์อย่าง Suspense, Transitions, automatic batching และ
useLayoutEffect รวมถึงมีการนำระบบ native module และ component แบบใหม่มาใช้ ทำให้สามารถเขียนโค้ดที่มี type safety ได้
- นี่คือผลลัพธ์จากการเขียน React Native ใหม่ครั้งใหญ่ตั้งแต่ปี 2018 และถูกออกแบบมาเพื่อให้แอปส่วนใหญ่ค่อย ๆ เปลี่ยนผ่านไปยังสถาปัตยกรรมใหม่ได้
- React Native 0.76 ทำให้แอปส่วนใหญ่สามารถอัปเกรดได้ด้วยความพยายามใกล้เคียงกับรีลีสก่อนหน้า และไลบรารียอดนิยมต่างก็รองรับสถาปัตยกรรมใหม่นี้แล้ว
สถาปัตยกรรมใหม่คืออะไร?
- สถาปัตยกรรมใหม่คือการเขียนระบบหลักของ React Native ใหม่ทั้งหมด ครอบคลุมการเรนเดอร์คอมโพเนนต์ การสื่อสารระหว่าง JavaScript กับชั้น abstraction ฝั่ง native และวิธีจัดตารางงานข้ามเธรด
- สถาปัตยกรรมเดิมสื่อสารกับแพลตฟอร์ม native ผ่าน asynchronous bridge แต่สถาปัตยกรรมใหม่ถูกออกแบบให้รองรับทั้งการอัปเดตแบบ synchronous และ asynchronous
- สถาปัตยกรรมใหม่ประกอบด้วย 4 ส่วนหลัก ได้แก่ ระบบ native module ใหม่, renderer ใหม่, event loop และการยกเลิก bridge
native module แบบใหม่
- เขียนด้วย C++ และเพิ่มความสามารถใหม่
- สื่อสารกับ native runtime แบบ synchronous ได้
- ให้ type safety ระหว่าง JavaScript และโค้ด native
- แชร์โค้ดข้ามแพลตฟอร์มได้
- รองรับ lazy module loading โดยค่าเริ่มต้น
- สามารถใช้ความสามารถทั้งหมดของ native implementation ที่เขียนด้วย C++ ได้จาก API ฝั่ง JavaScript/TypeScript
- สามารถกำหนด type contract ที่เข้มแข็งได้ด้วย Codegen
- โมดูลจะถูกโหลดเข้า memory เฉพาะเมื่อจำเป็น ช่วยลดเวลาเริ่มต้นแอป
renderer ใหม่
- ถูกเขียนใหม่ด้วย C++ และให้ข้อดีดังต่อไปนี้:
- เรนเดอร์การอัปเดตบนหลายเธรดด้วยระดับความสำคัญที่ต่างกันได้
- อ่าน layout แบบ synchronous จากอีกเธรดได้
- ใช้โค้ด C++ ร่วมกันได้ในทุกแพลตฟอร์ม
- ตอนนี้ลำดับชั้นของ view ถูกเก็บเป็นโครงสร้าง tree ที่ immutable
- ทำให้จัดการการอัปเดตแบบ thread-safe ได้
- รองรับการจัดการหลาย tree ที่กำลังดำเนินอยู่ ซึ่งแสดงเวอร์ชันต่าง ๆ ของส่วนติดต่อผู้ใช้
- สามารถหยุดการอัปเดตที่มีความสำคัญต่ำชั่วคราว เพื่อเรนเดอร์สิ่งเร่งด่วนอย่างอินพุตจากผู้ใช้ แล้วกลับมาทำการอัปเดตที่มีความสำคัญต่ำต่อได้
event loop
- สถาปัตยกรรมใหม่ได้นำโมเดลการจัดการ event loop ที่ชัดเจนมาใช้ เพื่อลดความแตกต่างระหว่าง React DOM กับ React Native
- มีการใช้โมเดลประมวลผล event loop ที่กำหนดไว้อย่างชัดเจนสำหรับการจัดการงานบน JavaScript thread
- event loop จะจัดลำดับการอัปเดตและ event อย่างคาดการณ์ได้ ทำให้สามารถขัดจังหวะการอัปเดตที่มีความสำคัญต่ำด้วย event ด่วนจากผู้ใช้ได้
- สอดคล้องกับมาตรฐานเว็บมากขึ้น
- จะเป็นพื้นฐานให้ฟีเจอร์ของเบราว์เซอร์เพิ่มเติมในอนาคต
การยกเลิก bridge
- สถาปัตยกรรมใหม่ยกเลิก bridge เพื่อให้ JavaScript และโค้ด native สื่อสารกันได้โดยตรงและมีประสิทธิภาพมากขึ้น
- การยกเลิก bridge ช่วยให้เวลาเริ่มต้นดีขึ้น ลด crash จากพฤติกรรมที่ไม่กำหนดไว้ และทำให้การรายงานข้อผิดพลาดกับการดีบักง่ายขึ้น
ฟีเจอร์ใหม่
- Transitions
- Transitions ซึ่งเป็นแนวคิดใหม่ใน React 18 ใช้แยกความต่างระหว่างการอัปเดตแบบเร่งด่วนและไม่เร่งด่วน
- การอัปเดตแบบเร่งด่วนต้องตอบสนองทันที ส่วนการอัปเดตแบบ Transitions ใช้เปลี่ยน UI จากมุมมองหนึ่งไปสู่อีกมุมมองหนึ่ง
- Automatic batching จะรวม state update ให้มากขึ้นเข้าด้วยกัน เพื่อหลีกเลี่ยงการเรนเดอร์สถานะกลาง และทำให้ React Native ทำงานได้เร็วขึ้นและลื่นไหลขึ้น
- สถาปัตยกรรมใหม่รองรับการอ่านข้อมูล layout แบบ synchronous ผ่าน
useLayoutEffect และอัปเดต UI ได้ภายในเฟรมเดียวกัน
- สถาปัตยกรรมใหม่รองรับ Suspense ที่เปิดตัวใน React 18 อย่างสมบูรณ์ ช่วยจัดการสถานะการโหลดและให้ความสำคัญสูงกับอินพุตจากผู้ใช้
วิธีอัปเกรด
- เมื่อต้องอัปเกรดเป็น 0.76 แอปส่วนใหญ่สามารถทำได้ด้วยความพยายามใกล้เคียงกับรีลีสอื่น ๆ เพราะมี interop layer ช่วยรองรับ
- อย่างไรก็ตาม หากต้องการใช้ New Architecture และฟีเจอร์ concurrent ได้อย่างเต็มที่ จำเป็นต้องย้าย custom native module และ component ของตนเอง
- สำหรับนักพัฒนาแอป
- จำเป็นต้องอัปเกรดไลบรารี, custom native component และ custom native module ให้รองรับ New Architecture อย่างสมบูรณ์
- ไลบรารี React Native ยอดนิยมส่วนใหญ่ได้ร่วมกันรองรับ New Architecture แล้ว
- สำหรับผู้ดูแลไลบรารี แนะนำให้ย้ายไลบรารีไปใช้ native module และ component API แบบใหม่
สรุปโดย GN⁺
- การเปลี่ยนผ่านไปสู่ New Architecture น่าจะเป็นหมุดหมายสำคัญของการพัฒนา React Native เพราะรองรับทั้งการอัปเดตแบบ synchronous/asynchronous แก้คอขวดจาก bridge และทำให้อ่าน layout จากอีกเธรดได้ จึงน่าจะช่วยปรับปรุงทั้งประสิทธิภาพและประสบการณ์ผู้ใช้ได้มาก
- สิ่งที่น่าจับตาอีกอย่างคือการรองรับฟีเจอร์ Concurrent ของ React 18 อย่างสมบูรณ์ ทำให้สามารถใช้ Suspense, Transition และอื่น ๆ เพื่อสร้าง UX ที่ตอบสนองไวและเป็นธรรมชาติมากขึ้นได้
- อย่างไรก็ตาม แอปและไลบรารีเดิมยังน่าจะต้องมีงาน migration เพื่อรองรับ New Architecture อย่างเต็มรูปแบบ แม้จะต้องทำแบบค่อยเป็นค่อยไป แต่เมื่อ migration เสร็จแล้วก็น่าจะได้รับประโยชน์จากสถาปัตยกรรมใหม่นี้อย่างเต็มที่
- สถาปัตยกรรมนี้ถูกใช้งานแล้วในแอป Facebook และ Instagram ของ Meta และมีกรณีความสำเร็จจาก Expensify, Kraken และ BlueSky
- โดยรวมแล้ว New Architecture ถือเป็นความก้าวหน้าครั้งใหญ่เพื่ออนาคตของ React Native และหวังว่าจะลงหลักปักฐานได้ดีด้วยความร่วมมือจากชุมชน
6 ความคิดเห็น
รู้สึกเหมือนได้ยินชื่อ React Native ครั้งแรกก็นานมากแล้วเหมือนกัน ทั้งที่เริ่มต้นจาก Facebook แต่จนถึงตอนนี้ก็ยังไม่ถึงเวอร์ชัน 1 เสียที กลับน่าแปลกใจเหมือนกัน..
ผมไม่เคยใช้ RN เลยก็เลยสงสัย แต่จากความรู้สึกเหมือนมันน่าจะถูกปรับแต่งมาให้เหมาะกับ Android มากกว่า ทว่าที่จริงแล้วกลับทำประสิทธิภาพได้ดีกว่าบน iOS นี่น่าทึ่งดีนะครับ
ฝั่งของเราเหมือนว่า crash เกือบทั้งหมดจะเกิดบน Android ครับ
บน Android มันแย่มาก... แย่ในระดับที่น่ากลัวเลย..
เหมือนเพิ่งเปลี่ยนเอนจินเป็น hermes ไปได้ไม่นานเอง แต่ดูท่าจะยกเครื่องใหม่อีกแล้วนะ
ความคิดเห็นจาก Hacker News
มีประสบการณ์พัฒนาแอป React Native และ backend API มา 4 ปี การย้ายไปใช้ Expo ช่วยแก้ปัญหาได้หลายอย่าง แต่ก็ยังมีบั๊กอยู่ iOS เสถียรกว่า Android และประสิทธิภาพก็ดีกว่า React Native เรียนรู้ง่ายและมี ecosystem ของ JS ขนาดใหญ่จึงพอจะแนะนำได้ แต่ตอนนี้กำลังใช้ Flutter อยู่
มีความคิดเห็นที่หลากหลายเกี่ยวกับ React Native บางคนแสดงความไม่พอใจกับ Expo และแนะนำ Kotlin Multiplatform อีกทั้งยังมีความเห็นว่าการถกเถียงบน Hacker News กำลังไร้สาระมากขึ้นเรื่อย ๆ
ในฐานะนักพัฒนา Flutter คิดว่า Swift UI และ Compose เหมาะกับการพัฒนาโมบายล์มากกว่า และถ้าจะเริ่มทำแอปใหม่ก็จะไม่ใช้ทั้ง Flutter หรือ React Native
React Native ใช้งานบน iOS ได้โอเค แต่บน Android ช้า Hermes น่าสนใจแต่ก็ยังต้องใช้ polyfill อีกมาก ตั้งตารอวันที่เว็บจะมาแทนที่ React Native
กำลังพัฒนา Bluesky ด้วย Expo/RN และจากการทดสอบเบื้องต้นกับสถาปัตยกรรมใหม่พบว่าประสิทธิภาพบน Android ดีขึ้น
มีประสบการณ์ที่ดีกับการใช้ React Native ร่วมกับ Expo และในฐานะนักพัฒนาเดี่ยว RN ช่วยให้ทำอะไรได้หลายอย่าง กำลังตั้งตารอสถาปัตยกรรมใหม่อยู่
ความเร็วในการเรนเดอร์ของ Flutter เร็วกว่า React Native 5 เท่า และเมื่อใช้ React บนเว็บก็เร็วกว่า
เห็นทวีตว่่า Capacitor มีประโยชน์สำหรับการพอร์ตเว็บแอป NextJS
React Native ดีขึ้นมากพอสมควรในปีนี้ และเมื่อ
react-strict-domพร้อมใช้งานก็จะนำมาซึ่งการเปลี่ยนแปลงครั้งใหญ่