NodeJS की योजना आयात / निर्यात es6 (es2015) मॉड्यूल का समर्थन करने की है


275

मैं इसके लिए एक स्पष्ट जवाब के बिना इंटरनेट पर देख रहा हूँ।

वर्तमान में मॉड्यूल को लोड करने के लिए NodeJS केवल CommonJS सिंटैक्स का उपयोग करता है, और यदि आप वास्तव में मानक ES2015 मॉड्यूल सिंटैक्स का उपयोग करना चाहते हैं, तो आपको या तो इसे पहले से ट्रांसपाइल करना होगा या रनटाइम पर एक बाहरी मॉड्यूल लोडर का उपयोग करना होगा।

वर्तमान में मैं उन दोनों विधियों में से किसी का भी उपयोग करने के लिए सकारात्मक नहीं हूं, क्या NodeJS अनुरक्षक भी ES2015 मॉड्यूल का समर्थन करने की योजना बना रहे हैं या नहीं? मुझे इस बारे में कोई संकेत नहीं मिला है।

फिलहाल NodeJS 6.x ES2015 सुविधाओं के 96% का समर्थन करने का दावा करता है, लेकिन मॉड्यूल ( NodeJS ES2105 समर्थन लिंक ) का कोई संदर्भ नहीं है ।

क्या आपको पता है कि निकट भविष्य में NodeJS इन मॉड्यूल्स का समर्थन करेगा?


2
के लिए Googling node es2015 modules, शीर्ष परिणामों में से एक के रूप में निम्न दिखाता है: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node
फेलिक्स क्लिंग

6
व्यक्तिगत रूप से मैं इस प्रश्न को "बहुत स्थानीयकृत" के रूप में बंद करने के लिए मतदान करूंगा, लेकिन वह निकट कारण अब मौजूद नहीं है। मान लीजिए कि नोड कल ES6 मॉड्यूल को लागू करने का प्रबंधन करता है। क्या आप अपना प्रश्न तब हटाने जा रहे हैं, क्योंकि यह अब प्रासंगिक नहीं है? या आप कम से कम इसे अपडेट करेंगे? मुझे नहीं लगता कि एक प्रश्न SO के लिए उपयुक्त है यदि आप पहले से जानते हैं कि यह पुराना हो जाएगा या "जल्द ही" अपडेट करने की आवश्यकता है। लेकिन यह सिर्फ मेरी राय है और दूसरों के लिए ऐसा लगता है जो इसके विपरीत सोचते हैं, जो मेरे लिए ठीक है :) (fwiw, यह सवाल अपने आप में महत्वपूर्ण और दिलचस्प है)
फेलिक्स क्लिंग

2
काश, इस तरह के सवालों के लिए स्टैक यूनिवर्स में एक जगह होती, हालांकि। यह तकनीकी रूप से यहां फिट नहीं हो सकता है, लेकिन मुझे नहीं पता कि मैं सहमत हूं कि यह वास्तव में "राय आधारित" है। ओपी एक विशिष्ट प्रश्न के विशिष्ट उत्तर की तलाश में है, लेकिन एक जो (कुछ बिंदु पर) पुराना होगा।
विनो

5
इस सवाल का वैकल्पिक वाक्यांश: "ईएस 6 मॉड्यूल के लिए नोड.जेएस समर्थन की स्थिति क्या है?" समय के साथ कई एसओ सवालों के जवाब बदलते हैं क्योंकि तकनीक विकसित होती है। मुझे भी जवाब खोजने में परेशानी हुई जब तक कि मैं यहां नहीं उतरा।
जो लैप

4
@FelixKling मुझे लगता है कि आप इस प्रश्न को बंद करना चाहते हैं, यह एक बहुत ही गलत निर्णय होगा क्योंकि यह 211 लोगों की समस्या है जो अब तक वोट देने के लिए पर्याप्त रूप से समस्याग्रस्त पाए गए हैं।
मुहम्मद उमर

जवाबों:


302

नोड 13.2.0 और ऊपर

NodeJS 13.2.0 अब बिना झंडे के ES मॉड्यूल का समर्थन करता है the हालांकि, कार्यान्वयन को अभी भी प्रायोगिक के रूप में चिह्नित किया गया है, इसलिए सावधानी के साथ उत्पादन में उपयोग करें।

13.2.0 में ईएसएम समर्थन को सक्षम करने के लिए, अपने को निम्न जोड़ें package.json:

{
  "type": "module"
}

सभी .js, .mjs(या एक्सटेंशन के बिना फ़ाइलें) को ईएसएम के रूप में माना जाएगा।

संपूर्ण package.jsonऑप्ट-इन के अलावा कई अलग-अलग विकल्प हैं, जिनमें से सभी 13.2.0 के दस्तावेज़ में विस्तृत हैं ।

नोड 13.1.0 और नीचे

नोड के पुराने संस्करणों का उपयोग करने वाले लोग अभी भी एएसएम मॉड्यूल लोडर को आजमाना चाहते हैं , जो कि नोड मोड्स के लिए ईएस मॉड्यूल प्रॉडक्शन का उत्पादन-तैयार कार्यान्वयन है:

node -r esm main.js

विस्तृत अपडेट ...

23 अप्रैल 2019

ईएस मॉड्यूल का पता लगाने के तरीके को बदलने के लिए हाल ही में एक पीआर उतरा: https://github.com/nodejs/node/pull/26745

यह अभी भी --experimental-modulesध्वज के पीछे है , लेकिन लोड किए जाने के तरीके में बड़े बदलाव हो सकते हैं:

  • package.typeजो moduleया तो हो सकता हैcommonjs
    • type: "commonjs":
      • .js को आमजन के रूप में रखा गया है
      • बिना एक्सटेंशन के प्रवेश बिंदु के लिए डिफ़ॉल्ट सामान्य है
    • type: "module":
      • .js esm के रूप में पार्स किया जाता है
      • डिफ़ॉल्ट रूप से JSON या मूल मॉड्यूल लोड करने का समर्थन नहीं करता है
      • बिना एक्सटेंशन के प्रवेश बिंदु के लिए डिफ़ॉल्ट esm है
  • --type=[mode]आपको एंट्री पॉइंट पर टाइप सेट करने देता है। package.typeप्रवेश बिंदु के लिए ओवरराइड करेगा ।
  • एक नई फ़ाइल एक्सटेंशन .cjs
    • यह विशेष रूप से moduleमोड में आमजन के आयात का समर्थन करने के लिए है।
    • यह केवल esm लोडर में है, सामान्य लोडर अछूता रहता है, लेकिन यदि आप पूर्ण फ़ाइल पथ का उपयोग करते हैं तो एक्सटेंशन पुराने लोडर में काम करेगा।
  • --es-module-specifier-resolution=[type]
    • विकल्प explicit(डिफ़ॉल्ट) हैं औरnode
    • डिफ़ॉल्ट रूप से हमारा लोडर आयात में वैकल्पिक एक्सटेंशन के लिए अनुमति नहीं देगा, एक मॉड्यूल के लिए पथ में विस्तार को शामिल करना होगा यदि एक है
    • डिफ़ॉल्ट रूप से हमारा लोडर उन निर्देशिकाओं को आयात करने की अनुमति नहीं देगा जिनके पास एक इंडेक्स फ़ाइल है
    • डेवलपर्स --es-module-specifier-resolution=nodeकॉमन स्पेसिफिक रिज़ॉल्यूशन एल्गोरिदम को सक्षम करने के लिए उपयोग कर सकते हैं
    • यह एक "विशेषता" नहीं है, बल्कि प्रयोग के लिए एक कार्यान्वयन है। ध्वज को हटाने से पहले इसे बदलने की उम्मीद है
  • --experimental-json-loader
    • जब json आयात करने का एकमात्र तरीका है "type": "module"
    • जब सक्षम सभी import 'thing.json'मोड के स्वतंत्र लोडर के माध्यम से जाना जाएगा
    • whatwg / html # 4315 पर आधारित है
  • आप package.mainएक मॉड्यूल के लिए एक प्रवेश बिंदु सेट करने के लिए उपयोग कर सकते हैं
    • मुख्य में प्रयुक्त फ़ाइल एक्सटेंशन को मॉड्यूल के प्रकार के आधार पर हल किया जाएगा

17 जनवरी 2019

नोड 11.6.0 अभी भी एक झंडे के पीछे ईएस मॉड्यूल को प्रयोगात्मक के रूप में सूचीबद्ध करता है।

13 सितंबर 2017

NodeJS 8.5.0 को एक ध्वज के पीछे mjs फ़ाइलों के समर्थन के साथ जारी किया गया है:

node --experimental-modules index.mjs

इसके लिए योजना v10.0 एलटीएस रिलीज के लिए ध्वज को हटाने की है।

- सुव्यवस्थित सूचना। ऐतिहासिक उद्देश्यों के लिए यहां रखा गया--

8 सितंबर 2017

NodeJS मास्टर शाखा को ESM मॉड्यूल के लिए प्रारंभिक समर्थन से अपडेट किया गया है:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc80d9d5

यह नवीनतम रात में उपलब्ध होना चाहिए (यह आपके मौजूदा इंस्टॉल के साथ चलाने के लिए एनवीएम के माध्यम से स्थापित किया जा सकता है ):
https://nodejs.org/download/nightly/

और --experimental-modulesझंडे के पीछे सक्षम :

package.json

{
  "name": "testing-mjs",
  "version": "1.0.0",
  "description": "",
  "main": "index.mjs" <-- Set this to be an mjs file
}

फिर भागो:

node --experimental-modules .

फरवरी 2017:

https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37

NodeJS लोगों ने फैसला किया है कि कम से कम बुरा समाधान .mjsफ़ाइल एक्सटेंशन का उपयोग करना है । इससे प्राप्त होने वाला मार्ग है:

दूसरे शब्दों में, दो फाइलें दी गई हैं, foo.jsऔर bar.mjsउपयोग import * from 'foo'करना foo.jsकॉमनजस के रूप में माना जाएगा , जबकि ईएस 6 मॉड्यूल के रूप में import * from 'bar' माना जाएगाbar.mjs

और समयसीमा के अनुसार ...

वर्तमान समय में, अभी भी कई विनिर्देशन और कार्यान्वयन के मुद्दे हैं जो कि Node.js से पहले चीजों के ES6 और वर्चुअल मशीन पक्ष पर होने की आवश्यकता है, यहां तक ​​कि ES6 मॉड्यूल के एक सहायक कार्यान्वयन का काम भी शुरू कर सकते हैं। कार्य प्रगति पर है लेकिन इसमें कुछ समय लगने वाला है - हम वर्तमान में लगभग एक वर्ष में देख रहे हैं ।

अक्टूबर 2016:

Node.JS के डेवलपर्स में से एक ने हाल ही में एक TC-39 बैठक में भाग लिया और ब्लॉकर्स पर Node.JS को लागू करने के लिए एक शानदार लेख लिखा:

https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e

उस से मूल ले दूर है:

  • ईएस मॉड्यूल का सांख्यिकीय विश्लेषण किया जाता है, कॉमनजेएस का मूल्यांकन किया जाता है
  • CommonJS मॉड्यूल बंदर-पैचिंग निर्यात के लिए अनुमति देते हैं, ES मॉड्यूल वर्तमान में नहीं है
  • यह पता लगाना मुश्किल है कि उपयोगकर्ता इनपुट के कुछ प्रकार के बिना ES मॉड्यूल क्या है और कॉमनजस क्या है, लेकिन वे कोशिश कर रहे हैं।
  • *.mjs सबसे संभावित समाधान लगता है, जब तक कि वे उपयोगकर्ता-इनपुट के बिना एक ईएस मॉड्यूल का सटीक रूप से पता नहीं लगा सकते

- मूल उत्तर -

यह काफी समय से एक गर्म आलू रहा है। लब्बोलुआब यह है कि हाँ, नोड्स आयात / निर्यात मॉड्यूल के लिए अंततः ES2015 सिंटैक्स का समर्थन करेंगे - सबसे अधिक संभावना है जब लोडिंग मॉड्यूल के लिए कल्पना को अंतिम रूप दिया जाता है और सहमति व्यक्त की जाती है।

यहाँ एक अच्छा अवलोकन है NodeJS धारण करने है। अनिवार्य रूप से, उन्हें यह सुनिश्चित करने की आवश्यकता है कि नया कल्पना नोड के लिए काम करता है जो मुख्य रूप से सशर्त, तुल्यकालिक लोडिंग और HTML भी है जो मुख्य रूप से अतुल्यकालिक है।

कोई भी अभी निश्चित रूप से नहीं जानता है, लेकिन मुझे लगता है कि डायनामिक लोडिंग के लिए import/exportनए के अलावा, नोड लोडिंग कोड के लिए System.importअभी भी ध्यान में रखते हुए , नोड लोडिंग के लिए समर्थन करेगा require

यहां कुछ प्रस्ताव दिए गए हैं कि नोड कैसे इसे प्राप्त कर सकता है:


38
के बारे में .mjsविस्तार: We have affectionately called these “Michael Jackson Script” files in the past। बस के मामले में आप किसी को जेएस चर्चा के दौरान पॉप कलाकारों के बारे में बात करते सुना।
जीवस

1
मैं यह नहीं देख रहा हूं कि आयात सिंटैक्स को बदलना क्यों पर्याप्त नहीं है। आयात करने के लिए एक वाक्यविन्यास ('सही' एक) और एक आयात करने के लिए cjs? दूसरे शब्दों में, दो फ़ाइल foo.js और bar.js को देखते हुए, import * from 'foo'foo.js को import * as bar from 'bar'मानेंगे क्योंकि CommonJS bar.js को एक ES6 मॉड्यूल के रूप में मानेंगे?
कोरी एलिक्स

1
@CoreyAlix सिंटैक्स आमतौर पर एक वातावरण का समर्थन करने के लिए नहीं बदला जाएगा। यह वास्तव में सभी के बाद केवल नोड को प्रभावित करता है। इसके अलावा, वाक्यविन्यास थोड़ा गैर-सहज है। मैं आपके प्रस्तावित सिंटैक्स में निर्यात कैसे करूँ?
कोडिंगइंट्रिग्यू

स्पष्ट होने के लिए, यह "मेरा" प्रस्ताव नहीं है, मैं प्रतिलिपि बना रहा हूं कि टाइपस्क्रिप्ट पहले से क्या कर रहा है। अपने प्रश्न का उत्तर देने के लिए, आप "बार" के साथ निर्यात का उपयोग करते हैं: bar.foobar () "से foo" के रूप में आयात करें {} से ".foo" ईएस 6 मॉड्यूल की पहचान करने के लिए तंत्र है। var Foo = आवश्यकता ("./ फू") CJS मॉड्यूल की पहचान करने के लिए एक तंत्र है। टाइपस्क्रिप्ट में आमजन आउटपुट इस तरह दिखता है: var mod1_1 = आवश्यकता ("./ mod1"); Export.mod1 = mod1; ES6 आउटपुट इस तरह दिखता है: "{.mod1" से {mod1} आयात करें; निर्यात {mod1}
कोरी एलिक्स

1
मैं इस उत्तर के लिए एक नोड 10 अद्यतन में वास्तव में दिलचस्प होगा। क्या सुविधा ने कटौती की, या यह अभी भी एक ध्वज के पीछे है?
dcorking
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.