2016-03-10 13 views
32

सशर्त

क्या नीचे सशर्त आयात विवरण होना संभव है?ES6: सशर्त और गतिशील आयात विवरण

if (foo === bar) { 
    import Baz from './Baz'; 
} 

मैंने ऊपर की कोशिश की है लेकिन संकलन करते समय निम्न त्रुटि (बेबेल से) प्राप्त करें।

'import' and 'export' may only appear at the top level 

गतिशील

यह नीचे की तरह गतिशील आयात बयान करना संभव है?

for (let foo in bar) { 
    if (bar.hasOwnProperty(foo)) { 
     import Baz from `./${foo}`; 
    } 
} 

ऊपर दिए गए बाबेल से संकलन के दौरान एक ही त्रुटि प्राप्त होती है।

क्या यह संभव है या क्या मुझे कुछ याद आ रही है?

तर्क

कारण मैं यह करने के कोशिश कर रहा हूँ कि मैं "पृष्ठ" के एक नंबर के लिए आयात का एक बहुत कुछ है और वे एक समान पैटर्न का पालन है। मैं लूप के लिए गतिशील के साथ इन फ़ाइलों को आयात करके अपना कोड बेस साफ़ करना चाहता हूं।

यदि यह संभव नहीं है तो क्या ईएस 6 में बड़ी संख्या में आयात को संभालने का एक बेहतर तरीका है?

+1

इस तरह के मामले में विरासत का उपयोग नहीं किया जा सकता है? विशिष्ट कॉल करने के लिए 'सुपर' का उपयोग करें। – Jai

+0

मैं पहले ही विरासत का उपयोग कर रहा हूं, लेकिन इन "पृष्ठों" में "पृष्ठ" विशिष्ट तर्क शामिल है। मेरे पास आधार "पृष्ठ" वर्ग है जो सभी विस्तारित है लेकिन मेरे पास बड़ी संख्या में आयात को साफ करने के लिए पर्याप्त नहीं है। – Enijar

+1

@zerkms: वे ब्लॉक से बाहर नहीं फंस गए हैं - वे वाक्यविन्यास त्रुटियां हैं। – Bergi

उत्तर

14

आप गतिशील रूप से अपनी निर्भरताओं को हल नहीं कर सकते हैं, क्योंकि imports स्थिर विश्लेषण के लिए हैं।

for (let foo in bar) { 
    if (bar.hasOwnProperty(foo)) { 
     const Baz = require(foo).Baz; 
    } 
} 
+3

"आयात स्थिर विश्लेषण के लिए हैं।" --- यह कथन अस्पष्ट है। 'आयात को आयात करने के लिए डिज़ाइन किया गया है, विश्लेषण के लिए नहीं। – zerkms

+11

@zerkms - मुझे लगता है कि उनका मतलब क्या था कि 'आयात' कथन स्थिर विश्लेषण के लिए _suitable_ होने के लिए हैं - क्योंकि वे कभी सशर्त नहीं होते हैं, उपकरण निर्भरता पेड़ों का विश्लेषण आसानी से कर सकते हैं। –

+3

"foo" "baz" और "bar" के साथ समझना मुश्किल है - वास्तविक जीवन उदाहरण के बारे में कैसे? – TetraDev

1

आवश्यकता होती है आपकी समस्या का समाधान नहीं होगा, क्योंकि यह एक तुल्यकालिक कॉल है: लेकिन, आप शायद कुछ require यहाँ की तरह कुछ का उपयोग कर सकते। वहाँ कई विकल्प हैं और वे सभी

  1. मॉड्यूल के लिए पूछ आप
  2. जरूरत है एक वादा के लिए प्रतीक्षा कर मॉड्यूल

वापस जाने के लिए ECMA स्क्रिप्ट में SystemJS का उपयोग कर आलसी लोड हो रहा है मॉड्यूल के लिए समर्थन नहीं है शामिल है। यह निश्चित रूप से सभी ब्राउज़रों में समर्थित नहीं है, इसलिए इस बीच आप जेएसपीएम या सिस्टमजेएस शिम का उपयोग कर सकते हैं।

https://github.com/ModuleLoader/es6-module-loader

8

हम ECMA साथ अब गतिशील आयात प्रस्ताव है। यह चरण 2 में है। यह babel-preset के रूप में भी उपलब्ध है।

आपके मामले के अनुसार सशर्त प्रतिपादन करने का तरीका निम्नलिखित है।

if (foo === bar) { 
    import('./Baz') 
    .then((Baz) => { 
     console.log(Baz.Baz); 
    }); 
} 

यह मूल रूप से एक वादा देता है। वादे के संकल्प से मॉड्यूल होने की उम्मीद है। प्रस्ताव में कई गतिशील आयात, डिफ़ॉल्ट आयात, जेएस फ़ाइल आयात इत्यादि जैसी चीजें हैं। आप dynamic imports here के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

+1

यह। गतिशील आयात जाने का रास्ता है। वे एक आवश्यकता() की तरह काम करते हैं, सिवाय इसके कि वे आपको मॉड्यूल के बजाए एक वादा देते हैं। – superluminary

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