تفاوت import و require در Node.js

ترجمه و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 13 خرداد 98
خواندن در 55 ثانیه
دسته بندی ها : نود جی اس

از اونجایی که Node.js از ماژول بندی commonJS استفاده می کنه, من به فرآیند کاری Node با استفاده از ماژول های commonJS اشاره می کنم و برای ماژول های ECMAScript هم بعنوان ESM اشاره می کنم. 

Require

  • ارزیابی داینامیک
  • ارائه ی خطا هنگام اجرای اپ
  • غیر لغوی (non lexical)

Import

  • ارزیابی ثابت
  • ارائه ی خطا هنگام parse
  • لغوی (lexical)

تفاوت Syntax ها

- CommnonJS

// dep.js

dep = {
    foo: function(){},
    bar: 22
}

module.exports = dep;
var dep = require("dep");
console.log(dep.bar);
dep.foo();
// 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 در پنج قدم صورت می گیره : 

  • وضوح
  • درحال بارگیری
  • بسته بندی
  • ارزیابی
  • ذخیره سازی

اولین قدم یک قدم داخلی هست که node,js یکسری چیزها مثل مسیر فایل رو بررسی میکنه, دومی node کد رو به روند فعلی اضافه میکنه, در بخش بسته بندی بصورتی که بالا توضیح دادیم کد رو در یک تابع بسته بندی میکنه و همچنین کار ارزیابی بعهده VM هست و درنهایت اون رو کش میکنه.

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

()Import

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

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

کاربرد ها

  • امکان بارگذاری ماژول ها در زمان تقاضا
  • امکان بارگذاری مشروط ماژول ها
  • Promise شبیه مدیریت asynchronous 

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

اگرچه درحال حاضر هیچ مزیت عملکردی وجود نداره, اما با این حال من import رو بجای require پیشنهاد میدم, چون داره کم کم بصورت بومی در جاوا اسکریپت در میاد و ممکنه کارایی بهتری از require داشته باشه.

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید