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

这不是动态的。

是否可以从一个对象导出所有值?

146268 次浏览

似乎不是这样的。引自 ECMAScript 6模块: 最终语法:

您可能想知道-如果我们可以简单地默认导出对象(如 CommonJS) ,为什么我们需要命名导出?答案是,您不能通过对象强制执行静态结构,从而失去所有相关的优势(将在下一节中进行描述)。

我只需要做这个配置文件。

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

注意,这是使用打字机。

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

这将在今天的 W/巴别塔会变形中工作,并且应该能够利用 ES2016模块的所有优点,只要该特性实际出现在浏览器中。

您还可以添加 export default {a, b, c};,它允许您将所有值作为对象导入到 * as中,即 import myModule from 'my-module';

资料来源:

我不能真正推荐这个 解决方案的解决办法,但它确实功能。不是导出对象,而是使用命名的导出每个成员。在另一个文件中,将第一个模块的命名导出导入到一个对象中,并将该对象作为默认对象导出。还可以使用 export * from './file1';从第一个模块导出所有命名的导出

Value/value.js

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


export {a, b, c};

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

试试这个丑陋但可行的解决方案:

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

我建议如下,让我们期待一个 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

每个答案都需要更改导入语句。

如果你想使用:

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;

不是很漂亮,但是能满足你的需要。

见: 巴别塔的例子

从变量文件中导出每个变量。然后使用 * 在另一个文件中导入它们,并将其作为常量从该文件中导出,这将为您提供一个动态对象,其中第一个文件的命名导出是从第二个文件导出的对象的属性。

变量 js

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

Other.js

import * as vars from './Variables';


export const Variables = vars;

第三个 J

import { Variables } from './Other';


Variables.var2 === 'second'

为什么不直接执行对象的命名导出:

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

或者

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

然后是需要它的命名导入:

import { values } from './my-module'


let foo = values.a
let { a, b, c } = values

或者

import { values as myModule } from './my-module'


let foo = myModule.a
let { a, b, c } = myModule

也可以进行默认导出:

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

或者

export default { a: 1, b: 2, c: 3 }

然后吃掉它:

import whateverIcallIt from './my-Module'


let foo = whateverIcallIt.a
let {a, b, c } = whateverIcallIt

如果你想导出一些单独的值,比如一些常量,你可以:

export const a = 1
export const b = 2
//...

甚至

export const a = 1,
b = 2,
c = 3,
//...

然后单独进口:

import { a, b, c } from './my-module'