تفاوت import و require در NodeJs

همان طور که Node.js از ماژول‌ commonJS استفاده می‌کند، ما به فرآیند کاری node مراجعه می‌کنیم تا به ماژول‌های commonsJS بپردازیم، و ماژول ECMAScript را به عنوان ESM بیان می‌کنیم.

تفاوت import و require در NodeJs

تفاوت Syntax ها

CommonJS-

dep.js

dep = {
    foo: function(){},
    bar: 22
}
module.exports = dep;

app.js

var dep = require("dep");
console.log(dep.bar);
dep.foo();

ESM

dep.js

export foo function(){};
export const bar = 22;

app.js

import {foo, bar} from "dep";
console.log(bar);
foo();

تفاوت تکنیک بارگذاری

کاری که Node.js با ماژول انجام می‌دهد این است که همه کدها را در تابع قرار می‌دهد. بنابراین، dep.js مانند کد زیر است:

function (exports, require, module, __filename, __dirname) {
  const m = 1;
  module.exports.m = m;
}

بنابراین filename__، dirname__ یا module به صورت سراسری نیستند، بلکه به صورت محلی برای هر ماژول خاصی در نظر گرفته می‌شوند.

بارگذاری هر ماژول مورد استفاده از ()require در 5 مرحله رخ می‌دهد.

Resolution

بارگیری (Loading)

بسته‌بندی (Wrapping)

ارزیابی (Evaluation)

ذخیره‌سازی (Caching)

مرحله اول، Resolution، یک مرحله داخلی است که node.js کارهایی مثل برآورد مسیر فایل‌ها را انجام می‌دهد. در مرحله دوم یعنی loading، node کد را دریافت می‌کند. در wrapping همان طور که دربالا نشان داده شده است، کد را در تابع قرار داده و سپس آن را برای ارزیابی به VM می‌فرستد و در نهایت آن را cache می‌کند.

بنابراین تا زمانی که ماژول ارزیابی نشده است، node هرگز متوجه نمی‌شود که ماژول commonJS قصد اکسپورت کردن کدام نماد را دارد. و این بزرگ‌ترین تفاوت با ماژول ECMAScript است، زیرا در ESM نمادهای اکسپورت‌شده قبل از ارزیابی کد شناخته می‌شوند.

وقتی یک ماژول ESM تجزیه می‌شود، قبل از آن توسط VM ارزیابی می‌شود و یک ساختار داخلی به نام Module Record ساخته می‌شود. این ماژول رکورد لیستی از نمادهای اکسپورت‌شده در زمان تجزیه را نگه می‌دارد. بنابراین وقتی از "import {f} from "foo استفاده می‌کنید، در واقع لینکی بین این f و fای که در لیست نمادهای ماژول رکورد وجود دارد ایجاد می‌شود. (در صورتی که f واقعا اکسپورت شده باشد).

در نتیجه، هر خطایی که مربوط به عدم دسترسی نامطابق بودن هر نماد اکسپورت‌شده باشد، خطا را قبل از ارزیابی نشان می‌دهد.

()import

تابع ()import برای ساخت دستورالعمل‌های (statements) تو در توی import استفاده می‌شود. برعکس واژه import، تابع ()import مانند require، در لحظه یا زمان ارزیابی پردازش می‌شود. سینتکس آن مانند زیر است:

import("foo").then((module) => {
    module.bar();
    console.log(module.someProp);
}).catch((err)=>{
    //handle error here
});

کاربردها

در صورتی که به یادگیری اصولی و حرفه ای این تکنولوژی قدرتمند علاقمند هستید میتوانید دوره کامل و جامع آموزش Node Js موجود در سایت تاپ لرن را مشاهده کنید .

-امکان بارگذاری ماژول‌ها در زمان تقاضا

-امکان بارگذاری مشروط ماژول‌ها

Promise- مانند مدیریت غیرهم‌زمان

کدام یک بهتر است؟؟؟

اگرچه در حال حاضر هیچ مزیت عملکردی وجود ندارد، اما ما استفاده از import را به جای require پیشنهاد می‌کنیم، چون در حال بومی شدن در جاوااسکریپت است و ممکن است (فقط به دلیل بومی شدن) کارایی بهتری نسبت به require داشته باشد.