ES6 मॉड्यूल आयात करने के लिए विकल्प पास करें


144

क्या ईएस 6 आयात के विकल्प पारित करना संभव है?

आप इसका अनुवाद कैसे करते हैं:

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);

वैकल्पिक रूप से, यदि आप एक मॉड्यूल लोडर का उपयोग करते हैं जो कि मौद्रिक वादों का समर्थन करता है, तो आप ऐसा कुछ करने में सक्षम हो सकते हैं

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;सिंटैक्स के थोड़े की तरह कुछ था
Fabrizio Giordano

1
@ फैब्रिज़ियो: यदि आप इसके बारे में आगे सोचते हैं, तो यह वास्तव में उपयोगी नहीं होगा। यह केवल तभी काम करेगा जब मॉड्यूल एक फ़ंक्शन का निर्यात करता है और शायद हमें अनुमति नहीं दी जानी चाहिए अगर हमने आयात (यानी import {x, y} from 'module') का नाम दिया है । फिर अगर मुझे कई तर्क पास करने हैं तो वाक्य रचना क्या होनी चाहिए? या तर्कों की एक सरणी फैलाएं? यह एक संकीर्ण उपयोग मामला है और मूल रूप से आप फ़ंक्शन कॉल के लिए एक अलग सिंटैक्स जोड़ने की कोशिश कर रहे हैं, लेकिन हमारे पास पहले से ही फ़ंक्शन कॉल हैं जो हमें अन्य सभी मामलों से निपटने की अनुमति देते हैं।
फेलिक्स क्लिंग

3
@FelixKling मैं आपसे पूरी तरह सहमत हूं। मैं एक पुराने एक्सप्रेस वेबएप को परिवर्तित कर रहा था और मुझे var session = require('express-session'); var RedisStore = require('connect-redis')(session);लगता है कि मैं सोच रहा था कि क्या एक लाइन समाधान था। मैं पूरी तरह से 2 लाइनों में RedisStore असाइनमेंट को विभाजित करने के साथ बच सकता हूं :)
Fabrizio Giordano

@FabrizioGiordano: मैं ईएस 7 में कुछ सोच सकता हूं import {default(someoptions) as x} from 'module', अगर वास्तव में इसके लिए कोई जरूरत है।
बर्गी

2
के लिए session/ connect-redisउदाहरण के लिए, मैं इस तरह वाक्य रचना की कल्पना की गई है: import session from 'express-session'); import RedisStore(session) from 'connect-redis'
जेफ हैन्डले

24

संकल्पना

यहाँ मेरा समाधान ES6 का उपयोग कर रहा है

@ बर्गी की प्रतिक्रिया के साथ बहुत अधिक इनलाइन, यह "टेम्पलेट" है जो मैं आयात करते समय उपयोग करता हूं जो classघोषणाओं के लिए पारित मापदंडों की आवश्यकता होती है । यह एक आइसोमॉर्फिक फ्रेमवर्क पर उपयोग किया जाता है जो मैं लिख रहा हूं, इसलिए ब्राउज़र में और ट्रांसपॉइलर के 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();
}
// ...

आशा है कि ये आपकी मदद करेगा!


चूंकि आपके सभी आयातित मॉड्यूल क्लास हैं, इसलिए क्लास को इंस्टेंट करते समय पैरामीटर को पास क्यों नहीं किया जाता है?
jasonszhao

1
@ajonszhao यहां ध्यान देने योग्य सबसे महत्वपूर्ण बात यह है कि वर्ग MyViewफ्रेमवर्क के नामस्थान में उपलब्ध कुछ वस्तुओं का विस्तार करता है। जबकि कक्षा के लिए इसे केवल एक पैरामीटर के रूप में पारित करना बिल्कुल संभव है, यह इस बात पर भी निर्भर करता है कि कक्षा को कब और कहाँ पर त्वरित किया जाता है; पोर्टेबिलिटी तब प्रभावित होती है। व्यवहार में, इन वर्गों को अन्य चौखटों के हवाले किया जा सकता है जो उन्हें अलग-अलग तरीके से त्वरित कर सकते हैं (उदाहरण के लिए, कस्टम रिएक्ट घटक)। जब वर्ग खुद को फ्रेमवर्क के दायरे से बाहर पाता है, तब भी इस पद्धति के कारण त्वरित रूप से फ्रेमवर्क तक पहुंच बनाए रख सकता है।
कुंडा

@Swivel कृपया सहायता करें मुझे इसी तरह के मुद्दे के साथ मदद चाहिए: stackoverflow.com/questions/55214957/…
TSR

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

मेरा मानना ​​है कि आप es6 मॉड्यूल लोडर का उपयोग कर सकते हैं। 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 */})... लेकिन यह बहुत स्पष्ट नहीं है।
स्टिजेन डे विट

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

यहाँ उदाहरण के रूप में डिबग मॉड्यूल का उपयोग करते हुए इस सवाल पर मेरा कहना है;

इस मॉड्यूल के npm पेज पर, आपके पास यह है:

var डिबग = आवश्यकता ('डीबग') ('http')

ऊपर की पंक्ति में, एक स्ट्रिंग मॉड्यूल को पारित किया जाता है जिसे आयात किया जाता है, निर्माण के लिए। यहां बताया गया है कि ईएस 6 में आप भी ऐसा ही करेंगे


'डिबग के रूप में डिबग' को 'डिबग' से डिबग में आयात करें = डिबग ('http');


उम्मीद है कि इससे वहां किसी को मदद मिलेगी।


क्यों एक उत्तर पोस्ट करें जो पहले से ही पोस्ट किए गए डुप्लिकेट को दोहराता है ?
डैन डैस्केल्स्कु

1
मेरी गलती। उल्लिखित पोस्ट कभी नहीं देखा। बस सवाल देखा और उस पर एक तमाचा लगा। इसे मेरे संज्ञान में लाने के लिए धन्यवाद।
अकिनवाले फेलोरुनशो हबीब

आपका स्वागत है। आप चाहें तो डुप्लिकेट उत्तर को हटा भी सकते हैं।
बजे डैन डस्केलस्क्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.