ES6 आयात का उपयोग करते हुए चर नाम प्रदान करने वाले मॉड्यूल में कुछ आयात करना संभव है?
यानी मैं एक विन्यास में दिए गए मूल्यों के आधार पर कुछ मॉड्यूल को रनटाइम पर आयात करना चाहता हूं:
import something from './utils/' + variableName;
ES6 आयात का उपयोग करते हुए चर नाम प्रदान करने वाले मॉड्यूल में कुछ आयात करना संभव है?
यानी मैं एक विन्यास में दिए गए मूल्यों के आधार पर कुछ मॉड्यूल को रनटाइम पर आयात करना चाहता हूं:
import something from './utils/' + variableName;
जवाबों:
importबयान के साथ नहीं । importऔर exportइस तरह से परिभाषित किया गया है कि वे सांख्यिकीय रूप से विश्लेषण योग्य हैं, इसलिए वे रनटाइम जानकारी पर निर्भर नहीं हो सकते हैं।
आप लोडर API (पॉलीफ़िल) की तलाश कर रहे हैं , लेकिन मैं विनिर्देश की स्थिति के बारे में थोड़ा अस्पष्ट हूँ:
System.import('./utils/' + variableName).then(function(m) {
console.log(m);
});
फेलिक्स के उत्तर के अलावा , मैं स्पष्ट रूप से ध्यान दूंगा कि वर्तमान में ECMAScript 6 व्याकरण द्वारा इसकी अनुमति नहीं है :
आयात :
आयात ImportClause FromClause;
मॉड्यूल मॉड्यूल आयात करें;
FromClause :
- से ModuleSpecifier
मॉड्यूल की संख्या :
- शाब्दिक स्ट्रिंग
एक ModuleSpecifier केवल एक हो सकता है StringLiteral , न कि एक तरह अभिव्यक्ति की किसी भी अन्य प्रकार AdditiveExpression ।
const string literal। वे सांख्यिकीय रूप से अपमानजनक हैं, क्या वे नहीं हैं? यह निर्भरता के स्थान को पुन: उपयोग की संभावना बना देगा। (उदाहरण के लिए एक टेम्पलेट आयात करें और दोनों टेम्पलेट और उपलब्ध टेम्पलेट का स्थान है)।
जबकि यह वास्तव में एक गतिशील आयात नहीं है (उदाहरण के लिए, मेरी परिस्थिति में, मैं नीचे आयात की जा रही सभी फ़ाइलों को आयात किया जाएगा और वेबपैक द्वारा बंडल किया जाएगा, रनटाइम में चयनित नहीं), एक पैटर्न जो मैं उपयोग कर रहा हूं जो कुछ परिस्थितियों में सहायता कर सकता है। :
import Template1 from './Template1.js';
import Template2 from './Template2.js';
const templates = {
Template1,
Template2
};
export function getTemplate (name) {
return templates[name];
}
या वैकल्पिक रूप से:
// index.js
export { default as Template1 } from './Template1';
export { default as Template2 } from './Template2';
// OtherComponent.js
import * as templates from './index.js'
...
// handy to be able to fall back to a default!
return templates[name] || templates.Template1;
मुझे नहीं लगता कि मैं एक डिफ़ॉल्ट रूप से आसानी से वापस गिर सकता हूं require(), जो कि एक निर्मित टेम्पलेट पथ को आयात करने की कोशिश करने पर एक त्रुटि फेंकता है जो मौजूद नहीं है।
आवश्यकता और आयात के बीच अच्छे उदाहरण और तुलनाएं यहां देखी जा सकती हैं: http://www.2ality.com/2014/09/es6-modules-fin.html
@Iainastacio से पुन: निर्यात पर उत्कृष्ट प्रलेखन: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
मैं इस दृष्टिकोण पर प्रतिक्रिया सुनने के लिए इच्छुक हूँ :)
Object.values(templates)।
एक नया विनिर्देशन है जिसे ईएस मॉड्यूल के लिए एक गतिशील आयात कहा जाता है । असल में, आप बस फोन import('./path/file.js')करते हैं और आप जाने के लिए अच्छे हैं। फ़ंक्शन एक वादा लौटाता है, जो आयात सफल होने पर मॉड्यूल के साथ हल होता है।
async function importModule() {
try {
const module = await import('./path/module.js');
} catch (error) {
console.error('import failed');
}
}
उपयोग-मामलों में मार्ग आधारित घटक शामिल हैं जो रिएक्ट, वीयू आदि के लिए आयात करते हैं और एक बार लोड करने के दौरान आलसी लोड मॉड्यूल की क्षमता की आवश्यकता होती है।
यहाँ Google डेवलपर्स पर एक स्पष्टीकरण दिया गया है ।
MDN के अनुसार यह हर मौजूदा प्रमुख ब्राउज़र (IE को छोड़कर) द्वारा समर्थित है और caniuse.com वैश्विक बाजार में शेयर का 87% समर्थन दिखाता है। IE या गैर-क्रोमियम एज में फिर से कोई समर्थन नहीं।
मैं विशेष रूप importसे Node.js में ES6 के लिए पूछे गए प्रश्न को समझता हूं , लेकिन निम्नलिखित अन्य लोगों को अधिक सामान्य समाधान खोजने में मदद कर सकते हैं:
let variableName = "es5.js";
const something = require(`./utils/${variableName}`);
ध्यान दें कि यदि आप ES6 मॉड्यूल आयात कर रहे हैं और defaultनिर्यात को एक्सेस करने की आवश्यकता है , तो आपको निम्नलिखित में से एक का उपयोग करना होगा:
let variableName = "es6.js";
// Assigning
const defaultMethod = require(`./utils/${variableName}`).default;
// Accessing
const something = require(`./utils/${variableName}`);
something.default();
आप इस दृष्टिकोण के साथ विनाशकारी का भी उपयोग कर सकते हैं जो आपके अन्य आयातों के साथ अधिक वाक्यविन्यास परिचित करा सकता है:
// Destructuring
const { someMethod } = require(`./utils/${variableName}`);
someMethod();
दुर्भाग्य से, यदि आप defaultविनाशकारी होने के साथ-साथ उपयोग करना चाहते हैं, तो आपको कई चरणों में यह करने की आवश्यकता होगी:
// ES6 Syntax
Import defaultMethod, { someMethod } from "const-path.js";
// Destructuring + default assignment
const something = require(`./utils/${variableName}`);
const defaultMethod = something.default;
const { someMethod, someOtherMethod } = something;
मुझे यह सिंटैक्स पसंद है, लेकिन यह काम करता है:
लिखने के बजाय
import memberName from "path" + "fileName";
// this will not work!, since "path" + "fileName" need to be string literal
इस सिंटैक्स का उपयोग करें:
let memberName = require("path" + "fileName");
require()फ़ाइलें लोड करने के लिए एक Node.JS विधि है, जो प्रारंभिक संस्करण है। importबयान नया संस्करण है, जो अब आधिकारिक भाषा वाक्य रचना का हिस्सा है। हालाँकि कई मामलों में ब्राउज़र पिछले एक (विज्ञान के पीछे) का उपयोग करेगा। आवश्यकता विवरण आपकी फ़ाइलों को भी कैश करेगा, इसलिए यदि कोई फ़ाइल 2 बार लोड होती है तो इसे मेमोरी (बेहतर प्रदर्शन) से लोड किया जाएगा। आयात के तरीके के अपने फायदे हैं - यदि आप वेबपैक का उपयोग कर रहे हैं। तब वेबपैक मृत संदर्भों को हटा सकता है (ये स्क्रिप्ट क्लाइंट को डाउनलोड नहीं की जाएगी)।
डायनामिक इंपोर्ट () (क्रोम 63 में उपलब्ध) आपका काम करेगा। ऐसे:
let variableName = 'test.js';
let utilsPath = './utils/' + variableName;
import(utilsPath).then((module) => { module.something(); });
./utils/test.js
export default () => {
doSomething...
}
फ़ाइल से कॉल करें
const variableName = 'test';
const package = require(`./utils/${variableName}`);
package.default();