Подтвердить что ты не робот

ES6 экспортирует все значения из объекта

Скажем, у меня есть модуль (./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

Что не является динамическим.

Можно ли экспортировать все значения из объекта?

4b9b3361

Ответ 1

Не похоже. Цитата из Модули ECMAScript 6: окончательный синтаксис:

Возможно, вам интересно - зачем нам указывать экспорт, если бы мы могли просто экспортировать объекты по умолчанию (например, CommonJS)? Ответ заключается в том, что вы не можете применять статическую структуру через объекты и терять все связанные с этим преимущества (описанные в следующем разделе).

Ответ 2

Я не могу порекомендовать этот способ решения, но он действительно работает. Вместо того, чтобы экспортировать объект, вы используете именованный экспорт каждого члена. В другом файле импортируйте первый модуль с именем export в объект и экспортируйте этот объект по умолчанию. Также экспортируйте все именованные экспорты из первого модуля, используя 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

Ответ 3

попробуйте это уродливое, но работоспособное решение:

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

Ответ 4

Мне просто нужно было сделать это для файла конфигурации.

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

Это использует Typescript ум.

Ответ 5

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

Это сработает w/Babel преобразует сегодня и должно использовать все преимущества модулей ES2016 всякий раз, когда эта функция попадает в браузер.

Вы также можете добавить export default {a, b, c};, который позволит вам импортировать все значения в качестве объекта без * as, т.е. import myModule from 'my-module';

Источники:

Ответ 6

Я предлагаю следующее, пусть ожидают module.js:

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

Ответ 7

Каждый ответ требует изменения операторов импорта.

Если вы хотите иметь возможность использовать:

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

как в вопросе, и в вашем my-module вас есть все, что вам нужно экспортировать в одном объекте (что может быть полезно, например, если вы хотите проверить экспортированные значения с помощью Joi или JSON Schema), тогда ваш 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;

Не красиво, но это соответствует тому, что вам нужно.

Смотрите пример Babel

Ответ 8

Вы можете сделать много глупостей с помощью JavaScript. Я оставлю эту цитату здесь из книги YDKJS.

enter image description here

Упомянутая страница книги ->

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= Х & вед = 2ahUKEwi4qseXyrDdAhUS-6QKHZYTAEQQ6AEwAHoECAEQAQ # v = OnePage & д = JS %20engine %20cannot %20statically %20analyze %20the %20contents %20of %20plain %20object & F = ложь

Ответ 9

Экспорт каждой переменной из вашего файла переменных. Затем, импортируя их с помощью *, как в вашем другом файле, и экспортируя как константу из этого файла, вы получите динамический объект с именованным экспортом из первого файла, являющимся атрибутами объекта, экспортируемого из второго.

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'