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?
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).
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
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);
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.
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:
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
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
Vous pouvez faire beaucoup de choses stupides avec javascript. Je laisserai ici cette citation du livre de YDKJS.
Page mentionnée du livre ->
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'