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

گردآوری و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 16 آذر 1396
دسته بندی ها : نود جی اس

از اونجایی که 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 داشته باشه.

منبع

مقالات پیشنهادی

احراز هویت گوگل در Node.js

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

اعتبارسنجی رشته ها در Node.js

اعتبارسنجی اطلاعات ورودی یک بخش مهم و ضروری برای هر نرم افزاریست. شما باید از طبیعت اطلاعات بخصوص اونهایی که از منابع خارجی می آیند, با خبر باشید.

wireframe ، prototype ، mockup چه تفاوتی با هم دارند ؟

اصطلاحات wireframe و prototype و mockup اغلب به صورت مترادف در پروژه ها مورد استفاده قرار میگیرن در عين حال یکی نیستند . در اين پست توضيح میدیم ك...

ماژول fs-extra برای Node.js

ماژ.ل fs-extra متدهایی برای فایل سیستم اضافه میکنه که در ماژول پایه ی fs وجود ندارند. این ماژول میتونه جایگزینی برای fs هم باشه