- บันเดลเลอร์ JavaScript ที่เขียนด้วย Rust เพื่อใช้เป็นบันเดลเลอร์ใน Vite ต่อไปในอนาคต
- มี API และอินเทอร์เฟซปลั๊กอินที่เข้ากันได้กับ Rollup แต่ขอบเขตการทำงานจะใกล้เคียงกับ esbuild มากกว่า
เหตุผลที่พัฒนา Rolldown
- ปัจจุบัน Vite ใช้บันเดลเลอร์ภายในอยู่ 2 ตัว
- esbuild : ใช้สำหรับ pre-bundling ของ dependency, การแปลง TypeScript / JSX, การลด target และการ minification
- Rollup : ใช้สำหรับ production build และรองรับอินเทอร์เฟซปลั๊กอินที่เข้ากันได้กับ Rollup
- แม้ว่าบันเดลเลอร์ทั้งสองจะยอดเยี่ยม แต่แต่ละตัวก็ยังขาดความสามารถบางอย่างที่อีกตัวมี
- esbuild เร็วมากและมีฟีเจอร์ครบถ้วน แต่ไม่เหมาะกับการบันเดิลแอปพลิเคชันในแง่ของผลลัพธ์ที่ได้ โดยเฉพาะข้อจำกัดด้านการแบ่งชังก์
- Rollup มีความสมบูรณ์และผ่านการใช้งานจริงมาแล้วสำหรับการบันเดิลแอปพลิเคชัน แต่ช้ากว่าบันเดลเลอร์ที่คอมไพล์ด้วยภาษาเนทีฟอย่างมาก
- การต้องใช้บันเดลเลอร์ต่างกัน 2 ตัวไม่ใช่ทางเลือกที่เหมาะที่สุดในหลายด้าน
- ความแตกต่างเล็กน้อยของผลลัพธ์อาจทำให้เกิดความแตกต่างของพฤติกรรมระหว่าง development build และ production build ได้
- ซอร์สโค้ดของผู้ใช้ถูกพาร์ส แปลง และซีเรียลไลซ์ซ้ำ ๆ โดยหลายเครื่องมือตลอด production build ทำให้เกิดโอเวอร์เฮดจำนวนมากที่หลีกเลี่ยงได้
- ในอุดมคติ Vite ควรใช้บันเดลเลอร์เพียงตัวเดียวที่ให้ประสิทธิภาพระดับเนทีฟ, มีทรานส์ฟอร์มในตัวเพื่อหลีกเลี่ยงโอเวอร์เฮดจากการพาร์ส/ซีเรียลไลซ์, มีอินเทอร์เฟซปลั๊กอินที่เข้ากันได้กับ Rollup และมีความสามารถควบคุมผลลัพธ์ของการ build ขั้นสูงที่เหมาะกับแอปพลิเคชันขนาดใหญ่
- นี่คือเหตุผลที่เราสร้าง Rolldown
- Rolldown เขียนด้วย Rust และสร้างอยู่บน Oxc ซึ่งปัจจุบันใช้ parser และ resolver ของมันอยู่ นอกจากนี้ยังมีแผนจะใช้ transformer และ minifier ของ Oxc ในอนาคตเมื่อพร้อมใช้งาน
- เป้าหมายระยะยาวคือทำให้ผู้ใช้ Vite สามารถเปลี่ยนไปใช้ Vite เวอร์ชันที่ภายในใช้ Rolldown ได้โดยมีแรงเสียดทานน้อยที่สุด (ไม่ว่าจะโดยตรงหรือผ่านเฟรมเวิร์ก)
- ขณะเดียวกัน Rolldown ก็จะสามารถใช้งานได้ทันทีในฐานะบันเดลเลอร์แบบสแตนด์อโลนด้วย
ความเข้ากันได้กับ Rollup และความแตกต่าง
- Rolldown มีเป้าหมายให้สอดคล้องกับ API และอินเทอร์เฟซปลั๊กอินของ Rollup มากที่สุด เพื่อให้สามารถนำไปใช้ได้อย่างง่ายดาย
- ในกรณีการใช้งานที่ไม่ซับซ้อน มันน่าจะสามารถทำหน้าที่แทน Rollup ได้ อย่างไรก็ตาม อาจมีความแตกต่างเล็กน้อยใน edge case โดยเฉพาะเมื่อเกี่ยวข้องกับตัวเลือกขั้นสูง
- แม้จะเริ่มต้นจากความตั้งใจที่จะพอร์ตจาก JS ไปยัง Rust แต่ไม่นานก็พบว่า หากต้องการให้ได้ประสิทธิภาพสูงสุด สิ่งสำคัญกว่าคือการเขียนโค้ดให้สอดคล้องกับวิธีการทำงานของ Rust
- สถาปัตยกรรมภายในของ Rolldown ใกล้เคียงกับ esbuild มากกว่า Rollup และลอจิกการแบ่งชังก์ก็อาจแตกต่างจากของ Rollup
- ขอบเขตของ Rolldown ก็กว้างกว่า Rollup และคล้ายกับ esbuild มากกว่า โดยรองรับ CommonJS และการ resolve
node_modules เป็นค่าเริ่มต้น และในอนาคตมีแผนจะรองรับการแปลง TypeScript / JSX และการย่อโค้ดด้วย
1 ความคิดเห็น