0

Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"

22

Проблема с обработкой this при транспиляции кода с использованием Babel

Я создал простую систему pub-sub для небольшого приложения, над которым работаю. Написал её на ES6, чтобы воспользоваться возможностями spread/rest и избежать головной боли. Я настроил проект с помощью npm и gulp для транспиляции, но это вызывает у меня много нервов.

Я изначально сделал библиотеку для браузера, но понял, что она может использоваться в любом окружении, поэтому решил сделать её совместимой с CommonJS и AMD.

Вот урезанная версия моего кода:

(function(root, factory) {
  if (typeof define === 'function' && define.amd) {
    define([], function() {
      return (root.simplePubSub = factory());
    });
  } else if (typeof module === 'object' && module.exports) {
    module.exports = (root.simplePubSub = factory());
  } else {
    root.simplePubSub = root.SPS = factory();
  }
}(this, function() {
  // return SimplePubSub
}));

Однако, какого бы метода я ни пытался (например, передавая this как переменную), он всегда устанавливает его в undefined.

}(undefined, function() {

Скорее всего, дело в том, что Babel не знает, что такое this, и удаляет его, но есть ли другие подходы, которые я могу попробовать?

Обновление: Попытка передать }(window || module || {}), function() { вместо this сработала. Я не уверен, что это оптимальный вариант, но он работает.

1 ответ(ов)

0

Преустановка "es2015" по умолчанию оборачивает выходные данные Babel в обертку CommonJS. Если вам нужно скомпилировать код без модулей, используйте "babel-preset-es2015-script". Для этого сначала выполните команду npm install --save babel-preset-es2015-script. Это решение помогло мне избавиться от проблем, возникающих с другими библиотеками, которые я упаковка с помощью Babel.

Ссылка на пакет: babel-preset-es2015-script

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь