Неожиданная ошибка токена при использовании UglifyJS с Preact, Webpack 2

Я создаю расширение Chrome с помощью Preact/ES6/Webpack. Я упаковываю, используя одну из 2 конфигураций: debug использует загрузчики ESLint, Babel и CSS + JSON, prod добавляет 2 плагина: UglifyJS и Zip. Вот webpack.config.js:

const webpack = require('webpack');
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const WebpackCleanupPlugin = require('webpack-cleanup-plugin');
const ZipPlugin = require('zip-webpack-plugin');
const manifest = require('./src/manifest');

let options = {
    // entry file - starting point for the app
    entry: {
    popup: './src/scripts/popup.js',
    options: './src/scripts/options.js',
    background: './src/scripts/background.js'
  },

    // where to dump the output of a production build
    output: {
    path: path.join(__dirname, 'build'),
    filename: 'scripts/[name].js'
  },

    module: {
        rules: [
      {
        test: /\.jsx?/i,
        exclude: /node_modules/,
        loader: 'eslint-loader',
        options: {
        },
        enforce: 'pre'
    },
    {
        test: /\.jsx?/i,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
            presets: [
            ['env', {
              'targets': {
                'chrome': 52
              }
            }]
          ],
            plugins: [
            ['transform-react-jsx'],
            ['module-resolver', {
              'root': ['.'],
              'alias': {
                'react': 'preact-compat',
                'react-dom': 'preact-compat'
              }
            }]
                    ]
                }
            },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      {
        test: /\.json$/,
        use: 'json-loader'
      }
        ]
    },

  plugins: [
    new WebpackCleanupPlugin(),
    new CopyWebpackPlugin([
      {from: './src/_locales', to: '_locales'},
      {from: './src/icons', to: 'icons'},
      {from: './src/manifest.json', flatten: true},
      {from: './src/*.html', flatten: true}
    ])
  ],

    // enable Source Maps
    devtool: 'source-map',
};

if(process.env.NODE_ENV === 'production') {
  options.plugins.push(
    new webpack.optimize.UglifyJsPlugin({
      compress: {
        warnings: false,
        drop_console: false,
        screw_ie8: true,
        conditionals: true,
        unused: true,
        comparisons: true,
        sequences: true,
        dead_code: true,
        evaluate: true,
        if_return: true,
        join_vars: true,
      },
      output: {
        comments: false,
      },
    }),
    new ZipPlugin({
      path: '../dist',
      filename: `${manifest.name} ${manifest.version}.zip`
    })
  );
}

console.log(`This is a ${process.env.NODE_ENV === 'production' ? 'production' : 'development'} build with ${options.plugins.length} plugins`);

module.exports = options;

Но когда я бегу prodЯ получаю следующие ошибки:

ERROR in scripts/popup.js from UglifyJs
Unexpected token: name (getLatestValues) [scripts/popup.js:29428,4]

ERROR in scripts/options.js from UglifyJs
Unexpected token: name (getLatestValues) [scripts/options.js:29428,4]

ERROR in scripts/background.js from UglifyJs
Unexpected token: name (getLatestValues) [scripts/background.js:28678,4]

Стоит отметить, что getLatestResults не единственная функция в моем коде, которая имеет await перед ней. Кроме того, он должен появляться только в background.js так как другие точки входа не должны вызывать его.

Также стоит отметить, что если я просто прокомментирую UglifyJS код, получившееся расширение на молнии работает хорошо.

Какая часть конфигурации мне не хватает, чтобы эти ошибки исчезли?

1 ответ

Оказывается, в настоящее время (5/2017) встроенный webpack.optimize.UglifyJsPlugin не поддерживает ES6. Когда Вавилон проходит await/async это превращает их в generatorс, что вызывает UglifyJS выбросить ошибку.

Есть несколько альтернатив UglifyJS перечисленные в этой статье, но я надеюсь, что ребята из Webpack обновят плагин, и я смогу оставить свой код без изменений.

TL; DR: мой код в порядке; UglifyJS не поддерживает ES6; Будет поддерживать в будущем или будет заменен на альтернативный.

Я заменил uglify-js в uglify-es для совместимости с ES6:

https://www.npmjs.com/package/uglify-es

У меня отлично работает!

Другие вопросы по тегам