Запретить накопительным пакетам переименовать Promise в Promise $ 1

Обновление: Оказалось, что это проблема не с Babel, а с Rollup, который запускался раньше. В любом случае спасибо за вашу помощь и извините за шум.

Я использую rollup для объединения ряда модулей, включая полифилл Promise (намеренно перезаписывая глобальное обещание) . Однако свертка распознает Promise как глобальное имя и преобразует

export default function Promise(fn) { ... }
...
global.Promise = Promise;

to

function Promise$1(fn) { ... }
...
global.Promise = Promise$1;

Полученный код работает, но мне хотелось бы, чтобы выполнялось следующее утверждение:

expect(Promise.name).to.equal('Promise');

Есть ли способ указать свертке, чтобы имя конструктора оставалось неизменным?


person ralfstx    schedule 07.08.2017    source источник
comment
Какие плагины babel вы используете? Что конкретно Babel изменяет в вашем выходном файле?   -  person loganfsmyth    schedule 07.08.2017
comment
Не проверяйте имена. Они незначительны.   -  person Bergi    schedule 07.08.2017
comment
Не уверен насчет обновления. Вы решили проблему? Вы спрашиваете, как сказать Rollup оставить имя в покое? Если вы нашли решение, опубликуйте его как ответ, если нет, пожалуйста, edit, чтобы уточнить ваши настройки и то, что вы ищете; или если вы перешли, просто удалите вопрос.   -  person Bergi    schedule 07.08.2017
comment
Спасибо за совет, сейчас обновил вопрос. Я не решился сменить тему, так как не был уверен, что это хорошая практика ...   -  person ralfstx    schedule 08.08.2017
comment
@Bergi Это не совсем так. Проверка типов часто основана на constructor.name в JS. Имя также учитывается средством форматирования, используемым в консоли Node.js (пример).   -  person ralfstx    schedule 08.08.2017
comment
@ralfstx Проверка типов на основе .constructor.name не должна использоваться именно по этой причине. Имена искажаются транспайлерами, сборщиками и минификаторами. Старые браузеры их вообще не реализуют. Вместо этого используйте instanceof, typeof или определение формы (наличие и тип свойств). Отладка и ведение журнала - это отдельная тема, которая обычно выполняется в известных средах и с исходным исходным кодом.   -  person Bergi    schedule 08.08.2017
comment
@Bergi Дело в том, что я работаю над такой средой, которая реализует такие вещи, как ведение журнала, и поэтому у меня есть эта проблема ;-) Кроме того, constructor и constructor.name являются частью спецификации ES 2015, поэтому я не могу последовать вашему совету, чтобы избежать их.   -  person ralfstx    schedule 08.08.2017
comment
@ralfstx name может быть частью ES6, но это не значит, что он совместим с Интернетом. IE его вообще не поддерживает, поэтому я рекомендую избегать этого. В вашем окружении вроде бы нормально.   -  person Bergi    schedule 08.08.2017


Ответы (1)


Попробуйте использовать rollup-plugin-inject и настроить его так, чтобы он добавлял import Promise from 'your-promise-polyfill' к любым файлам, которые ссылаются Promise. Таким образом, Rollup не будет думать, что ему нужно переименовать функцию, объявленную в полифилле, чтобы избежать конфликтов с глобалом, потому что он не будет знать, что есть глобал, с которым он конфликтует.

// rollup.config.js
import inject from 'rollup-plugin-inject';

export default {
  // ...
  plugins: [
    inject({
      Promise: 'your-promise-polyfill'
    })
  ]
};
person Rich Harris    schedule 08.08.2017