Import/Export โมดูลสไตล์ ES6 บน Node.js

เชื่อว่าปัจจุบันหลายท่านที่พัฒนาซอร์ฟแวร์ด้วย Node.js (node) เลือกที่จะเขียน node ด้วย ECMAScript[1] มากกว่าที่จะเป็น CommonJS[1] กันใช่ไหมละครับ เพราะด้วย syntax ที่สะดวกกว่า ทำให้ทำงานได้อย่างไหลลื่นขึ้น เว้นแต่ ที่เราต้องติดตั้ง transpiler[2] ไม่ว่าจะ Babel, SWC หรือ esbuild อย่างน้อยเราก็ต้องเสียพลังงานไปแล้ว 1 หน่วยในการติด ซึ่งในบ้างครั้งที่เราต้องการความเร็วในการขึ้นงานหรือต้องการที่จะลด dependencies (libraries)[3] ขอโปรเจ็คให้น้อยที่สุด เราจะทำยังไง ใน Node.js เวอร์ชั่น 12 ขึ้นไปมีคำตอบให้ครับ

เนื้อหา

อันที่จริงผู้พัฒนา Node.js มีความพยายามที่จะใส่ ECMAScript ใน Node.js ก่อนหน้าเวอร์ชั่น 8 เสียอีก เพียงแต่ยังไม่รองรับ syntax export/import และ syntax ดังกล่าวได้ถูกใส่เข้ามาใน Node.js เวอร์ชั่น 12 เป็นที่เรียบร้อยแล้ว ถ้าคุณใช้เวอร์ชั่น LTS และอัพเดทอยู่สม่ำเสมอ ก็ไม่ต้องกังวลอะไรอีกแล้ว สามารถใช้ ECMAScript ได้เต็มรูปแบบเลยครับ เว้นแต่ต้องปรับตั้งค่าอะไรนิดหน่อย

ในการจะใช้ ECMAScript ได้เต็มรูปแบบนั้นจะต้องเพิ่ม { "type:": "module" } ในไฟล์ package.json ซึ่งรองรับทั้ง npm, yarn และ pnpm ฉะนั้นไม่ต้องกังวลเรื่องความเข้ากันได้ (compatibility) ฉะนั้นสามารถทำได้เลย

และสิ่งที่ต้องระวังในการ import/export ของ Node.js นั้นคือทุกครั้งที่ import โมดูลที่เราเขียนจะต้องระบุนามสกุลของไฟล์เข้าไปด้วยเสมอ import { hello } from "./greeting.js" เป็นต้น ต่างจาก CommonJS ที่ไม่ต้องระบุนามสกุลของไฟล์ ส่วนการ import libraries ที่เราดาวน์โหลดมาใช้ไม่จำเป็นจะต้องระบุนามสกุลแต่อย่างใด เรียกได้ว่าสะดวกใช้มาก ๆ สำหรับนักพัฒนาที่ต้องการขึ้นงานแบบไวไว

บทสรุป

  1. Node.js 12 ขึ้นไปรองรับการ export การ import แบบ ECMAScript แต่ต้องเพิ่ม { "type": "module" } ใน package.json ก่อน
  2. การ import โมดูลจะต้องกำหนดไฟล์ให้ชัดเจนถึงขั้นที่ต้องระบุนามสกุลไฟล์

เชิงอรรถ

  1. transpiler ตัวแปลภาษาชนิดแปลงจากซอร์ฟโค้ดหนึ่งไปเป็นอีกซอร์ฟโค้ดหนึ่ง (Source to source) เช่น TypeScript, Babel, esbuild เป็นต้น
  2. ECMAScript เป็นไสตล์มาตราฐานการเขียนโค้ดรูปแบบหนึ่งของ JavaScript

อ้างอิง

ความคิดเห็น