• בלוג
  • מה אפשר לעשות עם ES Modules ב Node.JS

מה אפשר לעשות עם ES Modules ב Node.JS

14/02/2023

גירסאות עדכניות של Node.JS כבר תומכות בצורה מובנית ב ES Modules, ואפילו מציעות כמה שיפורים על פני עבודה בדפדפן. בואו נראה כמה טכניקות מרכזיות של עבודה עם ES Modules ב Node.JS.

1. הגדרת פרויקט שמשתמש במודולים

עבור פרויקט חדש אתם יכולים להגדיר ב package.json את הפרויקט בתור "מודול", ואז תקבלו תמיכה בכתיב ה import/export בצורה אוטומטית בכל הקבצים בפרויקט. המפתח הרלוונטי נקרא type והערך שלו צריך להיות module. זה קובץ package.json לדוגמה:

{
  "name": "demo1",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

שימו לב למפתח type. עכשיו אם אני שם את הקובץ הזה בתיקיית פרויקט Node.JS אני יכול לכתוב בפרויקט קבצים שישתמשו בכתיב ה import/export שאני מכיר מדפדפן. לדוגמה הקובץ utils.js:

export function twice(x) {
  return x * 2;
}

ולידו הקובץ index.js:

import { twice } from './utils.js';

console.log(twice(10));

2. הגדרת קובץ ספציפי כמודול בפרויקט רגיל

ומה אם יש לכם פרויקט קיים שכבר כתוב בתחביר CommonJS (זה עם ה require שאנחנו מכירים ואוהבים)? אין בעיה - בכל פרויקט Node.JS אפשר להוסיף קבצים עם סיומת mjs ואליהם node יתייחס בתור קבצי מודולים.

לדוגמה אם יש לכם פרויקט Node רגיל עם package.json שלא מגדיר לפרויקט type, ובפרויקט יש קובץ utils.js עם התוכן הבא:

exports.twice = x => x * 2;

תוכלו להגדיר קובץ index.mjs שישתמש ב import כדי להגיע לפונקציה ולהפעיל אותה:

import { twice } from './utils.js';

console.log(twice(10));

בנוסף אם קובץ ה CommonJS הרגיל מעדכן את module.exports ישירות, אפשר לייבא את ה module.exports המלא באמצעות default import. לדוגמה הקובץ user.js מגדיר מחלקה עבור משתמש:

module.exports = class User {
  constructor(id, name) {
    this.id = id;
    this.name = name;
  }

  sayHi() {
    console.log(`Hi! my name is ${this.name}`);
  }
}

אז קובץ index.mjs יוכל לטעון אותו ולהפעיל את הפונקציות:

import User from './user.js';

const user = new User(1, 'ynon');
user.sayHi();

סך הכל השימוש ב ES Modules ב Node הוא פיצ'ר חשוב בעולם שעובר יותר ויותר להסתמך עליהם, ועוזר ליצור אחידות בין קוד צד שרת לקוד צד לקוח. השילוב המובנה עם קוד קיים מאפשר לעבור בהדרגה לכתיב ה import, בזמן שמתאים לפרויקט שלכם.