"आवश्यकता (x)" और "आयात x" के बीच का अंतर


191

मैंने अभी एक छोटे नोड प्रोजेक्ट पर काम करना शुरू किया है जो एक MongoDB के साथ इंटरफ़ेस करेगा। हालाँकि, मैं संबंधित नोड मॉड्यूल को सही ढंग से आयात करने के लिए प्रतीत नहीं कर सकता, भले ही मैंने उन्हें सही तरीके से स्थापित किया हो npm

उदाहरण के लिए, निम्न कोड एक त्रुटि फेंकता है, मुझे बता रहा है कि "एक्सप्रेस का कोई डिफ़ॉल्ट निर्यात नहीं है":

import express from "express";

हालांकि, इस कोड काम करता है:

const express = require("express");

तो मेरा सवाल यह है कि आयात और चर / तरीकों की आवश्यकता के कार्य में क्या अंतर है? मैं इस परियोजना पर अपने आयात को कम करने के लिए जो भी करना चाहता हूं, उसे ठीक करना चाहूंगा, क्योंकि इससे सड़क पर अतिरिक्त समस्याएं होने की संभावना है।


जब तक आप एक्सप्रेस के लिए टाइपिंग परिभाषाएँ शामिल नहीं करते हैं, तब तक पहले फॉर्म का कोई मतलब नहीं होगा - जिस स्थिति में आप दूसरे फॉर्म का उपयोग कर सकते हैं, लेकिन चर expressप्रकार का होगा any। आप यहाँ से परिभाषाएँ शामिल कर सकते हैं npmjs.com/package/@types/express
Filipe Sabella

जवाबों:


229

यह सरल आरेख जो मुझे requireऔर बीच के अंतर को समझने में मदद करता है import

यहां छवि विवरण दर्ज करें

इसके अलावा,

आप केवल चुनिंदा टुकड़ों को ही अपनी जरूरत के अनुसार लोड नहीं कर सकते हैं, requireलेकिन importsआप चुनिंदा टुकड़ों में ही अपनी जरूरत का सामान लोड कर सकते हैं। जो याददाश्त को बचा सकता है।

दूसरी तरफ लोडिंग सिंक्रोनस (कदम से कदम) है अतुल्यकालिक (पिछले आयात की प्रतीक्षा किए बिना) हो सकता है, इसलिए यह थोड़ा बेहतर प्रदर्शन कर सकता हैrequireimport require


सबसे बड़ा अंतर जो कोड को प्रभावित करता है, वह यह है कि कॉमन जेजेएस मॉड्यूल में निर्यात "कम्प्यूटेड" हैं, जबकि ईएसएम मॉड्यूल में निर्यात स्थिर (पूर्व-परिभाषित) हैं। जेएस केवल कोड पार्स करने के बाद एक ईएसएम मॉड्यूल में निर्यात का निर्धारण कर सकता है (अभी तक इसे नहीं चला रहा है)। एक सामान्यJS मॉड्यूल में, निर्यात केवल तब ज्ञात होता है जब मॉड्यूल वास्तव में चलता है और आप देखते हैं कि module.exportsमॉड्यूल आरंभीकरण कोड पूरा होने पर क्या सौंपा गया है । यह अंतर अकेले ESM और CommonJS दोनों के लिए एकल मॉड्यूल काम करने की कोशिश में संगतता सिरदर्द पैदा करता है।
2

ईएसएम मॉड्यूल बंडलों के लिए अनुकूल हैं, लेकिन कोडर्स के लिए अधिक प्रतिबंधात्मक हैं क्योंकि आपके पास ईएसएम मॉड्यूल में निर्यात की गणना नहीं हो सकती है।
2

77

के बीच मुख्य अंतर requireऔर import, यह requireस्वचालित रूप node_modulesसे मॉड्यूल खोजने के लिए स्कैन करेगा , लेकिन import, जो ES6 से आता है, नहीं होगा।

अधिकांश लोग संकलन करने के लिए बैबल का उपयोग करते हैं importऔर export, जो importएक्ट को समान बनाता है require

Node.js का भविष्य संस्करण importस्वयं का समर्थन कर सकता है (वास्तव में, प्रायोगिक संस्करण पहले से ही करता है ), और Node.js के नोटों को देखते हुए , यह importसमर्थन नहीं करेगा node_modules, यह ES6 पर आधारित है, और मॉड्यूल का पथ निर्दिष्ट करना चाहिए।

इसलिए मैं आप का उपयोग नहीं सुझाव है कि importकोलाहल के साथ, लेकिन इस सुविधा की पुष्टि अभी तक नहीं है, यह भी समर्थन कर सकता node_modulesहै भविष्य में, जो जानते हैं कि होगा?


संदर्भ के लिए, नीचे एक उदाहरण है कि कैसे बैगल ईएस 6 के importसिंटैक्स को कॉमनजेएस के requireसिंटैक्स में बदल सकता है।

मान लें कि फ़ाइल app_es6.jsमें यह आयात है:

import format from 'date-fns/format';

यह नोड पैकेज दिनांक-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फ़ाइल को पार्स करने और app_es6.jsफ़ाइल के आउटपुट के लिए एक निर्देश है app.js

build-server-fileस्क्रिप्ट चलाने के बाद , यदि आप खोलते हैं app.jsऔर date-fnsआयात की तलाश करते हैं, तो आप देखेंगे कि इसे इस में बदल दिया गया है:

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

var _format2 = _interopRequireDefault(_format);

उस फ़ाइल का अधिकांश मनुष्यों के लिए gobbledygook है, हालाँकि कंप्यूटर इसे समझते हैं।


संदर्भ के लिए, एक मॉड्यूल के रूप में कैसे बनाया जा सकता है और अपनी परियोजना में आयात किया जा सकता है, उदाहरण के लिए, यदि आप स्थापित करते हैं 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वैसे भी बदल रहा है
austinthemassive

अभी की आवश्यकता के लिए छड़ी। आप भविष्य में इसे हमेशा किसी भी समस्या के बिना बदल सकते हैं
जुआन

1
import won't support node_modulesउससे तुम्हारा मतलब क्या था?
PrivateOmega

11

मुझे आवश्यकता और आयात के साथ एक्सप्रेस मॉड्यूल शामिल करने के लिए एक उदाहरण दें

-require

var express = require('express');

-आयात

import * as  express from 'express';

इसलिए उपरोक्त किसी भी कथन का उपयोग करने के बाद हमारे पास एक चर होगा जिसे हमारे साथ 'एक्सप्रेस' कहा जाएगा। अब हम 'ऐप' वेरिएबल को इस प्रकार परिभाषित कर सकते हैं,

var app = express(); 

इसलिए हम 'कॉमन जेएस' के साथ 'आवश्यकता' और 'ईएस 6' के साथ आयात का उपयोग करते हैं।

'आवश्यकता' और 'आयात' के बारे में अधिक जानकारी के लिए, नीचे दिए गए लिंक के माध्यम से पढ़ें।

आवश्यकता - Node.js में आवश्यक मॉड्यूल: वह सब कुछ जो आपको जानना आवश्यक है

आयात - Node.js में ES6 मॉड्यूल पर एक अपडेट


3

यहाँ जवाब नहीं है और टिप्पणी की तरह और अधिक, माफ करना, लेकिन मैं टिप्पणी नहीं कर सकता।

नोड V10 में, आप उन ध्वज --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';

पुराना विद्यालय:

'आवश्यकता' का उपयोग 'मॉड्यूल.एक्सपोर्ट' के साथ किया जाना चाहिए

 module.exports = myObject;

//....in another file

var myObject = require('./otherFile.js');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.