Ошибка UglifyJs при сборке ReactJS приложения?

Всем привет, только что решил собрать продакшн, выполнил команду npm run build... и получил ошибку:
ERROR in js/app.js from UglifyJs
Invalid assignment [js/app.js:26191,31]

Я полез в app.js на 26191 строку и вижу там:
const renderNode = (node, key) => {
  if (node.nodeName === '#text') {
    return node.value;
  }

То есть тут ES6 стрелочная функция, но ведь в конфиге webpack указано, что необходимо с помощью babel трансформировать в ES5:
{
   test: /\.js$/,
   exclude: /node_modules/,
   use: ['babel-loader', 'eslint-loader']
}

Дальше начал искать, откуда этот код попал в сборку app.js, и оказалось что он с node_modules (т.е пакет написан на ES6)
Хорошо подумал я, может дело в том, что я запретил обрабатывать (exclude) папку node_modules?
Но если я удалю строку (exclude: /node_modules/), то возникнет еще одна ошика, вернее очень много ошибок, так как ESLint (Standard Styly), мало пакетов в соответствии с выбранным стилем написаны
Далее я добавил новый reles:
{
   test: /\.js/,
   include: /node_modules/,
   use: ['babel-loader']
}

Работает, но меня не покидает мысль, а разве правильно это? обрабатывать все пакеты из node_modules babel'ом? время сборки сильно увеличилось...
Как вы решаете такие проблемы, в частности, когда в продакшн сборку попадают стрелочные функции, да и не только они, а вообще ES6, не говоря уже о ES7 фичах?

Вот ссылка на конфиг webpack
  • Вопрос задан
  • 873 просмотра
Пригласить эксперта
Ответы на вопрос 3
larisamoroz
@larisamoroz
Курю маны, втыкаю в код, ваяю, починяю.
Babel-у требуется указать настройки (preset) по которым будет транспилироваться код.
Документация по использованию babel-loader:
{
  test: /\.js$/,
  exclude: /node_modules|/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['env']
    }
  }
}


В данном случае используется babel-preset-env, который автоматически определяет требуемые полифиллы и т.п.… Соответственно, его также нужно подключить в приложение:
yarn add babel-preset-env --dev
или
npm install --save-dev babel-preset-env
Ответ написан
Это баг, к сожалению последняя версия UglifyJs не поддерживает всякие es6. Вам либо надо транслировать в старый JS, а если вы все же этого не хотите - поставьте отдельно от вебпака плагин. У меня все работало на этой версии:
"uglifyjs-webpack-plugin": "^0.4.3",
Ответ написан
hazratgs
@hazratgs Автор вопроса
В итоге в конфиг продакшна добавил:
{
   test: /\.js$/,
   exclude: /src/,
   include: /node_modules/,
   use: ['babel-loader']
}

Оно работает, но это костыль...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы