Module Import/Export ใน JavaScript
การเขียน Javascript ทุกอย่างเก็บไว้ใน ไฟล์ๆเดียว จะทำให้การแก้ไขนั้นเป็นไปได้ยาก ในบทความนี้เราจะมาแนะนำวิธีการแยก Javascript ออกเป็น Module ต่างๆ เพื่อให้การแก้ไขและจัดการ JavaScript ได้ง่ายขึ้น
กำหนด Type ของ JavaScript เป็น Module
เริ่มต้นที่ index.html เราจะทำการ import JavaScript เข้ามาโดยกำหนด type=module ซึ่งการกำหนดเป็น module จะเป็นการบอก browser ว่าภายใน JavaScript ที่นำเข้ามาใช้งานอาจมีการ import JavaScript ไฟล์อื่นๆเพิ่มเข้ามาอีกก็ได้ และการกำหนด type=module จะเป็นการบอก browser ให้ Load JavaScript เข้ามาแบบ Defer (Load JavaScript แบบ Asynchronous และทำการ execute Javascript หลังจากที่แปล HTML เสร็จแล้ว จะไม่มีการหยุดการทำงานของ HTML Parser เลย)
|
|
ถ้าไม่ได้กำหนด type=module จะขึ้น error ว่า Can’t use import statement outside a module
แยกไฟล์ออกเป็น Module
ขั้นตอนต่อไปก็เป็นการสร้างไฟล์ Customer ขึ้นมาโดยที่ Customer.js นั้นจะสามารถ export สิ่งต่างๆเหล่านี้ออกมาได้
- JSON(Object)
- Class
- Function
- Anonymous Function
การ export ออกมามีได้หลายลักษณะดังนี้
Export JSON(Object)
รูปแบบแรกเป็นการ export JSON(Object) ออกมาโดยนำ keyword export ไปวางไว้หน้า object ตัวที่ต้องการ export ออกมาได้เลย
|
|
หรือจะเขียนแบบนี้ก็ได้ ถ้าเราต้องการระบุสิ่งที่ต้องการ export ออกไปให้ชัดเจนเลย เราจะนำ export ไปไว้ด้่านล่าง เพื่อให้หาได้ง่าย บางครั้งวางไว้หน้าตัวแปรอาจมองหาได้ยาก ยิ่ง code ที่ยาวมากๆ ยิ่งหายาก
|
|
เราสามารถใช้ keyword default เพื่อที่จะบอกว่าเวลา export ออกไปเราจะให้มันถูกเก็บอยู่ในตัวแปรที่ชื่อว่า default ซึ่งเราจะเห็นความแตกต่างในการใช้ในหัวข่้อการ import module เข้าไปใช้งาน
|
|
เวลาเรา export default จะไม่ใช้วงเล็บ เพราะสิ่งที่ return ออกไปจะอยู่ในตัวแปร default
Export Class
การ export ออกไปทั้ง class เลยจะทำให้ code นั้นมีความยืดหยุ่นกว่าการ export ออกไปทั้ง object เนื่องจากเราสามารถกำหนด parameters ที่ส่งเข้ามาให้กับ constructor เพิื่อสร้าง object ในแบบที่เราต้องการได้
|
|
Export Functions
รูปแบบนี้เป็นการเลือก export ออกมาแค่บาง function เท่านั้น ไม่ได้ต้องการทั้ง object โดยเราอาจแค่อยากให้เรียกใช้งานเฉพาะบาง function หรือ เราอาจมี code เก่าที่เขียนด้วย JavaScript ES5 ที่เป็น function อย่างในตัวอย่างนี้
|
|
Export Anonymous Function
การ export anonymous function ออกมาใช้ในกรณีที่เราต้องการ export ทั้ง context ออกมาเลยโดยที่ไม่ได้อยากตั้งชื่อให้มันซ้ำซ้อน โดยเราจะ export แบบนี้
|
|
Import JavaScript Module
ในไฟล์ script.js(ที่ Load เข้ามาใน index.html) เราจะ import เอา JavaScript Module เข้ามาใช้งานซึ่งจะมีกี่ Module ก็ได้
|
|
หลัง from จะเป็น relative path ไปยัง JavaScript Module ที่อาจวางไว้ใน sub-folder ย่อยๆลงไปก็ได้ ในตัวอย่างนี้่ใช้ ./customer.js เพราะ scirpt.js กับ cusotmer.js อยู่ใน folder เดียวกัน
ถ้าหลังจาก from เริ่มต้นด้วย “/” จะใช้การกำหนด path แบบ absolute path ซึ่งจะเริ่มต้นที่ root
ในตัวอย่างนี้เราแค่ import Customer.js เข้ามาเพียง module เดียวเท่านั้น แต่ในการใช้งานจริงเราสามารถ Load JavaScript Module อื่นๆเข้ามาอีกกี่ตัวก็ได้
ถ้าเราต้องการเปลี่ยนชื่อ object ที่ export ออกมาให้เป็นชื่ออื่นสามารถใช้ keyword as ได้ ยกตัวอย่างเช่น ถ้าเราต้องการจะเปลี่ยนจาก customer เป็น member เราจะเขียนแบบนี้
|
|
หรือเราสามารถ import แบบ * ก็ได้ การ import แบบ * JavaScript จะทำการเก็บทุกสิ่งที่ export ออกมาจาก customer.js ไปไว้ในตัวแปรที่เราตั้งขึ้น เช่น ในตัวอย่างเราจะนำทุกอย่างที่ export ออกมาไปไว้ในตัวแปรชื่อ member
|
|
Import Constant
เวลาเราเรียกใช้งาน ถ้าเรา export constant ออกมาเราจะเรียกแบบนี้
|
|
ถ้าเราใช้ export default customer จะต้องเขียนแบบนี้
|
|
Import Class
ถ้าเรา export ออกมาเป็น class เราจะเรียกใช้แบบนี้
|
|
Import Function
ถ้าเรา export ออกมาเป็น function เราจะเรียกแบบนี้
|
|
Import Anonymous Function
และถ้าเรา export anonymous function ออกมาเราจะต้องเรียกแบบนี้
|
|
เราจะใช้การ export anonymous function ออกมาเก็บไว้ในตัวแปรที่ชื่อ default แล้วก็ทำการ execute anonymous function นี้ทันทีเราเลยต้องมี วงเล็บต่อท้าย default