Node.js Global objects

ในบทนี้ เราจะแนะนำให้คุณรู้จักกับ Global objects บน Node.js มันเป็นออบเจ็คที่สามารถเข้าถึงได้จากทุกส่วนของโปรแกรมที่เขียนบน Node.js เราจะมาดูกันว่ามันคืออะไร และมีความสำคัญอย่างไรในการทำงานของ Node.js นี่เป็นเนื้อหาในบทนี้

  • Global objects ใน Node.js
  • Module wrapper ใน Node.js

Global objects ใน Node.js

Global objects เป็นออบเจ็คของ Node.js ที่ถูกนำเข้ามาในโปรแกรมอัตโนมัติเมื่อโปรแกรมเริ่มต้นทำงาน เช่นเดียวกันกับการเขียนโปรแกรมบนเว็บเบราว์เซอร์ คุณสามารถเข้าถึงออบเจ็คที่เป็น Global ซึ่งจำเป็นในการทำงานกับเว็บเบราว์เซอร์ได้ ยกตัวอย่างเช่น ออบเจ็ค document สำหรับเข้าถึงและจัดการกับ DOM หรือออบเจ็ค window สำหรับติดต่อกับอินเตอร์เฟซและควบคุมการทำงานของเบราว์เซอร์

เมื่อเราพูดถึง Global objects บน Node.js มันเป็นออบเจ็คที่เราสามารถเข้าถึงได้ทันทีภายในโปรแกรมที่เขียนบน Node.js โดยที่ไม่จำเป็นต้องโหลดหรือนำเข้าโมดูล โดยทั่วไปแล้ว Global objects ที่สามารถใช้ได้จะแบ่งออกเป็นสองประเภทได้แก่

  • ออบเจ็คมาตรฐานในภาษา JavaScript
  • ออบเจ็คของ Node.js เอง

เนื่องจาก Node.js เป็นสภาพแวดล้อมที่ใช้สำหรับรันโปรแกรมภาษา JavaScript ดังนั้นมันจะต้องให้ออบเจ็คและโมดูลทั้งหมดในภาษา JavaScript ที่เป็นไปตามข้อกำหนดของ ECMAScript นี่เป็นตัวอย่างของการใช้งานออบเจ็คมาตรฐานในภาษา JavaScript บน Node.js

javascript_objects.js
let url = new URL('http://marcuscode.com/');
console.log(url.toString());

let myMap = new Map();
myMap.set('metin', 1);
console.log(myMap);

และนี่เป็นผลลัพธ์การทำงานของโปรแกรม

http://marcuscode.com/
Map(1) { 'metin' => 1 }

ในตัวอย่างนี้ เราได้แสดงให้คุณเห็นถึงการใช้คลาสและออบเจ็คที่คุ้นเคยในภาษา JavaScript เราได้ใช้คลาส URL สำหรับสร้างออบเจ็คของลิงก์ คลาส Map สำหรับสร้างออบเจ็คเพื่อเก็บข้อมูลในรูปแบบของ Key/Value สุดท้ายฟังก์ชัน console.log นั้นใช้สำหรับแสดงข้อมูลออกทางหน้าจอ

ทั้งหมดที่คุณเห็นนั้นเป็นออบเจ็คมาตรฐานในภาษา JavaScript นั่นหมายความว่าคุณสามารถใช้งานมันได้ในทุกสภาพแวดล้อมการทำงาน ไม่ว่าจะเป็น Node.js หรือบนเบราว์เซอร์เองก็ตาม

สำหรับออบเจ็คประเภทที่สองเป็นออบเจ็คเฉพาะของ Node.js เอง มันเป็นออบเจ็คที่ช่วยให้เราสามารถรับเอาข้อมูล และติดต่อกับอินเตอร์เฟซของระบบปฏิบัติการได้ นั่นคือ process ซึ่งออบเจ็คนี้ประกอบไปด้วยข้อมูลและเมธอดที่จำเป็นสำหรับการเขียนโปรแกรมบน Node.js นี่เป็นตัวอย่าง

console.log(`Process ID ${process.pid}`);
console.log(`Memory usage`, process.memoryUsage());

ในตัวอย่างนี้ เราใช้ออบเจ็ค process สำหรับอ่านค่า Process ID ปัจจุบันที่กำลังใช้รัน Script นี้จากการอ่านค่าจาก Property process.pid และใช้เมธอด memoryUsage สำหรับรับเอาข้อมูลเกี่ยวกับการใช้งานหน่วยความจำบนระบบ

นอกจากนี้ เรายังสามารถเข้าถึง Input/Output ของระบบได้โดยตรงผ่านออบเจ็ค process.stdin และ process.stdout ซึ่งสองออบเจ็คนี้ใช้สำหรับการรับค่าและการแสดงผลบน Node.js

// Access standard input interface
process.stdin;
// Access standard output interface
process.stdout;

นอกจากนี้ยังมีเมธอดและออบเจ็คอื่นๆ ที่เราสามารถเข้าถึงได้ผ่านออบเจ็ค process ซึ่งสามารถช่วยอำนวยความสะดวกให้กับเราในการเขียนโปรแกรมบน Node.js

Module wrapper ใน Node.js

Node.js ยังมีออบเจ็คที่สามารถเข้าถึงได้ในทุกโมดูล (ไฟล์ของโปรแกรม) ซึ่งออบเจ็คเหล่านี้ประกอบไปด้วย exports, require, module, __filename และ __dirname ออบเจ็คเหล่านี้เป็นออบเจ็คที่มีการทำงานเฉพาะสำหรับแต่ละโมดูล โดยมันม่ีหน้าที่การทำงานดังต่อไปนี้

  • exports: เป็นออบเจ็คสำหรับส่งออบเจ็คออกจากโมดูลเพื่อนำไปใช้งานในโมดูลอื่น
  • require: เป็นเมธอดสำหรับนำเข้าออบเจ็คจากโมดูลอื่นเข้ามาใช้งานในโมดูลปัจจุบัน
  • module: เป็นออบเจ็คที่มีข้อมูลเกี่ยวกับโมดูลที่สามารถนำมาใช้งานได้ในโปรแกรม
  • __filename: เป็นชื่อไฟล์ของโมดูลปัจจุบันที่โปรแกรมกำลังทำงานอยู่
  • __dirname: เป็นชื่อโฟล์เดอร์ของโมดูลปัจจุบันที่โปรแกรมกำลังทำงานอยู่

ในการทำงานเบื้่องหลังของ Node.js ก่อนที่แต่ละโมดูลจะทำงาน ทุกอย่างนั้นถูกครอบและรันใน Wrapper ด้วยฟังก์ชันต่อไปนี้

(function (exports, require, module, __filename, __dirname) {
    // Module code actually lives in here
});

นั่นจึงเป็นเหตุผลว่าทำไมเราสามารถใช้งานมันได้ในโมดูล และมันช่วยทำให้ Node.js สามารถปรับแต่งการทำงานของฟังก์ชันขึ้นกับโมดูลที่ทำงาน และทำให้โมดูลทั้งหมดในระบบสามารถเชื่อมต่อกันได้อย่างมีประสิทธิภาพ และง่ายสำหรับนักพัฒนาในการเขียนโปรแกรม

แม้ว่าออบเหล่านี้จะเหมือน Global ออบเจ็ค แต่ความจริงแล้วมันไม่ใช่ เหตุผลก็เพราะมันถูกนำเข้าอัตโนมัติโดย Module wrapper เหมือนกับที่เราได้อธิบายไว้

หมายเหตุ: บน Node.js ไฟล์ของโปรแกรมและโมดูลเป็นสิ่งเดียวกัน นั่นหมายความว่าเมื่อคุณสร้างไฟล์ใหม่มันหมายความว่าคุณสร้างโมดูลด้วยเช่นกัน

นี่เป็นตัวอย่างของการใช้งานออบเจ็ค module สำหรับส่งออกออบเจ็คออกไปที่นอกโมดูล และฟังก์ชัน require ในการนำเข้าโมดูลอื่นมาใช้งานในโมดูลปัจจุบัน ก่อนอื่นเราสามารถโมดูล utils.js สำหรับเก็บฟังก์ชันเพื่อที่จะนำไปใช้งานในโมดูลอื่นดังนี้

utils.js
function hello(name) {
    console.log(`Hello ${name}!`);
}

module.exports = hello;

เพื่อทำให้ฟังก์ชัน hello สามารถนำไปใช้ได้โดยโมดูลอื่น เราส่งมันออกไปโดยกำหนดค่าผ่านออบเจ็ค module.exports จากนั้นในโมดูล index.js เรานำเข้าโมดูลดังกล่าวมาใช้งาน

index.js
const hello = require('./utils');
hello('John');

เพื่อนำเข้าโมดูลอื่นมาใช้งานเราใช้ฟังก์ชัน require โดยการส่งชื่อโมดูลเป็นพารามิเตอร์ของฟังก์ชัน นี่จะส่งค่ากลับเป็นออบเจ็คที่เราส่งออกมาผ่านทางออบเจ็ค module.exports ในกรณีนี้คือฟังก์ชัน hello

และนี่เป็นผลลัพธ์การทำงานของโปรแกรม

Hello John!

จะเห็นว่าการใช้งานโมดูลสามารถช่วยให้เราแบ่งโค้ดออกเป็นส่วนๆ ได้ ซึ่งนี่จะช่วยให้การพัฒนาและการดูแลรักษาทำได้ง่าย เมื่อโปรเจ็คของเรามีขนาดใหญ่ คุณจะได้เรียนเกี่ยวกับโมดูลอีกครั้งในบทของโมดูล

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับ Global ออบเจ็คบน Node.js เราได้พูดถึงออบเจ็คสองประเภทได้แก่ ออบเจ็คมาตรฐานในภาษา JavaScript และออบเจ็คของ Node.js เอง นอกจากนี้ เราได้พูดถึงออบเจ็คที่คุณสามารถใช้งานได้ในโมดูลที่มอบให้โดย Module wrapper