ES6 মডিউল আমদানিতে বিকল্পগুলি পাস করুন


144

ES6 আমদানিতে বিকল্পগুলি পাস করা কি সম্ভব?

আপনি এটি কীভাবে অনুবাদ করবেন:

var x = require('module')(someoptions);

ES6 এ?


আপনি যে পারেন তা নিশ্চিত নন, একটি মডিউল লোডার এপিআই রয়েছে, বা কমপক্ষে এমন কোনও সময় ছিল যা এরকম কিছু ব্যবহার করেছিল System.import(module), নিশ্চিত নয় যে এটি আর্গুমেন্টের অনুমোদন দেয় বা না, ES6 সম্পর্কে আরও বেশি কিছু জানেন এমন ব্যক্তি সম্ভবত করেন?
অ্যাডিনিও

এর জন্য প্রস্তাবিত সমাধান রয়েছে, যার জন্য ইতিমধ্যে নোড.জেজে (একটি প্লাগইনের মাধ্যমে) এবং ওয়েবপ্যাকটিতে বাস্তবায়ন রয়েছে: 2ality.com/2017/01/import-operator.html
ম্যাট ব্রাউন

উত্তর:


104

একক 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)

তবে আপনি সম্ভবত একটি গতিশীল আমদানি চাই না তবে একটি স্থিতিশীল।


7
আপনাকে ধন্যবাদ আমি চাই import x from 'module' use someoptions;সিনডেক্সের মতো কিছু ছিল
ফ্যাব্রিজিও গিয়র্ডানো

1
@ ফ্যাবরিজিও: আপনি যদি এ সম্পর্কে আরও চিন্তা করেন তবে এটি সত্যিই সহায়ক হবে না। এটি কেবল তখনই কাজ করবে যখন মডিউল কোনও ফাংশন রফতানি করে এবং সম্ভবত আমরা আমদানির নামকরণ (যেমন import {x, y} from 'module') রাখলে অনুমতি দেওয়া উচিত নয় । তাহলে আমি একাধিক যুক্তি পাস করতে চাইলে সিনট্যাক্সটি কী হওয়া উচিত? বা যুক্তি একটি অ্যারে ছড়িয়ে? এটি একটি সংকীর্ণ ব্যবহারের কেস এবং মূলত আপনি কোনও ফাংশন কলের জন্য আলাদা সিনট্যাক্স যুক্ত করার চেষ্টা করছেন তবে আমাদের ইতিমধ্যে ফাংশন কল রয়েছে যা আমাদের অন্যান্য সমস্ত ক্ষেত্রে মোকাবেলা করার অনুমতি দেয়।
ফেলিক্স ক্লিং

3
@ ফেলিক্সক্লিং আমি আপনার সাথে পুরোপুরি একমত আমি একটি পুরানো এক্সপ্রেস ওয়েবআপ রূপান্তর করছিলাম এবং আমার মুখোমুখি var session = require('express-session'); var RedisStore = require('connect-redis')(session);হলাম আমি যদি ভাবছিলাম যে একটি লাইন সমাধান আছে কিনা। আমি রেডিসটোর অ্যাসাইনমেন্টটি 2 লাইনে বিভক্ত করে পুরোপুরি বেঁচে থাকতে পারি :)
ফ্যাব্রিজিও

@ ফ্যাবরিজিও জিওর্ডানো: ইএস import {default(someoptions) as x} from 'module'in এর মতো আমি যদি এমন কিছু করার প্রয়োজন হয় তবে আমি কল্পনা করতে পারি ।
বার্গি

2
জন্য session/ connect-redisউদাহরণস্বরূপ, আমি ভালো সিনট্যাক্স কল্পী করা হয়েছে: import session from 'express-session'); import RedisStore(session) from 'connect-redis'
জেফ হ্যান্ডলি

24

ধারণা

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();
}
// ...

আশা করি এটা কাজে লাগবে!


যেহেতু আপনার সমস্ত আমদানিকৃত মডিউলগুলি ক্লাস, ক্লাসটি ইনস্ট্যান্ট করার সময় কেন প্যারামিটারটি পাস করবেন না?
জেসনসভাও

1
@ জেসনজ়াও এখানে উল্লেখ করার জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হচ্ছে শ্রেণিটি MyViewফ্রেমওয়ার্কের নেমস্পেসে উপলব্ধ কিছু আইটেম প্রসারিত করে। যদিও এটি ক্লাসে কেবলমাত্র প্যারামিটার হিসাবে পাস করা একেবারেই সম্ভব, এটি ক্লাস কখন এবং কোথায় ইনস্ট্যান্ট করা হয় তার উপরও নির্ভর করে; বহনযোগ্যতা তারপর প্রভাবিত হয়। অনুশীলনে, এই ক্লাসগুলি অন্য ফ্রেমওয়ার্কগুলিতে হস্তান্তর করা যেতে পারে যা তাদের আলাদাভাবে ইনস্ট্যান্ট করে তুলতে পারে (যেমন, কাস্টম প্রতিক্রিয়া উপাদানগুলি)। শ্রেণিটি যখন কাঠামোর সুযোগের বাইরে নিজেকে খুঁজে পায়, তখনও এই পদ্ধতিটির কারণে তাত্ক্ষণিকভাবে ফ্রেমওয়ার্কটিতে অ্যাক্সেস বজায় রাখতে পারে।
সুইভেল

@ সুইভেল দয়া করে অনুরূপ ইস্যুতে আমার সহায়তা প্রয়োজন দয়া করে সহায়তা করুন: stackoverflow.com/questions/55214957/…
টিএসআর

12

@ 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!');

4

আমি বিশ্বাস করি আপনি এস module মডিউল লোডার ব্যবহার করতে পারেন। http://babeljs.io/docs/learn-es6/

System.import("lib/math").then(function(m) {
  m(youroptionshere);
});

3
কিন্তু m(youroptionshere)শেষ পর্যন্ত ফলাফল কোথায় ? আমি মনে করি আপনি লিখতে পারেন System.import('lib/math').then(m => m(options)).then(module => { /* code using module here */})... তবে এটি খুব পরিষ্কার নয় not
স্টিজন ডি উইট

2
বাহ আমি বিশ্বাস করতে পারি না E6 এ করার জন্য কোনও মার্জিত উপায় নেই। আমি মূলত মডিউলগুলি এইভাবে লিখি।
রবার্ট মোসকাল

3

আপনাকে কেবল এই 2 টি লাইন যুক্ত করতে হবে।

import xModule from 'module';
const x = xModule('someOptions');

1
এটি কেবল আপনি আমদানি করে কল করছেন এমন কোনও ফাংশনে পরামিতিগুলি পেরিয়ে যাচ্ছে। আপনি যে মডিউলটি থেকে এটি আমদানি করেন এটি কোনও বিকল্প পাস করছে না । xModuleএখানে বিভ্রান্ত করছে। আপনার কাছে যা আছে তা হ'ল import func from 'module'; func('someOptions');
ড্যান ড্যাসক্লেস্কু

1

আমি এই থ্রেডে নেমেছি কিছুটা অনুরূপ সন্ধান করে এবং অন্তত কিছু ক্ষেত্রে (তবে নীচে মন্তব্য দেখুন) এক ধরণের সমাধানের প্রস্তাব দিতে চাই।

ব্যবহারের ক্ষেত্রে

আমার একটি মডিউল রয়েছে, এটি লোড হওয়ার সাথে সাথে কিছু তাত্ক্ষণিক যুক্তি চালাচ্ছে। আমি এই 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

মন্তব্য: আমি নিজেই এই পদ্ধতির খুব বেশি অনুশীলন না করার পরামর্শ দেব, তবে এটিকে শেষ উপায় হিসাবে ছেড়ে দিন। কেন? একাধিকবার আমদানি করা মডিউলটি কোনও নিয়মের চেয়ে ব্যতিক্রম বেশি, সুতরাং এটি কিছুটা অপ্রত্যাশিত আচরণ এবং এটি কোনও গ্রাহককে বিভ্রান্ত করতে পারে বা এমনকি যদি এটির নিজস্ব 'সিঙ্গলটন' উপমাগুলিও ভেঙে দেয়।


0

উদাহরণস্বরূপ ডিবাগ মডিউলটি ব্যবহার করে আমি এই প্রশ্নটি গ্রহণ করি;

এই মডিউলটির এনপিএম পৃষ্ঠায়, আপনার এটি রয়েছে:

var ডিবাগ = প্রয়োজনীয় ('ডিবাগ') ('HTTP')

উপরের লাইনে, একটি স্ট্রিং তৈরি করা মডিউলটিতে আমদানি করা হয়। আপনি ES6 এ কীভাবে করবেন তা এখানে


আমদানি করুন deb ডিবাগ হিসাবে ডিবাগ} হিসাবে 'ডিবাগ' কনট ডিবাগ = ডিবাগ ('http');


আশা করছি এটা ওখানে কাওকে সাহায্য করবে.


ইতিমধ্যে পোস্ট করা একটি সদৃশ এমন একটি উত্তর কেন পোস্ট করবেন ?
ড্যান ড্যাসক্লেস্কু

1
আমার খারাপ। উল্লিখিত পোস্টটি কখনও দেখেনি। শুধু প্রশ্নটি তাকান এবং এটি একটি ছুরিকাঘাত। এটি আমার নজরে আনার জন্য ধন্যবাদ
আকিনওয়ালে ফোলারুনশো হাবিব

আপনাকে স্বাগতম. আপনি চাইলে ডুপ্লিকেট উত্তরও মুছতে পারেন।
ড্যান ড্যাসক্লেস্কু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.