19.0.0 (5 ธันวาคม 2024)
ฟีเจอร์ใหม่
React
- Actions: ตอนนี้
startTransition รองรับฟังก์ชันแบบอะซิงก์แล้ว ฟังก์ชันเหล่านี้เรียกว่า "Actions" และจะอัปเดต state ในเบื้องหลังพร้อม commit UI ในครั้งเดียว Actions สามารถทำ side effects เช่นคำขอแบบอะซิงก์ได้ และจะรอให้งานเสร็จก่อนที่ Transition จะจบลง
useActionState: ฮุกใหม่ที่ใช้จัดลำดับ Actions ภายใน Transition และเข้าถึง state ได้ รับ initial state และ reducer
useOptimistic: ฮุกใหม่สำหรับอัปเดต state ระหว่างที่ Transition กำลังดำเนินอยู่ เมื่อ Transition เสร็จสิ้น state จะถูกอัปเดตเป็นค่าใหม่
use: API ใหม่ที่ใช้สำหรับอ่าน resource ระหว่างการเรนเดอร์ รองรับ Promise หรือ Context และหากส่ง Promise มา จะ suspend จนกว่าค่านั้นจะ resolve
- ใช้
ref เป็น prop: สามารถใช้ ref เป็น prop ได้โดยไม่ต้องใช้ forwardRef
- การ prewarm sibling ของ Suspense: เมื่อคอมโพเนนต์เกิดการ suspend React จะ commit fallback ของขอบเขต Suspense ที่ใกล้ที่สุดทันที
React DOM Client
- prop
action ของ <form>: Form Actions จะจัดการฟอร์มให้อัตโนมัติและทำงานร่วมกับ useFormStatus โดยจะรีเซ็ตฟอร์มอัตโนมัติเมื่อสำเร็จ
- รองรับ document metadata: สามารถเรนเดอร์แท็ก metadata ของเอกสารจากคอมโพเนนต์ได้แบบเนทีฟ
- รองรับ stylesheet: จะแทรก stylesheet เข้าไปใน
<head> ของฝั่งไคลเอนต์ก่อนเปิดเผยเนื้อหาภายในขอบเขต Suspense
- รองรับ async script: สามารถเรนเดอร์สคริปต์แบบอะซิงก์ได้จากที่ใดก็ได้ใน component tree
React DOM Server
- เพิ่ม API
prerender และ prerenderToNodeStream: เป็น API สำหรับการสร้าง static site ซึ่งออกแบบมาให้ทำงานในสภาพแวดล้อมแบบสตรีมมิง เช่น Node.js stream และ web stream
React Server Components
- ความสามารถของ RSC: directives, server components และ server functions ถูกทำให้เสถียรแล้ว ไลบรารีที่มี server components สามารถตั้งเป้า React 19 เป็น peer dependency ได้แล้ว
การเลิกใช้งานในอนาคต
- การเข้าถึง
element.ref: เลิกใช้การเข้าถึง element.ref โดยแนะนำให้ใช้ element.props.ref แทน
react-test-renderer: ใน React 19 นั้น react-test-renderer จะบันทึกคำเตือนการเลิกใช้งาน และเปลี่ยนไปใช้ concurrent rendering สำหรับการใช้งานบนเว็บ
การเปลี่ยนแปลงสำคัญ
React
- ต้องใช้ JSX transform ใหม่: จำเป็นต้องใช้ JSX transform แบบใหม่เพื่อปรับปรุงขนาด bundle และเพื่อให้ใช้ JSX ได้โดยไม่ต้อง import React
- ข้อผิดพลาดระหว่างเรนเดอร์จะไม่ถูกโยนซ้ำ: หาก Error Boundary ไม่ได้จับข้อผิดพลาดไว้ ข้อผิดพลาดจะถูกรายงานไปที่
window.reportError
- ลบ
propTypes: การใช้ propTypes จะถูกเพิกเฉยแบบเงียบ ๆ แนะนำให้ย้ายไปใช้ TypeScript
- ลบ
defaultProps ของฟังก์ชัน: สามารถใช้พารามิเตอร์เริ่มต้นของ ES6 แทนได้
- ลบ string refs: ต้องย้ายการใช้ string refs ไปเป็น ref callback
React DOM
- ลบ
react-dom/test-utils: ย้าย act จาก react-dom/test-utils ไปไว้ใน react ส่วนยูทิลิตีอื่น ๆ ถูกลบออก
- ลบ
ReactDOM.render, ReactDOM.hydrate: ถูกแทนที่ด้วย ReactDOM.createRoot และ ReactDOM.hydrateRoot สำหรับ concurrent rendering
การเปลี่ยนแปลงที่น่าสนใจ
React
- ใช้
<Context> เป็น provider: สามารถเรนเดอร์ <Context> เป็น provider ได้แทน <Context.Provider>
- รองรับ custom elements: React 19 ผ่านการทดสอบ custom elements ทั้งหมด
- การเปลี่ยนแปลงใน StrictMode:
useMemo และ useCallback จะนำผลลัพธ์ที่ memoize จากการเรนเดอร์ครั้งแรกกลับมาใช้ซ้ำ
React DOM
- แสดงความแตกต่างสำหรับ hydration errors: หากเกิดความไม่ตรงกัน React 19 จะบันทึกข้อผิดพลาดเพียงรายการเดียวที่มีรายละเอียดความแตกต่างของเนื้อหาที่ไม่ตรงกัน
การเปลี่ยนแปลงใน TypeScript
- ห้าม implicit return: ตอนนี้ refs รองรับเฉพาะ cleanup function เท่านั้น การคืนค่าแบบ implicit จะทำให้เกิดข้อผิดพลาด
- ต้องมีอาร์กิวเมนต์เริ่มต้นของ
useRef: ตอนนี้อาร์กิวเมนต์เริ่มต้นเป็นสิ่งจำเป็น
- การพิมพ์ชนิด
ReactElement ที่เข้มงวดขึ้น: ตอนนี้ props ของ React element จะตั้งต้นเป็น unknown แทน any
1 ความคิดเห็น
ความเห็นบน Hacker News
มีความเห็นว่าการใช้ React เพื่อสร้างแอปที่ขยายต่อได้เป็นทั้งสิ่งที่ทำได้จริงและสนุก
มีมุมมองเชิงบวกต่อรีลีสใหม่ของ React แต่ก็กังวลว่าผู้เริ่มต้นอาจเริ่มต้นได้ยาก
มีความเห็นว่าความซับซ้อนของเฟรมเวิร์กฝั่งไคลเอนต์กำลังเพิ่มขึ้น
ประเมินในทางบวกว่ารีลีสใหม่นี้เพิ่มฟีเจอร์
ref as a propเข้ามา ทำให้ไม่จำเป็นต้องใช้forwardRefอีกต่อไปมีการกล่าวถึง Jotai ซึ่งเป็นโคลนของ Recoil แทน Redux พร้อมระบุว่าสามารถใช้งานร่วมกับ React 19 ได้
มีความเห็นว่าอยากให้เปลี่ยนชื่อ API
useประเมินในทางบวกต่อการเลื่อนรีลีสออกไปเพื่อแก้ปัญหา parallel suspense
มีข้อสงสัยว่าสามารถสร้าง hook
useActionStateโดยอิงจาก built-in hook ที่มีอยู่เดิมได้หรือไม่ประเมินในทางบวกต่อการเพิ่มฟีเจอร์ที่ส่งเสริมการใช้เทคโนโลยีเว็บมาตรฐานและฟีเจอร์ที่ช่วยยกระดับคุณภาพการใช้งาน