หายกังวลเรื่อง linter ด้วย Husky🐶 (node.js)

Boripach K
Tri Petch Digital
Published in
2 min readMar 4, 2022

ในระบบการทำงานแบบ Agile นั้น ปฎิเสธไม่ได้เลยว่าเราจำเป็นต้องใช้เครื่องมือและหนทางทุกอย่างเพื่อหลีกเลี่ยงการทำงานที่ไม่ efficient และป้องกันความผิดพลาดอันไม่พึงประสงค์ ดังนั้น linting และ unit test เป็นสิ่งสำคัญที่จะช่วยเราตรวจสอบและจัดโค้ดของเราให้อยู่ใน format เดียวกันกับทุกคนในทีม/โปรเจค นั้นๆ เพราะบางครั้ง human error จาก developer ก็สามารถเกิดขึ้นได้ งานเร่งหรือปัจจัยภายนอกอื่นอาจทำให้ devs ลืมเรื่องเล็กๆ น้อยๆ เหล่านี้

วิธีที่เราจะไม่ลืมโดยที่ไม่ให้ git action หรือ CI/CD บน Git เตือน error, lint หรือ build failed คือตั้งค่าโปรเจคให้ run lint และ unit test ก่อนที่จะ git commit

โดย git มี feature pre-commit, pre-push etc… ไว้ให้เราสามารถ config ได้ตามที่ทีมต้องการ

🔸 husky installing🔸

Repo ของเจ้าหมาน้อย Husky ขายไว้ว่า 💸

Modern native Git hooks made easy

Husky improves your commits and more 🐶 woof!

เริ่มกันเลย

ทำการติดตั้ง husky ใน project ของเรา

(1) Install:

npm install —-save-dev husky

(2) config เพิ่มใน `package.json` เพื่อให้ pre-commit ทำงาน:

{
...
"husky": {
"hooks": {
"pre-commit": "npm run lint"
}
}
...
}

(3) ทดสอบแก้ไฟล์และ commit เพื่อ trigger husky

ใส่มั่วใส่นัว
lint error ทันทีเมื่อ commit

(4) เป็นอันเสร็จสิ้น พิธีกรรมการติดตั้ง! ง่ายมากเสียพลังงานไปไม่ถึง 1 cal
หลังจากนี้เมื่อสั่ง commit ด้วย git commitตัวnpm run lint ก็จะทำงานทันที หมดกังวลเรื่องลืมเช็ค lint ด้วยน้องหมา husky

*แต่ก็ต้องระวังหากทีมใช้ tools อื่นในการ commit ที่ไม่ใช่ command git commit

###(5) ในกรณีที่ตัว husky ไม่ทำงานตามที่ config pre-commit หรือ hook อื่นๆได้ ให้ทำตามขั้นตอนดังนี้ เพื่อบังคับให้ lib ทำ correction จาก latest version

npm uninstall husky

npm install -D husky@4

npm install -D husky

สรุปข้อดีของการใช้ husky บังคับให้รัน Linter

✅ Prevent Errors:
ปกป้องและป้องกันภัยอันตรายจากข้อผิดพลาดทั่วไปของคนเขียนโค้ด
✅ Maintainability:
บังคับให้ code เป็น format เดียวกันรวมถึง naming เพื่อสร้าง readable code ที่ดีในการ maintain project ต่อ
❌ Unsuitable rules:
กฎของ linter จำเป็นต้อง config ให้เหมาะสมกับตัวโปรเจคเป็นหลัก อาจไม่รองรับสไตล์การโค้ดของทุกคนในโปรเจคได้ 😅

--

--