ES6 আমদানিতে বিকল্পগুলি পাস করা কি সম্ভব?
আপনি এটি কীভাবে অনুবাদ করবেন:
var x = require('module')(someoptions);
ES6 এ?
ES6 আমদানিতে বিকল্পগুলি পাস করা কি সম্ভব?
আপনি এটি কীভাবে অনুবাদ করবেন:
var x = require('module')(someoptions);
ES6 এ?
উত্তর:
একক import
বিবৃতি দিয়ে এটি করার কোনও উপায় নেই , এটি আমন্ত্রণের অনুমতি দেয় না।
সুতরাং আপনি এটিকে সরাসরি কল করবেন না, তবে আপনি সাধারণভাবে ডিফল্ট রফতানির ক্ষেত্রে যা করতে পারেন তা ঠিক একইভাবে করতে পারেন:
// module.js
export default function(options) {
return {
// actual module
}
}
// main.js
import m from 'module';
var x = m(someoptions);
বিকল্পভাবে, আপনি যদি মডিউল লোডার ব্যবহার করেন যা monadic প্রতিশ্রুতি সমর্থন করে , আপনি এর মতো কিছু করতে সক্ষম হতে পারেন
System.import('module').ap(someoptions).then(function(x) {
…
});
নতুন import
অপারেটরের সাথে এটি হয়ে উঠতে পারে
const promise = import('module').then(m => m(someoptions));
অথবা
const x = (await import('module'))(someoptions)
তবে আপনি সম্ভবত একটি গতিশীল আমদানি চাই না তবে একটি স্থিতিশীল।
import x from 'module' use someoptions;
সিনডেক্সের মতো কিছু ছিল
import {x, y} from 'module'
) রাখলে অনুমতি দেওয়া উচিত নয় । তাহলে আমি একাধিক যুক্তি পাস করতে চাইলে সিনট্যাক্সটি কী হওয়া উচিত? বা যুক্তি একটি অ্যারে ছড়িয়ে? এটি একটি সংকীর্ণ ব্যবহারের কেস এবং মূলত আপনি কোনও ফাংশন কলের জন্য আলাদা সিনট্যাক্স যুক্ত করার চেষ্টা করছেন তবে আমাদের ইতিমধ্যে ফাংশন কল রয়েছে যা আমাদের অন্যান্য সমস্ত ক্ষেত্রে মোকাবেলা করার অনুমতি দেয়।
var session = require('express-session'); var RedisStore = require('connect-redis')(session);
হলাম আমি যদি ভাবছিলাম যে একটি লাইন সমাধান আছে কিনা। আমি রেডিসটোর অ্যাসাইনমেন্টটি 2 লাইনে বিভক্ত করে পুরোপুরি বেঁচে থাকতে পারি :)
import {default(someoptions) as x} from 'module'
in এর মতো আমি যদি এমন কিছু করার প্রয়োজন হয় তবে আমি কল্পনা করতে পারি ।
session
/ connect-redis
উদাহরণস্বরূপ, আমি ভালো সিনট্যাক্স কল্পী করা হয়েছে: import session from 'express-session'); import RedisStore(session) from 'connect-redis'
।
ES6 ব্যবহার করে আমার সমাধান এখানে
@ বার্গির প্রতিক্রিয়াটির সাথে খুব ইনলাইন, এটি আমদানি তৈরি করার সময় আমি ব্যবহৃত "টেমপ্লেট" যা class
ঘোষণার জন্য প্যারামিটারগুলির প্রয়োজন হয় । এটি একটি isomorphic ফ্রেমওয়ার্ক আমি লিখছি ব্যবহৃত হয়, তাই ব্রাউজারে এবং Node.js (আমি ব্যবহার একটি transpiler সঙ্গে কাজ করবে Babel
সঙ্গে Webpack
):
./MyClass.js
export default (Param1, Param2) => class MyClass {
constructor(){
console.log( Param1 );
}
}
./main.js
import MyClassFactory from './MyClass.js';
let MyClass = MyClassFactory('foo', 'bar');
let myInstance = new MyClass();
foo
উপরেরটি একটি কনসোল আউটপুট হবে
সম্পাদনা
বাস্তব বিশ্বের উদাহরণস্বরূপ, আমি এটি একটি ফ্রেমওয়ার্কের মধ্যে অন্য শ্রেণি এবং দৃষ্টান্তগুলি অ্যাক্সেসের জন্য একটি নেমস্পেসে পাস করতে ব্যবহার করছি। যেহেতু আমরা কেবল একটি ফাংশন তৈরি করছি এবং বস্তুটিকে একটি আর্গুমেন্ট হিসাবে পাস করছি, আমরা এটি আমাদের শ্রেণির ঘোষণার লাইক দিয়ে ব্যবহার করতে পারি:
export default (UIFramework) => class MyView extends UIFramework.Type.View {
getModels() {
// ...
UIFramework.Models.getModelsForView( this._models );
// ...
}
}
আমদানিটি কিছুটা জটিল এবং automagical
আমার ক্ষেত্রে এটি একটি সম্পূর্ণ কাঠামো হিসাবে দেওয়া হয়েছে, তবে মূলত এটি যা ঘটছে তা হ'ল:
// ...
getView( viewName ){
//...
const ViewFactory = require(viewFileLoc);
const View = ViewFactory(this);
return new View();
}
// ...
আশা করি এটা কাজে লাগবে!
MyView
ফ্রেমওয়ার্কের নেমস্পেসে উপলব্ধ কিছু আইটেম প্রসারিত করে। যদিও এটি ক্লাসে কেবলমাত্র প্যারামিটার হিসাবে পাস করা একেবারেই সম্ভব, এটি ক্লাস কখন এবং কোথায় ইনস্ট্যান্ট করা হয় তার উপরও নির্ভর করে; বহনযোগ্যতা তারপর প্রভাবিত হয়। অনুশীলনে, এই ক্লাসগুলি অন্য ফ্রেমওয়ার্কগুলিতে হস্তান্তর করা যেতে পারে যা তাদের আলাদাভাবে ইনস্ট্যান্ট করে তুলতে পারে (যেমন, কাস্টম প্রতিক্রিয়া উপাদানগুলি)। শ্রেণিটি যখন কাঠামোর সুযোগের বাইরে নিজেকে খুঁজে পায়, তখনও এই পদ্ধতিটির কারণে তাত্ক্ষণিকভাবে ফ্রেমওয়ার্কটিতে অ্যাক্সেস বজায় রাখতে পারে।
@ Bergi এর উপর নির্মাণের উত্তর ব্যবহার করতে ডিবাগ মডিউল es6 ব্যবহার করে নিম্নলিখিত হবে
// original
var debug = require('debug')('http');
// ES6
import * as Debug from 'debug';
const debug = Debug('http');
// Use in your code as normal
debug('Hello World!');
আমি বিশ্বাস করি আপনি এস module মডিউল লোডার ব্যবহার করতে পারেন। http://babeljs.io/docs/learn-es6/
System.import("lib/math").then(function(m) {
m(youroptionshere);
});
m(youroptionshere)
শেষ পর্যন্ত ফলাফল কোথায় ? আমি মনে করি আপনি লিখতে পারেন System.import('lib/math').then(m => m(options)).then(module => { /* code using module here */})
... তবে এটি খুব পরিষ্কার নয় not
আপনাকে কেবল এই 2 টি লাইন যুক্ত করতে হবে।
import xModule from 'module';
const x = xModule('someOptions');
xModule
এখানে বিভ্রান্ত করছে। আপনার কাছে যা আছে তা হ'ল import func from 'module'; func('someOptions');
।
আমি এই থ্রেডে নেমেছি কিছুটা অনুরূপ সন্ধান করে এবং অন্তত কিছু ক্ষেত্রে (তবে নীচে মন্তব্য দেখুন) এক ধরণের সমাধানের প্রস্তাব দিতে চাই।
ব্যবহারের ক্ষেত্রে
আমার একটি মডিউল রয়েছে, এটি লোড হওয়ার সাথে সাথে কিছু তাত্ক্ষণিক যুক্তি চালাচ্ছে। আমি এই init যুক্তিকে মডিউলটির বাইরে কল করতে পছন্দ করি না (যা কল new SomeClass(p1, p2)
বা একই new ((p1, p2) => class SomeClass { ... p1 ... p2 ... })
রকম)।
আমি এই করি যে এই আর ডি যুক্তি একবারে চলবে, এক ধরণের একক তাত্ক্ষণিক প্রবাহ, তবে কিছু নির্দিষ্ট প্যারামিট্রাইজড প্রসঙ্গে একবার।
উদাহরণ
service.js
এর খুব প্রাথমিক সুযোগ রয়েছে:
let context = null; // meanwhile i'm just leaving this as is
console.log('initialized in context ' + (context ? context : 'root'));
মডিউল এগুলি করে:
import * as S from 'service.js'; // console has now "initialized in context root"
মডিউল বি করে:
import * as S from 'service.js'; // console stays unchanged! module's script runs only once
এতদূর এত ভাল: পরিষেবা উভয় মডিউলের জন্য উপলব্ধ তবে এটি একবারেই শুরু হয়েছিল।
সমস্যা
এটি কীভাবে এটি অন্য দৃষ্টান্ত হিসাবে চালানো যায় এবং নিজেই আবার অন্য প্রসঙ্গে নিজেকে চালিত করে তুলবে, মডিউল সি তে বলবেন?
সমাধান?
এটি আমি যা সম্পর্কে ভাবছি: ক্যোয়ারী প্যারামিটারগুলি ব্যবহার করুন। পরিষেবাটিতে আমরা নিম্নলিখিতগুলি যুক্ত করব:
let context = new URL(import.meta.url).searchParams.get('context');
মডিউল সি করবে:
import * as S from 'service.js?context=special';
মডিউলটি আবার আমদানি করা হবে, এটির প্রাথমিক সূত্র যুক্তি চলবে এবং আমরা কনসোলে দেখতে পাব:
initialized in context special
মন্তব্য: আমি নিজেই এই পদ্ধতির খুব বেশি অনুশীলন না করার পরামর্শ দেব, তবে এটিকে শেষ উপায় হিসাবে ছেড়ে দিন। কেন? একাধিকবার আমদানি করা মডিউলটি কোনও নিয়মের চেয়ে ব্যতিক্রম বেশি, সুতরাং এটি কিছুটা অপ্রত্যাশিত আচরণ এবং এটি কোনও গ্রাহককে বিভ্রান্ত করতে পারে বা এমনকি যদি এটির নিজস্ব 'সিঙ্গলটন' উপমাগুলিও ভেঙে দেয়।
উদাহরণস্বরূপ ডিবাগ মডিউলটি ব্যবহার করে আমি এই প্রশ্নটি গ্রহণ করি;
এই মডিউলটির এনপিএম পৃষ্ঠায়, আপনার এটি রয়েছে:
var ডিবাগ = প্রয়োজনীয় ('ডিবাগ') ('HTTP')
উপরের লাইনে, একটি স্ট্রিং তৈরি করা মডিউলটিতে আমদানি করা হয়। আপনি ES6 এ কীভাবে করবেন তা এখানে
আমদানি করুন deb ডিবাগ হিসাবে ডিবাগ} হিসাবে 'ডিবাগ' কনট ডিবাগ = ডিবাগ ('http');
আশা করছি এটা ওখানে কাওকে সাহায্য করবে.
System.import(module)
, নিশ্চিত নয় যে এটি আর্গুমেন্টের অনুমোদন দেয় বা না, ES6 সম্পর্কে আরও বেশি কিছু জানেন এমন ব্যক্তি সম্ভবত করেন?