web-dev-qa-db-ja.com

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

動的ではありません。

オブジェクトからすべての値をエクスポートすることは可能ですか?

87
mauvm

そうではないようです。 ECMAScript 6モジュール:最終構文 :からの引用

疑問に思われるかもしれません-単純にデフォルトのオブジェクト(CommonJSなど)をエクスポートできるのに、なぜ名前付きエクスポートが必要なのでしょうか?答えは、オブジェクトを介して静的構造を強制することはできず、関連する利点をすべて失うことはできないということです(次のセクションで説明します)。

31
Joel Richard

これは本当にお勧めできません 溶液 回避策はありますが、機能します。オブジェクトをエクスポートするのではなく、named exports各メンバーを使用します。別のファイルで、最初のモジュールの名前付きエクスポートをオブジェクトにインポートし、そのオブジェクトをデフォルトとしてエクスポートします。また、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
62
ryanjduffy

このいが実行可能なソリューションを試してください:

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

設定ファイルに対してこれを行う必要がありました。

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を使用しています。

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

これは Babel transforms 今日で機能し、ES2016モジュールのすべての利点を、その機能が実際にブラウザーに搭載されるたびに活用する必要があります。

export default {a, b, c};を追加することもできます。これにより、すべての値を* asなしのオブジェクトとしてインポートできます。つまり、import myModule from 'my-module';

ソース:

3
Jon z

以下をお勧めします、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

3
RiZKiT

すべての答えには、インポート文の変更が必要です。

使用できるようにしたい場合:

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

質問のように、あなたのmy-moduleには、1つのオブジェクトにエクスポートする必要があるすべてのものがあります(たとえば、エクスポートされた値をJoiまたはJSONスキーマで検証したい場合)、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の例

2
rsp
2
atilkan

Variables.js

export const var1 = 'first';
export const var2 = 'second':
export const varN = 'nth';

Index.js

import * as vars from './Variables';

export const Variables = vars;
0
Tanya Randstoft