Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"
Проблема с обработкой 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 ответ(ов)
Преустановка "es2015" по умолчанию оборачивает выходные данные Babel в обертку CommonJS. Если вам нужно скомпилировать код без модулей, используйте "babel-preset-es2015-script". Для этого сначала выполните команду npm install --save babel-preset-es2015-script
. Это решение помогло мне избавиться от проблем, возникающих с другими библиотеками, которые я упаковка с помощью Babel.
Ссылка на пакет: babel-preset-es2015-script
Связь между CommonJS, AMD и RequireJS?
module.exports против exports в Node.js: что выбрать?
Babel 6: regeneratorRuntime не определен
Как именно оценивается модуль в синтаксисе `import` ES6?
Использование async/await с циклом forEach