חדש ב node: בדיקה אם זה הסקריפט הראשי

17/06/2025

הנה פיצ'ר מפייתון שלא היה חסר לי במקומות אחרים ובכל זאת נכנס לאחרונה ל node בגירסה 24.2 - האפשרות לבדוק אם המודול רץ מתוך התוכנית הראשית או בתור מודול שמיובא לתוכנית אחרת. ניקח לדוגמה את הקוד הבא:

export function foo() {
  return 'Hello, world';
}

function main() {
  const message = foo();
  console.log(message);
}

if (import.meta.main) {
  main();
}

אפשר להגיע לקוד הזה בשתי דרכים. דרך אחת היא להפעיל משורת הפקודה את התוכנית כלומר:

node main.mjs

דרך שניה היא מתוך קובץ אחר לייבא פונקציה לדוגמה מתוך קובץ JavaScript אחר כותבים:

import {foo} from './main.mjs';

console.log(foo());

עד גירסה 24.2 של node לא היתה לנו דרך להבדיל בין שני המקרים. נכון תגידו, ממילא זה לא היה רעיון טוב לערבב פונקציות ליבוא וקוד main באותו קובץ אבל יש use case מעניין אחר לסיפור הזה. שימו לב למודול הבא:

import assert from 'node:assert/strict';
import { test } from 'node:test';

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

if (import.meta.main) {
  test('twice(3) == 6', () => {
    assert.equal(twice(3), 6);
  });
}

עד היום היה לנו לכל מודול קובץ אחד של קוד וקובץ שני של בדיקות. עכשיו עם הכתיב החדש אפשר לכתוב את שני הדברים באותו קובץ. מי שרוצה להשתמש בפונקציה יטען אותו עם import ובשביל להריץ את הבדיקות פשוט מריצים את הקובץ בתור תוכנית ראשית.