10 คะแนน โดย xguru 2024-03-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • บันเดลเลอร์ 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 ความคิดเห็น

 
[ความคิดเห็นนี้ถูกซ่อน]