9

मैं ESLint निम्न सिंटैक्स में default निर्यात पहचान नहीं के लिए मेरे ES2015 मॉड्यूल आयात/निर्यात मान्य प्लगइन के बारे में एक issue on GitHub प्राप्त`निर्यात {foo डिफ़ॉल्ट के रूप में}` वैध ES2015 है?</p> <pre><code>export { foo as default, bar } </code></pre> <p>जहाँ मेरे प्लगइन निम्नलिखित (? समकक्ष) एक प्रकार का वृक्ष होगा वाक्य रचना में कोई समस्या नहीं:

export default foo; 
export const bar = ..; 

दोनों Babel और Esprima त्रुटियों के बिना समान वाक्य रचना को पार्स, और यह दोनों सिरों (आयात और निर्यात) पर कोलाहल का उपयोग कर कोड के लिए काम करता है।

प्रत्येक IdentifierNamenExportClause की ReferencedBindings में के लिए:: यह एक विन्यास त्रुटि है अगर n के StringValue एक ReservedWord या यदि StringValue है

हालांकि, मुझे विश्वास है spec पूर्व export { x as default } प्रपत्र की अनुमति देता है नहीं कर रहा हूँ एन में से एक है: "उपकरण", "इंटरफ़ेस", "चलो", "पैकेज", "निजी", "संरक्षित", "सार्वजनिक", "स्थैतिक", या "उपज"।

ReservedWorddoes include default, हालांकि मुझे लगता है कि बहस कर सकते हैं कि ReferencedBindingsspecifically to the module-local identifier names कि किया जा रहा है निर्यात (अर्थात foo) और नहीं निर्यात नाम ही बात कर रहा है।

यह आमतौर पर आरक्षित शब्दों को निर्यात करने में सक्षम होने के लिए एक अजीब बात की तरह लगता है; export { foo as default } ES2015 में एक डिफ़ॉल्ट निर्यात करने के लिए एक वैध तरीका है: कोलाहल खुशी से भी

// ./foo.js 
export { foo as yield } 
// ./mod.js 
import { yield as nonReservedIdentifier } from './foo' 

तो कुछ ऐसा, सारांश में की अनुमति देगा?

उत्तर

8

हां, ReferencedBindings केवल प्रथम पहचानकर्ता नाम को संदर्भित करता है। तो

export { default as something } // or 
export { default } 

अमान्य है, लेकिन

export { something as default } 

नहीं है। ESLint को यहां एक फिक्स की आवश्यकता होगी।

+0

हालांकि, इस मामले में, 'डिफ़ॉल्ट' नामक निर्यात नाम 'डिफ़ॉल्ट' या वास्तविक 'डिफ़ॉल्ट' निर्यात है? –

+0

मुझे लगता है कि [आयात spec] (http://www.ecma-international.org/ecma-262/6.0/#sec-static-semantics-importentriesformodule) सुझाव देता है कि यह दोनों है। –

+0

हां, डिफ़ॉल्ट निर्यात सिर्फ 'डिफ़ॉल्ट' नाम से निर्यात किया गया बाध्यकारी है। यह दोनों कहने के लिए है, सिवाय इसके कि डिफ़ॉल्ट निर्यात को निर्यात/आयात करने के लिए विशेष वाक्यविन्यास है, और 'डिफ़ॉल्ट' अन्यथा एक अवैध स्थानीय पहचानकर्ता है। – Bergi

6

हां, यह मान्य है। मैं इसे तोड़ दूंगा।

  1. :

    export { foo as default } 
    

    यह निम्नलिखित प्रस्तुतियों से मेल खाता है (कम से कम से सबसे विशिष्ट करने के लिए):

    15,2:

    export ExportClause 
    ExportClause : { ExportsList } 
    ExportsList : ExportSpecifier 
    ExportSpecifier : IdentifierName as IdentifierName  
    
  2. तो फिर तुम early error semantics है। 3।1 स्टेटिक शब्दार्थ: प्रारंभिक त्रुटियाँ

    ExportDeclaration : export ExportClause ;

    प्रत्येक IdentifierNamenExportClause की ReferencedBindings में के लिए: यह एक विन्यास त्रुटि है अगर n की StringValue एक ReservedWord है ...

    ये किसी भी निर्माण के लिए लागू export ExportClause से मेल खाता है, जिसमें आपका उदाहरण वाक्यविन्यास शामिल है। यह ReferencedBindings एल्गोरिदम का आह्वान करता है।

  3. ReferencedBindings कि सबसे विशिष्ट उत्पादन इस वाक्य से मिलान पर लागू होने वाला एल्गोरिथ्म है:

    ExportSpecifier : IdentifierName as IdentifierName

    वापसी एक List पहले IdentifierName हैं।

तो आप देखते हैं कि ReservedWord और अन्य सूचीबद्ध मूल्यों के बारे में प्रतिबंध केवल अपने उदाहरण में वाक्य रचना की foo हिस्सा करने के लिए लागू किया जाता है।

संबंधित मुद्दे