it-swarm.com.ru

Uglify SyntaxError: Неожиданный токен: punc ())

Я пытаюсь использовать gulp, чтобы минимизировать папку, содержащую файлы JS. Тем не менее, один из файлов имеет вышеуказанную ошибку, препятствующую минимизации.

Мне удалось поймать и распечатать ошибку, которую я частично напечатал здесь:

JS_Parse_Error {
 message: 'SyntaxError: Unexpected token: punc ())',
 filename: 'ex.js',
 line: 189,
 col: 25,
 pos: 6482,
 stack: Error\n    at new JS_Parse_Error (eval at <anonymous> ... ) 
 plugin: 'gulp-uglify',
 fileName: '.../js/ex.js',
 showStack: false
}

Данный файл содержит следующее, сокращенное:

function() {
  ...
  $.confirm({
    buttons: {
        confirm: function() {
            $.post('/ajax-handler', {
                    ...
                })
                .done( function(response) {
                    var data = filterResponse(response);
                    if (data['status'] == 'success') {
                        sleep(1000).then(() => {
                    *       ...
                        });
                        sleep(5000).then(() => {
                            ...  
                        });

                    } else {
                        console.log('Oops!');
                    }
                })
                .fail( function(err, status, response) {
                    ...
            });
        },
        cancel: function() {}
    }
 });
  ...
}

Я добавил "*" выше, чтобы указать точную позицию, указанную JS_Parse_Error.

51
Alexander

// Обновление

Из комментариев ~ @imolit

 v2.0.0 (2018-09-14) - ИЗМЕНЕНИЯ ИЗМЕНЕНИЙ (ссылка)

Переключитесь обратно на uglify-js (uglify-es отменяется, если вам нужно uglify код ES6, используйте terser-webpack-plugin ).


Оригинальный ответ до обновления ...

Я надеюсь, что вы можете вдохновиться этим решением, которое работает с веб-пакетом. (ссылка ниже)

Просто научи UglifyJS ES6

Существует две версии UglifyJS - ES5 и ES6 (Harmony), см. На git
Версия ES5 поставляется по умолчанию со всеми плагинами, но если вы устанавливаете версию Harmony явно, эти плагины будут использовать ее вместо.

package.json

"uglify-js": "git+https://github.com/mishoo/UglifyJS2.git#harmony"

или же

npm install --save [email protected]:mishoo/UglifyJS2#harmony

yarn add git://github.com/mishoo/UglifyJS2#harmony --dev

Webpack

Для использования с веб-пакетом установите также плагин веб-пакета

npm install uglifyjs-webpack-plugin --save-dev

yarn add uglifyjs-webpack-plugin --dev

затем импортируйте установленный вручную плагин

var UglifyJSPlugin = require('uglifyjs-webpack-plugin');

и заменить его в коде

-  new webpack.optimize.UglifyJsPlugin({ ... })
+  new UglifyJSPlugin({ ... })

Для получения дополнительной информации о веб-пакете (Установка/использование) см. https://github.com/webpack-contrib/uglifyjs-webpack-plugin#install

49
Qwerty

npm install uglifyjs-webpack-plugin --save-dev недостаточно

Основная проблема - это "uglifyjs-webpack-plugin": "^0.4.6" в package.json веб-пакета

Согласно semver , ^0.4.6 := >=0.4.6 <0.5.0. Из-за начального нуля webpack никогда не будет использовать 1.0.0-beta.2.

Поэтому после запуска npm i -D [email protected] вам нужно сделать еще один шаг, rm -rf node_modules/webpack/node_modules/uglifyjs-webpack-plugin. Затем веб-пакет подберет версию из node_modules/uglifyjs-webpack-plugin вместо node_modules/webpack/node_modules/uglifyjs-webpack-plugin

Обновление от 2018-04-18: в webpack v4 такой проблемы нет

17
WOW

Добавьте зависимость babel-preset-es2015, чтобы исправить это.

А также добавьте 'es2015' в файл .babelrc.

json
{
    "presets": ["es2015"]
}
8
Qing

У меня та же проблема, я нашел отличные ответы здесь которые помогли мне добраться до файла, который вызывал ошибку.

Перейдите в консоль Rails и вставьте:

JS_PATH = "app/assets/javascripts/**/*.js";
Dir[JS_PATH].each do |file_name|
  puts "\n#{file_name}"
  puts Uglifier.compile(File.read(file_name))
end

Надеюсь, это поможет кому-то!

3
Hamza Khan

Для меня это не имело ничего общего с неправильной работой Uglify, а скорее с зависимостью (в данном случае пустым обещанием), которая еще не была скомпилирована в ES5. Поскольку мы только что импортировали исходный файл, но babel передает только файлы за пределами node_modules, uglify запутался в синтаксисе ES6.

Просто проверьте, может ли какая-либо недавно добавленная вами зависимость не иметь сборки dist.

2
spaceemotion

Если вы получили эту ошибку, используя Grunt (grunt-contrib-uglify), решение - установить версию плагина ES6:

npm install grunt-contrib-uglify-es --save-dev
0
amicoderozer

Добавьте stage-3 к предустановкам в файле .babelrc. 

{
  "presets": [
    "stage-3"
  ]
}
0
Cong Nguyen

У меня была такая же проблема с тобой. Я использовал gulp.js. Я решил эту проблему благодаря js-файлам, которые меняют формат ES. Например, до того, как решен мой код:

for (district for response) {
                $('#districts').append('<option value="' + district.id + '">' + district.name + '</option>');
                $('#districts').removeAttr('disabled');
            }

после исправления кода:

for (district in response) {
                $('#districts').append('<option value="' + district.id + '">' + district.name + '</option>');
                $('#districts').removeAttr('disabled');
            }

Таким образом, проблема связана с Ecma-uglify.js.

0
melih sahin