【问题标题】:How to export using dynamic name for variables/functions using ES6 modules?如何使用 ES6 模块为变量/函数使用动态名称导出?
【发布时间】:2022-05-06 19:20:32
【问题描述】:

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

第一季度。有没有办法使用动态名称导出变量/函数,类似于对象中的动态键。

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

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

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

第二季度。我有一些我想重用的导出逻辑,所以我把它封装成一个函数。但是,似乎这种事情在 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')
}

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

提前致谢。

【问题讨论】:

    标签: javascript ecmascript-6 ecmascript-5


    【解决方案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'),
      };
    }
    

    【讨论】:

    • 谢谢,之前多次调用该函数可能是个问题。但是,这会导致一个相关的问题,即我无法再析构我的导入,例如:import { first } from './module'
    • 导入语法不是解构的。使用前两个 sn-ps,import { first } 仍然可以工作。
    【解决方案2】:

    您不能将 esm 合成器用于具有动态命名导出的导出,而是可以使用 module.exports

    const name = 'myExport'
    function fn() {
      console.log(name)
    }
    
    module.exports[name] = fn
    

    这样你就可以用import { myExport } from './myFile'导入

    这对我们使用 firebase 函数很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2019-09-15
      相关资源
      最近更新 更多