ES6 esporta tutti i valori dall'oggetto


112

Diciamo che ho un module ( ./my-module.js) che ha un oggetto che dovrebbe essere il suo valore di ritorno:

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

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

Quindi posso importarli come:

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

L'unico modo che ho trovato è codificare le esportazioni:

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

Che non è dinamico.

È possibile esportare tutti i valori da un oggetto?


6
No, perché il valore calcolato dinamicamente non può essere esportato staticamente.
Bergi

@Bergi, mi chiedo se in qualche modo sia possibile rendere statici i valori in qualche modo. Stavo pensando a cosa succede se usi un interface { a: number, b: number, c: number }? Teoricamente dovrebbe essere possibile, giusto?
Fleuv

1
@Fleuv export const {a, b, c} = valuesè esattamente la sintassi per dichiarare quell'interfaccia statica
Bergi

Risposte:


39

Non sembra così. Citazione dai moduli ECMAScript 6: la sintassi finale :

Forse ti starai chiedendo: perché abbiamo bisogno di esportazioni denominate se potessimo semplicemente esportare oggetti di default (come CommonJS)? La risposta è che non è possibile applicare una struttura statica tramite oggetti e perdere tutti i vantaggi associati (descritti nella sezione successiva).


3
Potresti usare un array se hanno coppie nome-valore?
Kevin Suttle

79

Non posso davvero raccomandare questa soluzione , ma funziona. Invece di esportare un oggetto, utilizzi le esportazioni denominate per ogni membro. In un altro file, importa le esportazioni denominate del primo modulo in un oggetto ed esporta quell'oggetto come predefinito. Esporta anche tutte le esportazioni denominate dal primo modulo utilizzandoexport * from './file1';

valori / value.js

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

export {a, b, c};

valori / 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
Perché non lo consiglieresti?
jsdario

2
Forse perché la cura è peggiore della malattia (a meno che tu non stia scrivendo una biblioteca pubblicamente consumabile e tu sia davvero schizzinoso su come viene importato)?
machineghost

Sì, questo è un buon riassunto. È una tecnica che ho usato una volta in libreria per facilitare la consumabilità. Penso che sarebbe meglio gestire le esportazioni all'interno di un singolo file anche se è più lavoro per l'autore della libreria. Il risultato è una profondità del modulo in meno per l'utente.
ryanjduffy

Mi piace abbastanza questa soluzione, ma dovrebbe essere "./value" invece di "./values" in values ​​/ index.js, giusto?
Jan Paepke,

1
Non credo proprio che questa sia la risposta, poiché se esporto già { a, b, c }, perché devo esportare di nuovo? La vera domanda è: cosa succede se ho const obj = { a, b, c }e posso esportare tutti i membri di obj? Immagino che la risposta sia NO.
windmaomao

14

prova questa brutta ma praticabile soluzione:

// 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

Avevo solo bisogno di farlo per un file di configurazione.

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

export default config;

Puoi farlo in questo modo

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

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

Questo sta usando Typescript, intendiamoci.


34
Dovresti essere in grado di farloimport config from './config';
Matt Hamann

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

Questo funzionerà con le trasformazioni di Babel oggi e dovrebbe trarre vantaggio da tutti i vantaggi dei moduli ES2016 ogni volta che quella funzionalità arriva effettivamente in un browser.

Puoi anche aggiungere export default {a, b, c};che ti permetterà di importare tutti i valori come un oggetto senza * as, ieimport myModule from 'my-module';

fonti:


3

Suggerisco quanto segue, aspettiamoci un module.js :

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

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

e poi puoi fare in un 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

Altri esempi di oggetti distruttivi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring


3

Ogni risposta richiede la modifica delle dichiarazioni di importazione.

Se vuoi essere in grado di utilizzare:

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

come nella domanda, e nel tuo my-modulehai tutto ciò di cui hai bisogno per esportare in un oggetto (che può essere utile ad esempio se vuoi convalidare i valori esportati con Joi o JSON Schema) allora il tuo my-moduledovrebbe essere:

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

O:

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

Non carino, ma si adatta a ciò di cui hai bisogno.

Vedi: esempio di Babele


3

2

Esportare ogni variabile dal file delle variabili. Quindi importandoli con * come nel tuo altro file ed esportando come costante da quel file otterrai un oggetto dinamico con le esportazioni nominate dal primo file come attributi sull'oggetto esportato dal secondo.

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'

Puoi anche aggiungere una spiegazione?
Nilambar Sharma
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.