การ import/export ของ nodejs


เวลาเราเขียนโค้ด nodejs หลายๆไฟล์แล้วต้องการนำฟังก์ชันของอีกไฟล์หนึ่งมาใช้ให้เราทำการ export ฟังก์ชันในไฟล์ที่ต้องการให้ไฟล์อื่นมาเรียกใช้ก่อน  จากนั้นไฟล์ที่ต้องการใช้งานฟังก์ชันให้ทำการ import ฟังก์ชันนั้นเข้ามา

จากตัวอย่างโค้ดด้านล่างสมมติให้มี 2 ไฟล์ ชื่อไฟล์ main.js และ a.js โดยไฟล์ a.js จะทำการ export ฟังก์ชันให้ไฟล์อื่นใช้  ส่วนไฟล์ main ก็จะทำการเรียกใช้ฟังก์ชันโดยการ import 


// File a.js
function x2( num ){
    return num * 2
}

function x3( num ){
    return num * 3
}

module.exports = {
    x2,
    x3
}



// File main.js
const multiply = require("./a.js")

console.log(multiply.x2(2))
console.log(multiply.x3(2))


// output
4
6


จากตัวอย่างโค้ดด้านบนวิธี export ฟังก์ชันคือให้ใช้คำสั่ง module.exports สร้างเป็น object ( ตามตัวอย่างที่มี {   } ) แล้วใส่ชื่อของฟังก์ชันที่ต้องการ export ลงไปในแถบปีกกาเปิดปิด   ส่วนฝั่งไฟล์ main.js ให้ import ด้วยคำสั่ง require โดยให้ใส่ path ของไฟล์ที่ต้องการ import ฟังก์ชันเข้ามา  เมื่อ import เข้ามาแล้ว  ตัวแปรชื่อ multiply ( มาจากตัวอย่างด้านบน )  จะสามารถใช้ฟังก์ชันในไฟล์ที่ import มาได้เลย

ต่อไปนี้จะเป็นอีกรูปแบบของการเขียน a.js เพื่อ export ฟังก์ชัน




// File a.js version 2
module.exports = {
    x2: function( num ){
            return num * 2
        },
    x3: function( num ){
            return num * 3        
        }
}


ต่อไปนี้จะเป็นการ import แบบ ES6 จะแตกต่างกัน require อย่างไรดูตามตัวอย่างด้านล่างได้เลย


import defaultExport from "module-name"
import * as name from "module-name"
import { export1 } from "module-name"
import { export1 as alias1 } from "module-name"
import { export1 , export2 } from "module-name"
import { export1 , export2 as alias2 } from "module-name"


ต่อไปเรามาดูทีละตัวกันว่าความหมายและการใช้งานอย่างไร

import defaultExport from "module-name"
นี่คือการ import จาก module ที่ใช้ export default ส่วนมากมักจะเป็น module ที่ export class หรือฟังก์ชันตัวเดียวออกมา  ซึ่งใน React ใช้บ่อยมาก export default

import * as name from "module-name"
import ทุกฟังก์ชันใน module แล้วตั้งชื่อว่า name เพื่อนำไปเรียกใช้งาน

import { export1 } from "module-name"
import แค่ฟังก์ชันเดียวจาก module ซึ่ง module อาจ export หลายฟังก์ชัน

import { export1 as alias1 } from "module-name"
import ฟังก์ชันเดียวจาก module พร้อมตั้งชื่อใหม่เพื่อนำไปใช้

import { export1 , export2 } from "module-name"
import 2 ฟังก์ชันจาก module

import { export1 , export2 as alias2 } from "module-name"
import 2 ฟังก์ชันจาก module แต่ตั้งชื่อใหม่แค่บางฟังก์ชันเพื่อนำไปใช้

ส่วนมากมักจะไม่ค่อยตั้งชื่อ object ใหม่ที่ import เข้ามาสักเท่าไหร่  ยกเว้นกรณีชื่อฟังก์ชันที่ import เข้ามามีชื่อที่ยาวมาก  จึงเหมาะแก่การตั้งชื่อใหม่ให้สั้นลง  
ข้อควรระวัง ในการ import/export module ของ nodejs ถ้าให้ a.js require b.js และให้ b.js  requie a.js จะทำให้เกิด circlular module เกิด infinity loop ทำให้เกิด error ขึ้น ดังนี้ให้จัดโครงสร้างการ import/export ให้ดี

ความคิดเห็น