จาก Parcel สู่ Vite: เรื่องราวสั้น ๆ ของการย้ายโค้ด 100K LOC
เราได้ย้ายโปรเจค frontend ทั้งสามของเราจาก Parcel ไปเป็น Vite, และกระบวนการก็... ราบรื่น
เรื่องก่อนหน้า
เรามีสามโปรเจค frontend ที่ Logto: ประสบการณ์การลงชื่อเข้าใช้, Console, และ live preview. โปรเจคเหล่านี้ทั้งหมดใช้ TypeScript, React, และ SASS modules; รวมแล้วมีประมาณ 100K บรรทัดของโค้ด
เราเคยชอบ Parcel สำหรับความง่ายและการตั้งค่าแบบ zero-config. ฉันยังจำได้ถึงวันที่ตกใจกับความง่ายในการตั้งค่าโปรเจคใหม่ด้วย Parcel. คุณเพียงแค่รัน parcel index.html
แล้วปัง เหมือนมีเวทมนตร์.
ความง่ายของ Parcel เป็นเหตุผลหลักที่เรายึดติดกับมันมานาน แม้ว่าบางครั้งมันจะอารมณ์ไม่ดี เช่น:
- Parcel บางครั้งไม่สามารถจับกลุ่มโปรเจคได้เพราะมันไม่พบบาง chunk files ที่มีอยู่จริง
- มันต้องการการตั้งค่าที่ซ ับซ้อนเพื่อให้ทำงานกับ monorepo ของเราได้
- มันไม่รองรับ MDX 3 ตามค่าเริ่มต้น ดังนั้นเราต้องสร้าง custom transformer ขึ้น
- มันไม่รองรับ manual chunks (ณ ขณะที่เขียน ฟีเจอร์ manual chunks ยังอยู่ ในขั้นทดสอบเชิงทดลอง) ซึ่งโอเคในสถานการณ์ส่วนใหญ่ แต่บางครั้งคุณต้องการมัน
ทำไมเราถึงตัดสินใจย้ายไปที่อื่น?
- เราติดอยู่กับ Parcel 2.9.3 ซึ่งปล่อยเมื่อเดือนมิถุนายน 2023 ทุกครั้งที่มีการปล่อยเวอร์ชันใหม่หลังจากนั้น เราพยายามอัพเกรดแต่มันมักจะล้มเหลวด้วยข้อผิดพลาดในการสร้าง
- เวอร์ชันล่าสุดของ Parcel คือ 2.12.0, ปล่อยในเดือนกุมภาพันธ์ 2024. แม้ว่าจะมีการ commit แทบทุกวัน แต่ไม่มีการปล่อยเวอร์ชันใหม่ตั้งแต่นั้น
บางคนถึงกับเปิดการสนทนาเพื่อถามว่า Parcel ตายแล้วหรือไม่. คำตอบอย่างเป็นทางการคือไม่, Parcel ยังไม่ตาย แต่กำลังอยู่ในโหมดเรากำลังทำการ refactor ขนาดใหญ่และไม่มีเวลาสำหรับการปล่อยรอง. สำหรับเรา มันเหมือน "ตายเงียบ": เวอร์ชันล่าสุดที่เราใช้ได้คือเมื่อกว่าปีที่แล้วและเราไม่รู้ว่าเวอร์ชันถัดไปจะปล่อยเมื่อไหร่. มันดูเหมือนมันตายแล้ว, มันแสดงบทบาทเหมือนมันตาย, ดังนั้นมันตายสำหรับเรา.
ทำไมต้อง Vite?
เรารู้จัก Vite จาก Vitest. เมื่อหลายเดือนก่อน, เราเบื่อกับการรองรับ ESM ของ Jest (ใน testing) และต้องการลองสิ่งใหม่. Vitest ชนะใจของเราด้วยการรองรับ ESM แบบเนทีฟและความเข้ากันได้กับ Jest. มันมีประสบการณ์สำหรับนักพัฒนาที่น่าทึ่ง และขับเคลื่อนโดย Vite.
สถานะปัจจุบัน
คุณอาจมีการตั้งค่าที่ต่างกันในโปรเจคของคุณ แต่ปกติแล้วคุณจะพบว่า plugin replacements ในขณะที่ระบบนิเวศของ Vite กำลังบานสะพรั่ง นี่คือการตั้งค่าของเราในขณะที่ย้าย:
- Monorepo: เราใช้ PNPM (v9) workspaces เพื่อจัดการ monorepo ของเรา
- Module: เราใช้ ESM modules สำหรับทุกโปรเจคของเรา
- TypeScript: เราใช้ TypeScript (v5.5.3) สำหรับทุกโปรเจคพร้อม path aliases
- React: เราใช้ React (v18.3.1) สำหรับทุกโปรเจค frontend
- Styling: เราใช้ SASS modules สำหรับ styling
- SVG: เราใช้ SVGs เป ็น React components
- MDX: เรามี MDX ที่มีการรองรับ GitHub Flavored Markdown และ Mermaid
- Lazy loading: เราจำเป็นต้อง lazy load บางหน้าและ components ของเรา
- Compression: เราผลิต assets ที่ถูกบีบอัด (gzip และ brotli) สำหรับการสร้าง production
การย้าย
เราเริ่มการย้ายโดยการสร้างโปรเจค Vite ใหม่และทดลองเล่นกับมันเพื่อดูว่ามันทำงานอย่างไร. กระบวนการราบรื่นและการย้ายจริงใช้เวลาเพียงไม่กี่วัน.
รองรับอัตโนมัติ
Vite มีการรองรับอัตโนมัติสำหรับ monorepo, ESM, TypeScript, React, และ SASS. เราเพียงแค่ต้องติดตั้ง plugins และการตั้งค่าที่จำเป็น.