Bun 1.4 รันหลาย Script พร้อมกัน: ใช้ --parallel โดยยังอ่าน Log รู้เรื่อง
pipeline ที่รัน build แล้วค่อย lint ทั้งที่สองงานไม่พึ่งกัน กำลังเสียเวลารอแบบไม่จำเป็นครับ Bun 1.4 เพิ่ม bun run --parallel เพื่อเริ่มหลาย script พร้อมกันและใส่ prefix ให้ log แยกต้นทางได้
WHY: เร็วขึ้นเมื่อ Dependency Graph อนุญาต
คำว่า parallel ไม่ได้ทำให้งานเร็วขึ้นเสมอ ถ้า script หนึ่งสร้างไฟล์ที่อีก script ต้องอ่าน การเริ่มพร้อมกันจะเปลี่ยนจากช้าเป็น flaky ทันที ประโยชน์เกิดกับงานอิสระ เช่น typecheck กับ lint หรือ test ของ workspace ที่ไม่เขียน artifact ร่วมกัน
เอกสาร Bun แยก --parallel สำหรับงานพร้อมกัน และ --sequential สำหรับงานตามลำดับ เมื่อใช้กับ workspace filter Bun ยังพิจารณาลำดับ dependency ของ package ให้ แต่เราไม่ควรใช้กลไกนั้นแทนการประกาศ input/output ที่ชัดเจน
HOW: ทำ Script เล็กให้ทดสอบแยกได้ก่อน
ไฟล์ worker ตัวอย่างรับชื่องานและตรวจ input เอง จึงรันเดี่ยวได้ ก่อนนำไปประกอบใน command แบบขนาน
const job = Bun.argv[2] ?? "check";
const allowed = new Set(["build", "lint", "test", "check"]);
if (!allowed.has(job)) {
throw new Error("unknown job: " + job);
}
const result = { job, ok: true };
if (result.ok !== true) {
throw new Error("job did not complete");
}
console.log(JSON.stringify(result));
เมื่อแต่ละ script ผ่านเดี่ยวแล้ว จึงรวมใน package.json และเรียกพร้อมกัน
bun run --parallel build lint test
ใน monorepo ใช้ --filter จำกัด package ก่อน เช่นรันเฉพาะ workspace ที่เปลี่ยน หลีกเลี่ยง --no-exit-on-error ใน gate สำคัญถ้าเราไม่ได้ตั้งใจเก็บผลล้มเหลวทุกงาน เพราะ pipeline ควรคืน exit status ที่คนและ CI เข้าใจตรงกัน
วาง Resource Budget ก่อนเปิดพร้อมกัน
สามงานที่แต่ละงานใช้ CPU ทุก core อาจแย่งกันจนช้ากว่ารันทีละตัว เช่นเดียวกับ test ที่เปิด database ชุดเดียวหรือเขียน coverage file เดียวกัน ให้ดู CPU, RAM, file outputs และ port ก่อนจัดกลุ่ม
log prefix ช่วยบอกว่างานใดพิมพ์บรรทัดนั้น แต่บรรทัดจากหลาย process ยังสลับกันได้ หากต้องอ่าน stack trace ยาว ให้เก็บ artifact แยกไฟล์หรือ rerun เฉพาะ script ที่ล้มแบบเดี่ยวหลังรอบแรก
Recap
- พิสูจน์ว่า script แต่ละตัวรันเดี่ยวผ่านและไม่เขียน resource ร่วมกัน
- ใช้
--parallelกับงานอิสระ และ--sequentialเมื่อมีลำดับจริง - จำกัด workspace ด้วย filter เพื่อลดงานที่ไม่เกี่ยวข้อง
- ให้ failure ส่ง exit code ชัดและเก็บ log แยกเมื่อวิเคราะห์ยาก
พรุ่งนี้เลือก build กับ lint หนึ่งคู่ วัดเวลาก่อนและหลังโดยไม่เปลี่ยนอย่างอื่น แล้วเก็บแบบขนานเฉพาะเมื่อผลนิ่งครับ