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
Что не является динамическим.
Можно ли экспортировать все значения из объекта?
Ответы
Ответ 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'