ES6 আমদানি ব্যবহার করার সময় পরিবর্তনশীল নাম সরবরাহ করে মডিউলটিতে কিছু আমদানি করা কি সম্ভব?
অর্থাৎ আমি কোনও রানটাইমের সময় কোনও মডিউল একটি কনফিগারে প্রদত্ত মানের উপর নির্ভর করে আমদানি করতে চাই:
import something from './utils/' + variableName;
ES6 আমদানি ব্যবহার করার সময় পরিবর্তনশীল নাম সরবরাহ করে মডিউলটিতে কিছু আমদানি করা কি সম্ভব?
অর্থাৎ আমি কোনও রানটাইমের সময় কোনও মডিউল একটি কনফিগারে প্রদত্ত মানের উপর নির্ভর করে আমদানি করতে চাই:
import something from './utils/' + variableName;
উত্তর:
import
বিবৃতি দিয়ে নয় । import
এবং export
এমনভাবে সংজ্ঞায়িত করা হয় যে এগুলি স্থিতিশীলভাবে বিশ্লেষণযোগ্য, তাই তারা রানটাইম তথ্যের উপর নির্ভর করতে পারে না।
আপনি লোডার এপিআই (পলিফিল) সন্ধান করছেন তবে আমি স্পেসিফিকেশনটির স্থিতি সম্পর্কে কিছুটা অস্পষ্ট:
System.import('./utils/' + variableName).then(function(m) {
console.log(m);
});
ফেলিক্সের উত্তর ছাড়াও , আমি স্পষ্টভাবে নোট করব যে এটি বর্তমানে ইসমাস্ক্রিপ্ট gram ব্যাকরণ দ্বারা অনুমোদিত নয় :
আমদানি ঘোষণা :
আমদানি ক্লাস ফ্রম ক্লাউজ;
আমদানি মডিউলস্পিফায়ার;
ক্লাস থেকে :
- মডিউলস্পিফায়ার থেকে
মডিউলস্পিফায়ার :
- StringLiteral
একজন 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-final.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');
}
}
ব্যবহারের ক্ষেত্রে রিট, ভিউ ইত্যাদির জন্য রুট ভিত্তিক উপাদান আমদানি এবং রানটাইমের সময় একবার প্রয়োজন হলে অলস লোড মডিউলগুলির দক্ষতা অন্তর্ভুক্ত ।
গুগল বিকাশকারীদের সম্পর্কে এখানে একটি ব্যাখ্যা দেওয়া আছে ।
এমডিএন অনুসারে এটি প্রতিটি বর্তমান প্রধান ব্রাউজার (আইই বাদে) দ্বারা সমর্থিত এবং ক্যানিজ ডট কম বিশ্বব্যাপী বাজারের শেয়ার জুড়ে ৮ 87% সমর্থন দেখায়। আবার আইই বা নন-ক্রোমিয়াম এজ তে কোনও সমর্থন নেই।
আমি বিশেষভাবে নোড.জেজে ES6 import
এর জন্য জিজ্ঞাসা করা প্রশ্নটি বুঝতে পেরেছি , তবে নিম্নলিখিতগুলি আরও জেনেরিক সমাধান অনুসন্ধান করতে অন্যদের সহায়তা করতে পারে:
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()
ফাইল লোড করার জন্য একটি নোড.জেএস পদ্ধতি, এটি প্রাথমিক সংস্করণ। import
বিবৃতিটি নতুন সংস্করণ, যা এখন অফিশিয়াল ভাষা সিনট্যাক্সের অংশ। তবে অনেক ক্ষেত্রে ব্রাউজারটি আগেরটি (বিজ্ঞানের পিছনে) ব্যবহার করবে। প্রয়োজনীয় বিবৃতিটি আপনার ফাইলগুলি নগদও করবে, সুতরাং কোনও ফাইল যদি দ্বিতীয়বার লোড করা হয় তবে এটি মেমরি থেকে লোড হবে (আরও ভাল পারফরম্যান্স)। আমদানির উপায়টির নিজস্ব সুবিধা রয়েছে - যদি আপনি ওয়েবপ্যাক ব্যবহার করেন। তারপরে ওয়েবপ্যাকটি মৃত রেফারেন্সগুলি সরিয়ে ফেলতে পারে (এই স্ক্রিপ্টগুলি ক্লায়েন্টকে ডাউনলোড করা হবে না)।
গতিশীল আমদানি () (ক্রোম 63+ এ উপলব্ধ) আপনার কাজ করবে job এখানে কীভাবে:
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();