2015-04-27 10 views
13

मैं ECMAScript6 मॉड्यूल का उपयोग कर रहा हूं। नीचे दिए गए विकल्पों से मॉड्यूल से एकाधिक विधियों को निर्यात/आयात करने का सही तरीका क्या है?ES6 मॉड्यूल: स्थिर विधियों के एकल वर्ग या एकाधिक व्यक्तिगत विधियों को निर्यात करें

स्थिर तरीकों की एकल वर्ग:

//------ myClass.js ------ 

export default class myClass { 

    static myMethod1() { 
    console.log('foo'); 
    } 

    static myMethod2(args...) { 
    console.log('bar'); 
    } 

} 

//------ app.js ------ 

import myClass from 'myClass'; 
myClass.myMethod1(); //foo 

एकाधिक निर्यात तरीके:

//------ myMethods.js ------ 

export function myMethod1() { 
    console.log('foo'); 
} 

export function myMethod2() { 
    console.log('bar'); 
} 

//------ app.js ------ 
import {myMethod1, myMethod2} from 'myMethods'; 
myMethod1() //foo; 


//OR 
import * as myMethods from 'myMethods'; 
myMethods.myMethod1() //foo; 

1) निर्यात: सिर्फ स्थिर तरीकों का एक वर्ग एक 'कोड गंध' का एक सा की तरह लगता है, लेकिन इसी प्रकार सब कुछ अलग-अलग निर्यात करना थोड़ा वर्बोज महसूस करता है। क्या यह बस डेवलपर वरीयता है या यहां प्रदर्शन प्रभाव हैं?

2) आयात कर रहा है: '*' के रूप में वाक्य रचना मेरी पसंदीदा तरीका के रूप में यह आप डॉट नोटेशन (दोनों मॉड्यूल और विधि) कोड पठनीयता सहायता संदर्भित उपयोग करने के लिए अनुमति देता है। क्या इसका प्रदर्शन प्रभाव पड़ता है हालांकि जब मैं केवल 1 विधियों का उपयोग कर रहा हूं?

+0

'आयात {myMethod1, myMethod2} 'myMethods' से साथ की तरह लग रहा है, भले ही;' आयातित तरीकों करना एक परिवर्तनीय के रूप में dereferenced नहीं है। हालांकि ऐसा कहा गया कि मुझे यकीन नहीं है कि डॉट नोटेशन वास्तव में एक चर के रूप में माना जाता है। – user5321531

उत्तर

19

सिर्फ स्थिर तरीकों का एक वर्ग एक 'कोड गंध'

हाँ वास्तव में का एक सा तरह लगता है। आपको यहां class संरचना की आवश्यकता नहीं है! बस एक सामान्य "मॉड्यूल" ऑब्जेक्ट निर्यात करें:

//------ myMethods.js ------ 

export default { 
    myMethod1() { 
    console.log('foo'); 
    }, 
    myMethod2(args...) { 
    console.log('bar'); 
    } 
}; 

हालांकि, मैं कई निर्यात के साथ आपके दूसरे दृष्टिकोण की अनुशंसा करता हूं।

निर्यात सब कुछ व्यक्तिगत रूप से एक सा वर्बोज़

खैर महसूस करता है, आप किसी भी आवरण संरचना की जरूरत नहीं है, इसलिए मैं यह कम बॉयलरप्लेट है कहेंगे। आपको बस उस सब कुछ को स्पष्ट रूप से टैग करना होगा जिसे आप निर्यात करना चाहते हैं, जो एक बुरी चीज नहीं है।

* as वाक्य रचना मेरी पसंदीदा तरीका के रूप में यह आप डॉट नोटेशन कोड पठनीयता सहायता (दोनों मॉड्यूल और विधि को संदर्भित) का उपयोग करने की अनुमति देता है।

यह बहुत व्यक्तिगत वरीयता है, और यह आपके द्वारा लिखे गए कोड के प्रकार पर निर्भर करता है। कभी-कभी समेकन बेहतर होता है, लेकिन मॉड्यूल को स्पष्ट रूप से संदर्भित करने की क्षमता भी सहायक हो सकती है। ध्यान दें कि * as का उपयोग करके निर्यात का नाम दिया गया है और डिफ़ॉल्ट निर्यात ऑब्जेक्ट्स बहुत समान हैं, हालांकि केवल नामित निर्यात आपको import {myMethod1, myMethod2} के माध्यम से सीधे संदर्भित करने की अनुमति देते हैं।

क्या इसका कोई प्रदर्शन प्रभाव पड़ता है?

मैं ऐसा नहीं सोचता। मौजूदा ईएस 6 कार्यान्वयन अभी तक प्रदर्शन अनुकूलन के लिए लक्ष्य नहीं कर रहे हैं।

सामान्य में, स्थिर पहचानकर्ता को हल करने और अनुकूलन करने के लिए तुलना में आसान संपत्ति तक पहुँचता [1], कई नामित निर्यात और आंशिक आयात सैद्धांतिक रूप से JIT तेजी से कर सकता है, और निश्चित रूप से छोटी फ़ाइलों कम समय लोड करने के लिए की जरूरत है। विवरण के लिए here देखें। वहां उल्लेखनीय प्रदर्शन अंतर नहीं होंगे, आपको बेहतर रखरखाव का उपयोग करना चाहिए।

[1]: मॉड्यूल नेमस्पेस (import * as ns) के रूप में अच्छी तरह से स्थिर हैं, ns.… एक गतिशील संपत्ति पहुँच

+0

कक्षा के तत्काल उदाहरणों के उद्देश्य के लिए कक्षा निर्यात करते समय मैं कक्षा का उपयोग करूंगा। एक सादा '{...}' अन्यथा वह सब कुछ जरूरी है। – user5321531

+0

@ user5321531: हां, लेकिन केवल स्थिर विधियों वाले वर्ग को कोई तात्कालिकता की आवश्यकता नहीं है :-) – Bergi

+0

मैं इसे आजमा रहा हूं, लेकिन यह मुझे एक त्रुटि देता है 'Utils.formatText एक फ़ंक्शन नहीं है', मैंने क्या गलत किया है? – orelzion

संबंधित मुद्दे