IOS 10 баг при минификации кода через babel

29 Июня 2021 18:18

Существует такая проблема на IOS 10, из-за которой, вылезает ошибка SyntaxError: Cannot declare a let variable twice: 'e'. Связано это с ошибочным объявлением ошибки в ситуациях когда переменная обявляется с таким же именем как и переменная в параметре цикла. Например,
 

let e = e => {
    console.log(e);
    for (let e of [1, 2, 3])
        console.log(e);
};

С точки зрения ES6 здесь все хорошо, но в IOS 10 будет ошибка. Подробнее тут - https://bugs.webkit.org/show_bug.cgi?id=171041.

Из-за этого может возникать много проблем, например, при использовании слайдера Swiper JS и Babel для Webpack. Минифицируя код Swiper JS, получаются именно такие конструкции, на которые ругается IOS 10.

Решение

Плагин - terser-webpack-plugin. Ссылка на документацию https://webpack.js.org/plugins/terser-webpack-plugin/
Это форк от ранееизвестного uglify-webpack-plugin, который на данный момент не поддерживается. В Webpack 5 и выше terser-webpack-plugin идет из коробки и достаточно просто добавить его в конфиг webpack'а webpack.prod.conf.js.

//Подключаем Terser
const TerserPlugin = require("terser-webpack-plugin");

//Используем при минификации
module.exports = {

  ...

  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          safari10: true,
        },
      }),
    ],
  },

  ...

}

В Webpack 4 его нужно установить:

npm install terser-webpack-plugin --save-dev