web-dev-qa-db-fra.com

ES6 exporte toutes les valeurs de l'objet

Disons que j'ai un module (./my-module.js) qui a un objet qui devrait être sa valeur de retour:

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

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

Je peux donc les importer comme:

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

Le seul moyen que j'ai trouvé est de coder en dur les exportations:

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

Ce qui n'est pas dynamique.

Est-il possible d'exporter toutes les valeurs d'un objet?

89
mauvm

Ne semble pas si. Citation de modules ECMAScript 6: la syntaxe finale :

Vous vous demandez peut-être pourquoi nous avons besoin d'exportations nommées si nous pouvions simplement exporter des objets par défaut (comme CommonJS)? La réponse est que vous ne pouvez pas appliquer une structure statique via des objets et perdre tous les avantages associés (décrits dans la section suivante).

31
Joel Richard

Je ne peux pas vraiment recommander ça solution contourner le problème, mais cela fonctionne. Plutôt que d'exporter un objet, vous utilisez des exportations nommées pour chaque membre. Dans un autre fichier, importez les exportations nommées du premier module dans un objet et exportez cet objet par défaut. Exportez également toutes les exportations nommées du premier module à l'aide de export * from './file1';

values ​​/ value.js

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

export {a, b, c};

values ​​/ index.js

import * as values from './values';

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

index.js

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

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

essayez cette solution laide mais réalisable:

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

J'avais juste besoin de faire cela pour un fichier de configuration.

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

export default config;

Tu peux le faire comme ça

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

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

Ceci utilise TypeScript, pense-toi.

7
mikeysee
export const a = 1;
export const b = 2;
export const c = 3;

Cela fonctionnera avec/ Babel transforme aujourd'hui et devrait tirer parti de tous les avantages des modules ES2016 chaque fois que cette fonctionnalité atterrit réellement dans un navigateur.

Vous pouvez également ajouter export default {a, b, c}; qui vous permettra d'importer toutes les valeurs sous forme d'objet sans le * as, c'est-à-dire import myModule from 'my-module';

Sources:

3
Jon z

Je suggère ce qui suit, attendons un module.js :

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

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

et alors vous pouvez faire dans 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

Autres exemples d'objets de destruction: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring

3
RiZKiT

Chaque réponse nécessite une modification des instructions d'importation.

Si vous voulez pouvoir utiliser:

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

comme dans la question, et dans votre my-module vous avez tout ce dont vous avez besoin d'exporter dans un seul objet (ce qui peut être utile, par exemple si vous souhaitez valider les valeurs exportées avec Joi ou JSON Schema), puis votre my-module devrait être soit:

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

Ou:

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

Pas joli, mais il compile à ce dont vous avez besoin.

Voir: exemple de Babel

2
rsp
2
atilkan

Exporter chaque variable de votre fichier de variables. Ensuite, les importer avec * comme dans votre autre fichier et exporter comme une constante à partir de ce fichier vous donnera un objet dynamique avec les exportations nommées du premier fichier en tant qu'attributs sur l'objet exporté à partir du second.

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'
0
Tanya Randstoft