Как экспортировать с использованием динамического имени для переменных / функций с использованием модулей ES6?

#javascript #ecmascript-6 #ecmascript-5

#javascript #ecmascript-6 #ecmascript-5

Вопрос:

Я пытаюсь использовать весь синтаксис ES6 в моем текущем проекте, однако, похоже, у модулей ES6 может быть недостаток по сравнению с модулями ES5.

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:

Есть ли способ экспортировать переменные / функции с использованием динамических имен, что-то похожее на динамические ключи в объектах.

Нет, нет. Вы должны иметь возможность называть экспорт, он не должен быть динамическим.

Если абсолютно необходимо, экспортируйте объект и наложите на него произвольные свойства.

У меня есть некоторая логика экспорта, которую я хочу использовать повторно, поэтому я инкапсулировал ее в функцию. Однако, похоже, что такого рода вещи могут быть невозможны с модулями 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'),
  };
}
  

Комментарии:

1. Спасибо, вызов функции несколько раз раньше мог быть проблемой. Однако это приводит к связанной проблеме, из-за которой я больше не могу деструктировать свой импорт, например: import { first } from './module'

2. Синтаксис импорта не разрушается. С первыми двумя фрагментами import { first } все равно будет работать.

Ответ №2:

Вы не можете использовать esm synthax для экспорта с динамическим именованным экспортом, вместо этого вы можете использовать module.exports :

 const name = 'myExport'
function fn() {
  console.log(name)
}

module.exports[name] = fn
  

Таким образом, вы можете импортировать с import { myExport } from './myFile'

Это было полезно для нас с функциями firebase.