ลองหัดใช้งาน esbuild เบื้องต้น
วันนี้ผมได้ลองใช้งาน esbuild ครั้งแรก ซึ่งก่อนหน้านี้ เคยได้ยิน และได้เห็นผ่านตา แต่ไม่เคยได้จับมันจริงๆ เพราะส่วนใหญ่ผมก็จะเป็นแค่ผู้ใช้งาน Library/ Frmework เลยไม่ได้ลงไปถึงขั้นต้อง config webpack/esbuild อะไรพวกนั้น
หลังจากได้ลองเล่นไปนิดๆหน่อย ก็ลองมาเขียนบทความบันทึกไว้ครับ ซึ่งส่วนใหญ่ Reference ผมก็อ่านจาก Official esbuild ครับ
esbuild คืออะไร?
esbuild เป็น JavaScript bundler/Compiler ที่เขียนด้วยภาษา Go คล้ายๆกับ Webpack, Rollup หรือ SWC คือทำหน้าที่ รวมไฟล์ แปลงไฟล์ minify ต่างๆ
Feature หลักๆ คือ
- ES6 และ CommonJS
- รองรับ Tree shaking (คือ module ไหนไม่ได้ import ก็ไม่ถูกยัดรวม bundle)
- มี API สำหรับ JavaScript และ Go
- รองรับ TypeScript และ JSX
- Sourcmap และ Minify เป็นต้น
Install esbuild
เริ่มต้น เราจะทำการสร้างโปรเจ็คขึ้นมาก่อน ผมตั้งชื่อให้มันว่า try-esbuild
ละกัน และก็ initial project ด้วย yarn
จากนั้นทำการ install esbuild
ลงไป
ตัว esbuild เราก็จะสามารถเรียกจาก folder นี้ได้แล้ว:
First bundle
ต่อมาลอง build จริงๆ ด้วยการใช้ React และ ReactDOM กัน ทำการติดตั้ง dependencies:
ต่อมาสร้างไฟล์ app.jsx
ขึ้นมา มีโค๊ดดังนี้
ตัวโค๊ดด้านบน ใช้ความสามารถของ react เพื่อ server render ทำให้เราสามารถรันด้วยคำสั่ง node
ได้
ซึ่งถ้าเรารันตรงๆ แบบนี้ จะ error:
ต้องทำการ bundle file ด้วย esbuild ก่อน แบบนี้:
จะได้ไฟล์ผลลัพธ์และไฟล์ output คือ out.js
เมื่อได้ไฟล์นี้เราสามารถรันด้วยคำสั่ง
React App
เผื่อยังไม่เห็นภาพ ลองเป็น React ฝั่ง Client บ้าง ผมสร้างโฟลเดอร์มาใหม่ ขื่อ src ข้างในมีไฟล์ App.jsx ดังนี้ (เอามาจาก template ของ create-react-app)
และไฟล์ src/index.jsx
เป็นแบบนี้
ต่อมา ก็ทำการ bundle ไฟล์ ไว้ที่โฟลเดอร์ dist
(ใช้ --outdir
แทน --outfile
ก่อนหน้านี้)
สร้างไฟล์ index.html
ขึ้นมา
ทดลองเปิด Local server
หรือใช้ Serve
จะเห็นข้อความว่า 👋 Hello esbuild!
Build scripts
จะดีกว่ามั้ย ถ้าเราเปลี่ยนคำสั่งไปใช้ package scripts แทน ที่จะต้องมาพิมพ์บ่อยๆ? เพิ่มลงไปใน package.json
เวลาใช้งาน ก็แค่:
นอกจาก Command line แล้ว เราสามารถใช้ JavaScript API ได้ เหมือนกัน เช่น ผมตั้งชื่อว่า build.js
เวลาใช้งานก็ใช้ node เพื่อรัน bundle
จะได้ผลลัพธ์เท่ากับแบบ command line
Build browser
ก่อนหน้านี้เรา build แต่ว่ายังไม่ได้ minify ให้มันเลย ไฟล์ใหญ่มาก เราสามารถ minify, sourcemap ให้มัน หรือจะกำหนด browser support ให้มันก็ได้ เช่น
ทดลองเพิ่ม minify
และสังเกตขนาดไฟล์ดูครับ
นอกจากนี้เราก็สามารถ bundle ไฟล์ css ได้เช่นกันครับ คำสั่งก็เหมือนกัน
Analyze
เราสามารถใช้ --analyze
เพื่อดูรายละเอียดไฟล์ได้ด้วย
จะได้ผลลัพธ์ประมาณนี้
สรุป
วันนี้ก็ลองเล่น esbuild ไปแบบเบื้องต้น ก็ทำให้มองเห็นภาพการทำงานมากขึ้น สิ่งที่น่าสนใจและน่าลองศึกษาต่อคือการ bundle รวมไฟล์ แยกไฟล์ แยกโฟลเดอร์ อะไรพวกนั้น แล้วก็การ generate hash ให้ไฟล์ การทำหรือใช้ plugin ต่างๆ รวมถึงพวก watch / hot reload และ WASM
Happy Coding ❤️
Reference
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust