क्या ईएस 6 आयात के विकल्प पारित करना संभव है?
आप इसका अनुवाद कैसे करते हैं:
var x = require('module')(someoptions);
ES6 के लिए
क्या ईएस 6 आयात के विकल्प पारित करना संभव है?
आप इसका अनुवाद कैसे करते हैं:
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);
वैकल्पिक रूप से, यदि आप एक मॉड्यूल लोडर का उपयोग करते हैं जो कि मौद्रिक वादों का समर्थन करता है, तो आप ऐसा कुछ करने में सक्षम हो सकते हैं
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 लाइनों में RedisStore असाइनमेंट को विभाजित करने के साथ बच सकता हूं :)
import {default(someoptions) as x} from 'module'
, अगर वास्तव में इसके लिए कोई जरूरत है।
session
/ connect-redis
उदाहरण के लिए, मैं इस तरह वाक्य रचना की कल्पना की गई है: import session from 'express-session'); import RedisStore(session) from 'connect-redis'
।
यहाँ मेरा समाधान 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();
}
// ...
आशा है कि ये आपकी मदद करेगा!
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!');
मेरा मानना है कि आप es6 मॉड्यूल लोडर का उपयोग कर सकते हैं। 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 */})
... लेकिन यह बहुत स्पष्ट नहीं है।
आपको बस इन 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
टिप्पणी: मैं स्वयं इस दृष्टिकोण का अधिक अभ्यास नहीं करने की सलाह दूंगा, लेकिन इसे अंतिम उपाय के रूप में छोड़ दूंगा। क्यों? एक से अधिक बार आयात किए गए मॉड्यूल एक नियम की तुलना में अधिक अपवाद है, इसलिए यह कुछ हद तक अप्रत्याशित व्यवहार है और जैसे कि उपभोक्ताओं को भ्रमित कर सकता है या यहां तक कि अपने स्वयं के 'सिंगलटन' प्रतिमानों को तोड़ सकता है, यदि कोई हो।
यहाँ उदाहरण के रूप में डिबग मॉड्यूल का उपयोग करते हुए इस सवाल पर मेरा कहना है;
इस मॉड्यूल के npm पेज पर, आपके पास यह है:
var डिबग = आवश्यकता ('डीबग') ('http')
ऊपर की पंक्ति में, एक स्ट्रिंग मॉड्यूल को पारित किया जाता है जिसे आयात किया जाता है, निर्माण के लिए। यहां बताया गया है कि ईएस 6 में आप भी ऐसा ही करेंगे
'डिबग के रूप में डिबग' को 'डिबग' से डिबग में आयात करें = डिबग ('http');
उम्मीद है कि इससे वहां किसी को मदद मिलेगी।
System.import(module)
, यकीन है कि अगर तर्क या नहीं की अनुमति देता है, जो कोई ES6 के बारे में अधिक जानता है?