如何使用ES6模块使用动态名称导出变量/函数的名称?

时间:2019-04-21 18:39:54

标签: javascript ecmascript-6 ecmascript-5

我正在尝试在当前项目中完全使用ES6 +语法,但是,与ES5模块相比,ES6 +模块似乎存在缺点。

Q1。有没有一种方法可以使用动态名称(类似于对象中的动态键)导出变量/函数。

const externalName = 'Joeys' Pizza'
const pizzaShop = {tel: '555-555-555'}

// ES5
exports[externalName] = pizzaShop // works 

// ES6
export const [externalName] = pizzaShop // error 

Q2。我有一些要重用的导出逻辑,因此我将其封装到一个函数中。但是,似乎这种事情在ES6 +模块中是不可能的。

// ES5: all good 
const exporter = db => {
  exports.first = db.collections('first')
  exports.second = db.collections('second')
}


// ES6: compiler says: Modifiers cannot appear here 
const exporter = db => {
  export const first = db.collections('first')
  export const second = db.collections('second')
}

任何建议,信息或建议将不胜感激。目前,我觉得这两种模块语法可能只是以不同的方式处理,另一方面,可能有一些我不知道的解决方法。

谢谢。

1 个答案:

答案 0 :(得分:1)

  

是否可以使用动态名称(类似于对象中的动态键)导出变量/函数。

不,没有。您需要能够为导出命名,它不能是动态的。

如果绝对必要,请导出对象并在其上放置任意属性。

  

我有一些要重用的导出逻辑,因此我将其封装到一个函数中。但是,似乎这种事情在ES6 +模块中是不可能的。

无论如何,您在ES5中所做的事情值得怀疑。调用exporter确实修改了exports对象,多次调用将造成绝对破坏。

您可以通过这样做来复制该行为

export var first, second;
function exporter(db) {
  first = db.collections('first');
  second = db.collections('second');
}

var database;
export function first() {
  return database.collections('first');
}
export function second() {
  return database.collections('second');
}
function exporter(db) {
  database = db;
}

但是如果您只创建一个新对象而不是弄乱导出,那会更好:

export default function exporter(db) {
  return {
    first: db.collections('first'),
    second: db.collections('second'),
  };
}