Skip to content

ปัญหาที่เจอเมื่อใช้ Bun ทำงาน

Published
 at 01:46 PM

By : Parinya T. | 2 min read

Table of contents

Show all topics

บ่นก่อน

เมื่อไม่นานมานี้ Bun เครื่องมือทำมาหากินคู่แข่ง npm, pnpm ได้ออกเวอร์ชั่น 1.0 สักที หลังจากที่อยู่ในสถานะ beta มานานพอสมควร แอบสารภาพว่าในช่วง v.0.8 เป็นต้อนมา ผมได้เอามาใช้ในการ build เว็บนี้ด้วย แต่ว่าก็ไม่ได้ใช้งานได้อย่างราบรื่นนัก แต่เดี๋ยวเอาไว้กล่าวถึงอีกครั้ง ช่วงแรกขออวยก่อน

ผมขอข้ามเรื่องเชิงเทคนิคของ Bun เพราะน่าจะมีหลายๆท่านที่เชี่ยวชาญกว่าผมได้เขียนถึงเยอะแล้ว ผมจะขอพูดถึงในมุมของผู้ใช้งานทั่วไป ที่เอามาใช้ run install กับ build ไม่ได้หวือหวามากมายอะไร

เร็วจริงๆ

ต้องบอกว่าครั้งแรกที่ได้ยินชื่อ Bun ในหน้าเว็บมีการเคลมตัวเองไว้ว่า เร็วกว่า javascrip runtime ตัวอื่นๆ แถมยังมีการเอากราฟผลการทดสอบมาแปะไว้พร้อม (อะไรจะขนาดนั้น)

พอได้เอามาทดลองใช้งานก็พบว่า มันก็เร็วจริงๆ ทั้งในแง่ของการ install dependencies ไปจนถึงการสั่ง build หน้าเว็บ โดยผมเปรียบเทียบกับการใช้งาน pnpm ในงานเดียวกันเปรียบเทียบกัน ก็รู้สึกได้ว่าเร็วกว่านิดหน่อย

เรื่องจุกจิกที่เจอ

นอกเหนือจากความเร็วที่น่าประทับใจแล้ว ก็ไม่ได้มีจุดอื่นที่แตกต่างจนต้องตื่นเต้นอะไรมากมายนัก แต่ปัญหาเดิมๆตั้งแต่ตอนยังไม่ release 1.0 ก็ยังไม่ได้ถูกแก้และมีคนเจอปัญหาเหล่านี้อยู่เรื่อยๆ

มีปัญหากับ sub-dependency

Bun มีปัญหากับ sub-dependency ที่ถูกเรียกใช้จาก package บางตัว ซึ่งผมมีการใช้ Jampack โดยตัวมันจะเรียกใช้ Sharp เป็น sub-dependency ในทำการ process ไฟล์รูปภาพ โดยเว็บเฟรมเวิร์คบางตัวก็มีการเรียกใช้งานตัวนี้ตั้งแต่แรก

โดยปัญหาก็คือ ในขั้นตอนการ run install นั้น บรรดา sub-dependency ทั้งหลายจะไม่ถูกติดตั้งทันที เมื่อเปรียบเทียบกับการ run install จาก runtime ตัวอื่นๆ

ทางแก้แบบกำปั้นทุบดิน คือ ต้องสั่ง install มันเอง

เช่น ผมใช้ jampack (ที่มี sharp เป็น sub-dependency อีกที) หลังจาก bun install ผมต้อง cd เข้าไปในโฟลเดอร์ของ sharp แล้วไปรัน bun install อีกครั้ง

cd ./node_modules/sharp && bun install

สามารถเอาไปเขียนไว้ postinstall ที่ไฟล์ package.json ก็ได้

"postinstall": "cd ./node_modules/sharp && bun install"

แต่ผมไม่ได้ทำแบบนั้น เพราะมีการใช้งาน renovate bot ในการอัพเดท node package ต่างๆอยู่ด้วย แล้วการที่เขียน postinstall ไปแบบนั้น ทำให้เกิดปัญหา บอทจะมองว่า artifact error ที่ตอนแรกผมก็คิดว่าด้วยความที่ Bun ค่อนข้างใหม่อยู่ เลยทำให้ renovate อ่าน lockfile ไม่ได้ แต่ปัญหาไม่ได้อยู่ที่ตรงนั้น เพราะเมื่อลอง bun install —yarn เพื่อให้ export yarn.lock ออกมาด้วย ก็พบว่ายังเป็นปัญหาอยู่ เลยได้ใช้เวลาแก้ปัญหาจุดนี้อยู่หนึ่งวัน จนได้ข้อสรุปออกมาตามที่ได้เขียนไป

สรุป ทำบน Local dev ไม่มีปัญหา สบายๆเลย แค่มันตีกับ renovate ล้วนๆ

สุดท้ายผมแก้ด้วยการเขียน github action ตอน build ให้ทำการ install ก่อนแล้ว cd เข้าไปติดตั้ง sharp ตามหลังเองต่างหาก โดยแยกออกมาเป็น script ใหม่แทน ไม่เอาเข้าไปอยู่ใน postinstall แล้ว เป็นอันจบ build & deploy ผ่าน

เล่าเสริมนิดหน่อย

แต่เดิมตอนที่ bun ยังไม่ได้ release 1.0.0 ออกมา ผมใช้วิธีการลักไก่ ใช้ pnpm ในการ run install package ก่อน แล้วใช้ bun run build ตามทีหลัง ก็พบว่าใช้วิธีนี้ก็ได้ แต่ตอนเขียน ci/cd ก็ไม่รู้ว่าต้องมาเสียเวลาโหลด runtime สองตัวเพื่ออะไร งานก็ไม่ได้ใหญ่อะไรมาก

lock file ใหม่ เนื้อเดิม ทุกครั้งที่ install

อันนี้ไม่รู้ว่าเป็นเพราะอะไร เหมือนจะเคยเป็นมาก่อนในเวอร์ชันก่อนตัวเต็ม และได้ถูกแก้ไขไปแล้ว แต่ก็กลับมาเป็นอีกเรื่อยๆ เดี๋ยวเป็น เดี๋ยวหาย

ไม่ได้กวนใจอะไรมากนัก แค่พอทำงานกับ git แล้วมันกวนใจทุกที

สรุป