Module ES6从对象导出所有值

Module ES6从对象导出所有值,module,export,ecmascript-6,Module,Export,Ecmascript 6,假设我有一个模块(/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' // myM

假设我有一个模块(
/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
这不是动态的


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

似乎不是这样。引自:

您可能想知道,如果我们可以简单地默认导出对象(如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
请注意,这是使用Typescript

export const a = 1;
export const b = 2;
export const c = 3;
这将在今天起作用,并应利用ES2016模块的所有优点,无论该功能何时实际进入浏览器

您还可以添加
导出默认值{a,b,c}
允许您将所有值作为对象导入,而不使用
*作为
,即
从“我的模块”导入我的模块

资料来源:


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

values/value.js

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

export {a, b, c};
import * as values from './value';

export default values;
export * from './value';
import values, {a} from './values';

console.log(values, a); // {a: 1, b: 2, c: 3} 1
值/index.js

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

export {a, b, c};
import * as values from './value';

export default values;
export * from './value';
import values, {a} from './values';

console.log(values, a); // {a: 1, b: 2, c: 3} 1
index.js

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

export {a, b, c};
import * as values from './value';

export default values;
export * from './value';
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
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
然后您可以在index.js中执行以下操作:

const values = { a: 1, b: 2, c: 3 };

export { values }; // you could use default, but I'm specific here
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

销毁对象的更多示例:

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

如果您希望能够使用:

import {a} from './my-module'           // a === 1
import * as myModule from './my-module' // myModule.a === 1
如问题中所述,在您的
my module
中,您拥有在一个对象中导出所需的所有内容(这可能很有用,例如,如果您希望使用Joi或JSON模式验证导出的值),那么您的
my module
必须是:

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

不漂亮,但它可以编译成你需要的


请参阅:

使用javascript可以做很多愚蠢的事情。我将把YDKJS书中的这句话留在这里

书中提到的页面->


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

Variables.js

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

import * as vars from './Variables';

export const Variables = vars;
Third.js

import { Variables } from './Other';

Variables.var2 === 'second'

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

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

然后在您需要的地方进行命名导入:

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

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


也可以执行默认导出:

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

然后消费它:

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'

不,因为动态计算的值不能静态导出。@Bergi,我想知道是否有可能以某种方式使这些值成为静态的。我在想如果你使用一个
接口{a:number,b:number,c:number}
?理论上这应该是可能的,对吧?@Fleuv
export const{a,b,c}=values
正是声明静态接口的语法如果它们有名称-值对,你可以使用数组吗?你为什么不建议这样做?可能是因为治疗比疾病更糟糕(除非您正在编写一个公共可消费库,并且您对如何导入它非常挑剔)?是的,这是一个很好的总结。这是我在库中使用过的一种技术,可以简化易用性。我认为最好是在单个文件中管理导出,尽管这对库作者来说需要更多的工作。结果是用户少了一个模块深度。我非常喜欢这项工作,但在values/I中应该是“/value”而不是“/values”ndex.js,对吗?我真的不认为这是答案,因为如果我已经导出
{a,b,c}
,为什么我需要再次导出?真正的问题是如果我只有
常量obj={a,b,c}
我可以导出obj的所有成员吗?我想答案是否定的。你应该可以从“/config”导入配置;
你能补充解释吗?这个方法已经在问题中提到了(在“硬编码”下)