Вход

Просмотр полной версии : Вопрос про babel-preset-env


ruslan_mart
16.07.2018, 04:22
Всем привет.

Пишу пакет. Столкнулся с кое-каким моментом при компиляции ES6(2015) в ES5 с помощью Babel.

Есть такая исходная конструкция:

switch(typeof obj) {

case 'string':
case 'number':
///...
break;

case 'object':
//...
break;
}


Но результат после компиляции получается вот такой:

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

switch(typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) {

case 'string':
case 'number':
///...
break;

case 'object':
//...
break;
}

Я понимаю, что это полифил для Symbol, но как мне указать явно, что там полифилить мне ничего не нужно? Ведь я там явно знаю, что проверок на typeof "symbol" у меня нет, поэтому мне лишние вызовы не нужны.

P.S.: знаю, что экономия на спичках, но я перфекционист.

Alexandroppolus
16.07.2018, 07:54
знаю, что экономия на спичках, но я перфекционист
Вариантов всего два: либо писать на старом добром, либо использовать Бабель и смириться с кучками говнокода на местах.

j0hnik
16.07.2018, 08:01
ruslan_mart,
Не использовать env. собрать вручную все плагины кроме Symbol, env это готовая сборка.

ruslan_mart
16.07.2018, 08:37
j0hnik, прикол в том, что если я даже указываю в browserList последние две версии хрома, то один фиг делает эту обёртку над typeof. Причём основного полифила для Symbol нет. И это не только в env, тоже самое происходит и в babel-preset-es2015.

destus
16.07.2018, 08:58
ruslan_mart,
как мне указать явно, что там полифилить мне ничего не нужно?
Как правильно было сказано, никакого полифила нет. Это обычная кастомная проверка typeof. Babel-polyfill внутри себя использует core-js полифилы, и для Symbol пострашнее конструкция будет https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.symbol.js
Можно вынести этот кусок кода в отдельный файл и вебпаком сделать exclude этого файла из-под Babel.

destus
16.07.2018, 09:20
ruslan_mart,
сделал такой .babelrc

{
"presets": [
["env", {
"exclude": ["transform-es2015-typeof-symbol"]
}]
]
}

На выходе получил

eval("\n\nswitch (typeof obj) {\n\n case 'string':\n case 'number':\n ///...\n break;\n\n case 'object':\n //...\n break;\n}\n\n//# sourceURL=webpack:///./file.js?");

Вроде то что нужно, проверьте.