Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Вопрос про babel-preset-env (https://javascript.ru/forum/node-js-io-js/74479-vopros-pro-babel-preset-env.html)

ruslan_mart 16.07.2018 04:22

Вопрос про babel-preset-env
 
Всем привет.

Пишу пакет. Столкнулся с кое-каким моментом при компиляции 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

Цитата:

Сообщение от ruslan_mart
знаю, что экономия на спичках, но я перфекционист

Вариантов всего два: либо писать на старом добром, либо использовать Бабель и смириться с кучками говнокода на местах.

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/...s/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?");

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


Часовой пояс GMT +3, время: 15:11.