"প্রয়োজনীয় (এক্স)" এবং "আমদানি এক্স" এর মধ্যে পার্থক্য


190

আমি সম্প্রতি একটি ছোট নোড প্রকল্পে কাজ শুরু করেছি যা একটি মঙ্গোডিবি'র সাথে ইন্টারফেস করবে। যাইহোক, আমি সঠিকভাবে আমদানি করার জন্য প্রাসঙ্গিক নোড মডিউলগুলি পেয়েছি বলে মনে হচ্ছে না, যদিও আমি সেগুলির মাধ্যমে সঠিকভাবে ইনস্টল করেছি npm

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি একটি ত্রুটি নিক্ষেপ করে আমাকে জানিয়েছে যে "এক্সপ্রেসের কোনও ডিফল্ট রফতানি নেই":

import express from "express";

তবে এই কোডটি কাজ করে:

const express = require("express");

সুতরাং আমার প্রশ্নটি হল, কীভাবে আমদানি এবং ভেরিয়েবল / পদ্ধতিগুলির কার্যকারিতা প্রয়োজন তার মধ্যে পার্থক্য কী? আমি প্রকল্পে আমার আমদানিগুলি যা কিছু ঘটছে তা স্থির করতে চাই, কারণ এটি রাস্তায় অতিরিক্ত সমস্যার কারণ হতে পারে বলে মনে হচ্ছে।


আপনি প্রকাশের জন্য টাইপিং সংজ্ঞাগুলি অন্তর্ভুক্ত না করলে, প্রথম ফর্মটি অর্থবোধ করে না - এক্ষেত্রে আপনি দ্বিতীয় ফর্মটি ব্যবহার করতে পারেন তবে ভেরিয়েবলটি expressটাইপের হবে any। আপনি এখানে থেকে সংজ্ঞাগুলি অন্তর্ভুক্ত করতে পারেন npmjs.com/package/@tyype/express
ফিলিপ সাবেলা

উত্তর:


224

এই সহজ ডায়াগ্রাম যে আমাকে সাহায্য করে মধ্যে পার্থক্য বুঝতে পারা requireএবং import

এখানে চিত্র বর্ণনা লিখুন

সেটা থেকে পৃথক,

আপনি কেবলমাত্র প্রয়োজনীয় টুকরোগুলি নির্বাচন করে লোড করতে পারবেন নাrequire তবে importsআপনি কেবল প্রয়োজন কেবল টুকরোটি লোড করতে পারেন। যা স্মৃতি বাঁচাতে পারে।

লোড হচ্ছে সিঙ্ক্রোনাস (ধাপে ধাপ) requireঅন্যদিকে importঅ্যাসিনক্রোনাস হতে পারে (পূর্ববর্তী আমদানির জন্য অপেক্ষা না করে) তাই এটি এর চেয়ে কিছুটা আরও ভাল পারফর্ম করতে পারে require


কোডকে প্রভাবিত করে সবচেয়ে বড় পার্থক্য হ'ল কমনজেএস মডিউলগুলিতে রফতানিগুলি "গণনা" হয়, তবে ইএসএম মডিউলে রফতানি স্থিতিশীল (পূর্বনির্ধারিত) হয়। জেএস কেবল কোড পার্সিংয়ের পরে কোনও ইএসএম মডিউলে রফতানি নির্ধারণ করতে পারে (এখনও এটি চালাচ্ছে না)। একটি সাধারণ জেএস মডিউলে, রফতানিগুলি তখনই জানা যায় যখন মডিউলটি আসলে চালিত হয় এবং আপনি module.exportsযখন দেখেন যে মডিউল সূচনা কোডটি চলমান শেষ হয় তখন আপনাকে কী বরাদ্দ করা হয় । এই পার্থক্যটি এককভাবে ইএসএম এবং কমনজেএস উভয়ের জন্য একক মডিউল কাজ করার চেষ্টা করার ক্ষেত্রে সামঞ্জস্যের মাথাব্যথা তৈরি করে।
jender00

ইএসএম মডিউলগুলি বান্ডিলকারীদের কাছে বন্ধুত্বপূর্ণ, তবে কোডারদের কাছে আরও সীমাবদ্ধ কারণ আপনার ইএসএম মডিউলগুলিতে গণনা রফতানি থাকতে পারে না।
jفر00

76

মধ্যে প্রধান পার্থক্য requireএবং এরimport হ'ল মডিউলগুলি সন্ধান করার জন্য requireস্বয়ংক্রিয়ভাবে স্ক্যান হবে node_modules, তবে import, যা ES6 থেকে আসে, তা করবে না।

বেশিরভাগ মানুষ বাবেল ব্যবহার করেন কম্পাইল করার importএবং export, যার ফলে importহিসাবে একই কাজ require

নোড.জেএস এর ভবিষ্যতের সংস্করণটি সমর্থন করতে পারে import নিজেকে করতে (আসলে পরীক্ষামূলক সংস্করণটি ইতিমধ্যে রয়েছে ), এবং নোড.জেএস এর নোটগুলি বিচার করে এটি importসমর্থন করবে না node_modules, এটি ইএস 6 এর ভিত্তিতে তৈরি হবে এবং মডিউলটির পথ নির্দিষ্ট করতে হবে।

সুতরাং আমি আপনাকে importবাবেলের সাথে ব্যবহার না করার পরামর্শ দিচ্ছি , তবে এই বৈশিষ্ট্যটি এখনও নিশ্চিত নয়, এটি node_modulesভবিষ্যতে সমর্থন করতে পারে , কে জানবে?


রেফারেন্সের জন্য, নীচে বাবেল কীভাবে importইএস 6 এর requireসিনট্যাক্সটিকে কমনজেএস এর সিনট্যাক্সে রূপান্তর করতে পারে তার একটি উদাহরণ নীচে দেওয়া হল ।

বলুন যে ফাইলটিতে app_es6.jsএই আমদানি রয়েছে:

import format from 'date-fns/format';

নোড প্যাকেজ থেকে ফর্ম্যাট ফাংশনটি আমদানির জন্য এটি একটি নির্দেশ is তারিখ-FNS

সম্পর্কিত package.jsonফাইলটিতে এরকম কিছু থাকতে পারে:

"scripts": {
    "start": "node app.js",
    "build-server-file": "babel app_es6.js --out-file app.js",
    "webpack": "webpack"
}

সম্পর্কিত .babelrcফাইলটি এরকম কিছু হতে পারে:

{
    "presets": [
        [
            "env",
            {
                "targets":
                {
                    "node": "current"
                }
            }
        ]
    ]
}

ফাইলে build-server-fileসংজ্ঞায়িত এই স্ক্রিপ্টটি package.jsonবাবেলকে পার্স করার জন্য নির্দেশ isapp_es6.js ফাইলটি ফাইল আউটপুটapp.js

build-server-fileস্ক্রিপ্টটি চালানোর পরে , আপনি যদি খোলেন app.jsএবং date-fnsআমদানির সন্ধান করেন তবে আপনি দেখতে পাবেন এটি এতে রূপান্তরিত হয়েছে:

var _format = require("date-fns/format");

var _format2 = _interopRequireDefault(_format);

সেই ফাইলটির বেশিরভাগটি বেশিরভাগ মানুষের কাছে গব্লিবডিগুক, তবে কম্পিউটারগুলি এটি বুঝতে পারে।


এছাড়াও রেফারেন্সের জন্য, কীভাবে আপনার প্রকল্পে কোনও মডিউল তৈরি এবং আমদানি করা যায় তার উদাহরণ হিসাবে আপনি যদি ইনস্টল করেন date-fnsএবং তারপরে ওপেন করেন node_modules/date-fns/get_year/index.jsতবে এটিতে এটি দেখতে পাবেন:

var parse = require('../parse/index.js')

function getYear (dirtyDate) {
  var date = parse(dirtyDate)
  var year = date.getFullYear()
  return year
}

module.exports = getYear

উপরের বাবেল প্রক্রিয়াটি ব্যবহার করে, আপনার app_es6.jsফাইলে এতে অন্তর্ভুক্ত থাকতে পারে:

import getYear from 'date-fns/get_year';

// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014

এবং বাবেল আমদানিতে রূপান্তরিত করবে:

var _get_year = require("date-fns/get_year");

var _get_year2 = _interopRequireDefault(_get_year);

এবং সেই অনুযায়ী ফাংশনটির সমস্ত রেফারেন্স পরিচালনা করুন।


aaaaahhhhhh। বাবেল এই নির্দিষ্ট প্রকল্পে ইনস্টল করা হয়নি, যা সবকিছু বোঝায়। আমি ভেবেছিলাম যে ES6 আমদানি / রফতানি ইতিমধ্যে কার্যকরী ছিল, তবে এখন আমি বুঝতে পেরেছি যে বাবেল কেবল requireযাইহোক সবকিছুতে পরিবর্তন করছে
আনছে

আপাতত প্রয়োজন আটকে আপনি কোনও সমস্যা ছাড়াই ভবিষ্যতে সর্বদা এটি পরিবর্তন করতে পারেন
জুয়ান

1
import won't support node_modules এটা দ্বারা তুমি কি বোঝাতে চাচ্ছ?
প্রাইভেটওমেগা

11

প্রয়োজনীয়তা এবং আমদানি সহ এক্সপ্রেস মডিউল অন্তর্ভুক্ত করার জন্য আমি একটি উদাহরণ দিই

-require

var express = require('express');

-import

import * as  express from 'express';

সুতরাং উপরের যে কোনও বিবৃতি ব্যবহারের পরে আমাদের সাথে একটি এক্সপ্রেস নামে পরিচিত একটি ভেরিয়েবল থাকবে। এখন আমরা 'অ্যাপ্লিকেশন' ভেরিয়েবল হিসাবে সংজ্ঞায়িত করতে পারি,

var app = express(); 

সুতরাং আমরা 'কমনজেএস' এর সাথে 'প্রয়োজনীয়' এবং 'ইএস 6' সহ 'আমদানি' ব্যবহার করি।

'প্রয়োজনীয়' এবং 'আমদানি' সম্পর্কিত আরও তথ্যের জন্য নীচের লিঙ্কগুলি পড়ুন।

প্রয়োজনীয় - নোড.জেএসে মডিউলগুলির প্রয়োজন: আপনার জানা দরকার Everything

আমদানি - নোড.জেজে ES6 মডিউলগুলির জন্য একটি আপডেট


3

এখানে একটি উত্তর নয় এবং আরও একটি মন্তব্যের মত, দুঃখিত তবে আমি মন্তব্য করতে পারছি না।

নোড ভি 10 এ, আপনি --experimental-modulesযে নোডেজ ব্যবহার করতে চান তা জানাতে আপনি পতাকাটি ব্যবহার করতে পারেন import। তবে আপনার প্রবেশের স্ক্রিপ্টটি শেষ হওয়া উচিত.mjs

নোট করুন এটি এখনও একটি পরীক্ষামূলক জিনিস এবং এটি উত্পাদনে ব্যবহার করা উচিত নয়

// main.mjs
import utils from './utils.js'
utils.print();
// utils.js
module.exports={
    print:function(){console.log('print called')}
}

রেফ 1 - নোডেজ ডক

রেফ 2 - গিথুব ইস্যু


3

নতুন ES6:

জেএস ফাইলগুলির মধ্যে ভেরিয়েবল / অ্যারে / অবজেক্টগুলি ভাগ করতে 'এক্সপোর্ট' কী শব্দগুলির সাথে 'আমদানি' ব্যবহার করা উচিত:

export default myObject;

//....in another file

import myObject from './otherFile.js';

পুরানো skool:

'মডিউল.এক্সপোর্টস' এর সাথে 'আবশ্যক' ব্যবহার করা উচিত

 module.exports = myObject;

//....in another file

var myObject = require('./otherFile.js');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.