ES6 ऑब्जेक्ट से सभी मान निर्यात करता है


112

मान लें कि मेरे पास एक मॉड्यूल ( ./my-module.js) है, जिसमें एक वस्तु है जो उसका रिटर्न मान होना चाहिए:

let values = { a: 1, b: 2, c: 3 }

// "export values" results in SyntaxError: Unexpected token

इसलिए मैं उन्हें आयात कर सकता हूं:

import {a} from './my-module'           // a === 1
import * as myModule from './my-module' // myModule.a === 1

एकमात्र तरीका मैंने पाया है कि निर्यात को कठिन कोडिंग द्वारा किया गया है:

export let a = values.a
export let b = values.b
export let c = values.c
// or:
export let {a, b, c} = values

जो गतिशील न हो।

क्या किसी वस्तु से सभी मूल्यों को निर्यात करना संभव है?


6
नहीं, क्योंकि गतिशील रूप से गणना की गई मान को वैधानिक रूप से निर्यात नहीं किया जा सकता है।
बरगी

@ बर्गी, मुझे आश्चर्य हो रहा है कि किसी तरह मूल्यों को स्थिर करना संभव है। मैं सोच रहा था कि अगर आप एक का उपयोग करें तो क्या होगा interface { a: number, b: number, c: number }? सैद्धांतिक रूप से यह संभव होना चाहिए, है ना?
फ्लेव

1
@ फुलेव export const {a, b, c} = valuesवास्तव में उस स्थिर इंटरफ़ेस को घोषित करने के लिए वाक्यविन्यास है
बर्गी

जवाबों:


39

ऐसा नहीं लगता है। से उद्धरण ECMAScript 6 मॉड्यूल: अंतिम वाक्य रचना :

आप सोच रहे होंगे - अगर हमें केवल डिफ़ॉल्ट-निर्यात ऑब्जेक्ट (जैसे कि कॉमनजेएस) मिल सकता है, तो हमें नामांकित निर्यात की आवश्यकता क्यों है? इसका उत्तर यह है कि आप वस्तुओं के माध्यम से एक स्थिर संरचना को लागू नहीं कर सकते हैं और सभी संबद्ध लाभ (अगले भाग में वर्णित) खो सकते हैं।


3
यदि आपके पास नाम-मूल्य जोड़े हैं, तो क्या आप किसी सरणी का उपयोग कर सकते हैं?
केविन सुटल ने

79

मैं वास्तव में इस समाधान के आसपास काम करने की सिफारिश नहीं कर सकता, लेकिन यह कार्य करता है। किसी ऑब्जेक्ट को निर्यात करने के बजाय, आप प्रत्येक सदस्य नाम निर्यात का उपयोग करें। किसी अन्य फ़ाइल में, पहले मॉड्यूल के नामित निर्यात को किसी ऑब्जेक्ट में आयात करें और उस ऑब्जेक्ट को डिफ़ॉल्ट रूप में निर्यात करें। उपयोग करने वाले पहले मॉड्यूल से सभी नामित निर्यात भी करेंexport * from './file1';

मान / value.js

let a = 1;
let b = 2;
let c = 3;

export {a, b, c};

मान / index.js

import * as values from './value';

export default values;
export * from './value';

index.js

import values, {a} from './values';

console.log(values, a); // {a: 1, b: 2, c: 3} 1

2
आप इसकी सिफारिश क्यों नहीं करेंगे?
jsdario

2
हो सकता है क्योंकि इलाज बीमारी से भी बदतर है (जब तक कि आप सार्वजनिक रूप से उपभोग्य पुस्तकालय नहीं लिख रहे हैं और आप वास्तव में इसके आयात के बारे में क्या पसंद कर रहे हैं)?
मशीनघोस्ट

हाँ, यह एक अच्छा सारांश है। यह एक ऐसी तकनीक है जिसका उपयोग मैंने पुस्तकालय में एक बार उपभोग्यता को कम करने के लिए किया है। मुझे लगता है कि लाइब्रेरी लेखक के लिए अधिक काम होने के बावजूद एक फ़ाइल के भीतर निर्यात का प्रबंधन करना बेहतर होगा। परिणाम उपयोगकर्ता के लिए एक कम मॉड्यूल गहराई है।
रयंजडीफ़ में

मुझे यह काम बहुत पसंद है, लेकिन यह मूल्यों / index.js में './values' के बजाय './value' होना चाहिए, है ना?
Jan Paepke

1
मुझे वास्तव में नहीं लगता कि यह उत्तर है, क्योंकि अगर मैं पहले से ही निर्यात { a, b, c }करता हूं, तो मुझे फिर से निर्यात करने की आवश्यकता क्यों है? असली सवाल यह है कि अगर मेरे पास केवल है const obj = { a, b, c }और क्या मैं obj के सभी सदस्य को निर्यात कर सकता हूं? मुझे लगता है कि उत्तर नहीं है।
हवामहवाओ

14

इस बदसूरत लेकिन व्यावहारिक समाधान का प्रयास करें:

// use CommonJS to export all keys
module.exports = { a: 1, b: 2, c: 3 };

// import by key
import { a, b, c } from 'commonjs-style-module';
console.log(a, b, c);

12

मुझे बस एक कॉन्फ़िगर फ़ाइल के लिए ऐसा करने की आवश्यकता थी।

var config = {
    x: "CHANGE_ME",
    y: "CHANGE_ME",
    z: "CHANGE_ME"
}

export default config;

आप इसे इस तरह से कर सकते हैं

import { default as config } from "./config";

console.log(config.x); // CHANGE_ME

यह टाइपस्क्रिप्ट मन का उपयोग कर रहा है।


34
आपको ऐसा करने में सक्षम होना चाहिएimport config from './config';
मैट हमन

4
export const a = 1;
export const b = 2;
export const c = 3;

यह आज w / बैबेल ट्रांसफॉर्म का काम करेगा और ईएस2016 मॉड्यूल के सभी लाभों का लाभ उठाना चाहिए जब भी यह सुविधा वास्तव में एक ब्राउज़र में भूमि।

आप यह भी जोड़ सकते हैं export default {a, b, c};जो आपको ऑब्जेक्ट w / o a * asयानी के रूप में सभी मानों को आयात करने की अनुमति देगाimport myModule from 'my-module';

सूत्रों का कहना है:


3

मैं निम्नलिखित सुझाव देता हूं, चलो एक मॉड्यूल की उम्मीद करते हैं। जेएस :

const values = { a: 1, b: 2, c: 3 };

export { values }; // you could use default, but I'm specific here

और फिर आप एक index.js में कर सकते हैं :

import { values } from "module";

// directly access the object
console.log(values.a); // 1

// object destructuring
const { a, b, c } = values; 
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

// selective object destructering with renaming
const { a:k, c:m } = values;
console.log(k); // 1
console.log(m); // 3

// selective object destructering with renaming and default value
const { a:x, b:y, d:z = 0 } = values;
console.log(x); // 1
console.log(y); // 2
console.log(z); // 0

विनाशकारी वस्तुओं के और उदाहरण: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring


3

हर उत्तर में आयात विवरणों को बदलने की आवश्यकता होती है।

यदि आप उपयोग करने में सक्षम होना चाहते हैं:

import {a} from './my-module'           // a === 1
import * as myModule from './my-module' // myModule.a === 1

जैसा कि प्रश्न में है, और आपके my-moduleपास वह सब कुछ है जो आपको एक वस्तु में निर्यात करने की आवश्यकता है (जो उपयोगी हो सकता है जैसे यदि आप जॉय या जेन्सन स्कीमा के साथ निर्यात किए गए मानों को मान्य करना चाहते हैं) तो आपको my-moduleया तो होना होगा:

let values = { a: 1, b: 2, c: 3 }
let {a, b, c} = values;
export {a, b, c};

या:

let values = { a: 1, b: 2, c: 3 }
export let {a, b, c} = values;

सुंदर नहीं है, लेकिन यह आपकी आवश्यकता के अनुरूप है।

देखें: बेबल उदाहरण


3

आप जावास्क्रिप्ट के साथ बहुत सारी बेवकूफी कर सकते हैं। मैं इस उद्धरण को YDKJS पुस्तक से यहाँ छोड़ दूँगा।

यहां छवि विवरण दर्ज करें

पुस्तक का उल्लेखित पृष्ठ ->

https://books.google.com.tr/books?id=iOc6CwAAQBAJ&pg=PT150&lpg=PT150&dq=JS+engine+cannot+statically+analyze+the+contents+of+plain+object&source=bl&ots=7v8fMUgwhx&sig=dP3BpY7mEvpvfyxO_koWaXczBWI&hl=en&sa= X और वेद = 2ahUKEwi4qseXyrDdAhUS-6QKHZYTAEQQ6AEwAHoECAEQAQ # v = onepage & q = जेएस% 20engine% 20cannot% 20statically% 20analyze% 20the% 20contents% 20of% 20plain% 20object & f = झूठी


2

अपनी चर फ़ाइल से प्रत्येक चर निर्यात करना। फिर उन्हें अपनी अन्य फ़ाइल में * के साथ आयात करना और उस फ़ाइल से एक स्थिरांक के रूप में निर्यात करना आपको दूसरी फ़ाइल से निर्यात की जाने वाली वस्तु पर पहले फ़ाइल की विशेषताओं से नामित निर्यात के साथ एक गतिशील वस्तु प्रदान करेगा।

Variables.js

export const var1 = 'first';
export const var2 = 'second':
...
export const varN = 'nth';

Other.js

import * as vars from './Variables';

export const Variables = vars;

Third.js

import { Variables } from './Other';

Variables.var2 === 'second'

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