Подтвердить что ты не робот

Использует ли grunt-contrib-uglify не анализировать ключевые слова "let"?

Я получаю сообщение об ошибке,

'Неожиданный токен: name (bazz)'

когда моя задача grunt работает uglify. Единственное, что я заметил на этой строке, было то, что я использовал ключевое слово "let" вместо "var", поэтому я не был уверен, почему эта ошибка возникает.

У меня есть оператор if else с let varName в каждом, то есть:

function foo (bar) {
    if (condition) {
        let bazz = fn();
        //doSomething with bazz
        _.assign(bar, bazz);
    } else {
        let bazz = fn2();
        //doSomething different with bazz
        _.assign(bar, bazz);
    }
}

Я мог бы изменить его, имея var bazz = {}; перед предложением if else, но я хотел этого избежать, потому что мне пришлось бы назначать bazz для fn() и fn2() независимо.

Хотелось узнать, столкнулся ли кто-нибудь еще с этим и что они сделали, чтобы исправить это. Спасибо заранее!

4b9b3361

Ответ 1

После изучения этой темы немного больше я узнал, что grunt-contrib-uglify, а также gulp -uglify имеет UglifyJS как зависимость и пока не поддерживает ES6 "Гармония". Следуйте https://github.com/mishoo/UglifyJS2/issues/448 для обновлений.

Вы также можете использовать такие инструменты, как grunt-babel, чтобы скомпилировать ваш ES6-код в ES5.

Ответ 2

Я наткнулся на официальную gulp-uglify npm страницу.

Обратите внимание на рекомендацию:

Чтобы правильно обрабатывать условия ошибки с помощью потоков Node, это проект рекомендует использовать pump. Для получения дополнительной информации см. Зачем использовать Насос?.

Моя реализация примера на приведенной выше странице:

gulpfile.js

var gulp = require('gulp');  
var pump = require('pump');  

// the npm page states:  
// can be a git checkout or another module 
// (such as `uglify-js-harmony` for ES6 support)
var uglifyjs = require('uglify-js-harmony');   
var minifier = require('gulp-uglify/minifier');  

var concat = require('gulp-concat');

gulp.task('compress', function (cb) {  
  // the 'options' argument is included in the example, 
  // but i don't know what it does or how it can be removed  
  var options = {  
    preserveComments: 'license'  
  };  

  pump([  
      gulp.src('my_scripts/*.js'),  // gets all js scripts in this folder  
      minifier(options, uglifyjs),  
      concat('my_bundled_script.js'), // concatenates all scripts into this file  
      gulp.dest('dist')  // puts the file into this folder
    ],cb 
  );  
});  

package.json

{
  "devDependencies": {
    "gulp": "latest",
    "pump": "latest",
    "gulp-concat": "latest",
    "gulp-uglify": "latest",
    "uglify-js-harmony": "latest"
  },
  "dependencies": {}
}

Результаты

Без использования uglify-js-harmony:

  • pump было полезно найти, откуда возникла ошибка (при использовании gulp-uglify)
  • Файл с выражением let вызвал ошибки

При использовании uglify-js-harmony ошибки не возникли.

Другие соображения:

На приведенной выше странице показано:

// can be a git checkout or another module  
// (such as `uglify-js-harmony` for ES6 support)
var uglifyjs = require('uglify-js');

Но при установке uglify-js-harmony я получил предупреждающее сообщение:

npm WARN устарел [email protected]: устарел в пользу уродовать-е

Когда я попытался использовать uglify-es вместо uglify-js-harmony, однако, у меня появилось сообщение об ошибке, подобное документированному здесь:

https://github.com/terinjokes/gulp-uglify/issues/287

Я пытался следить за потоком проблем, но потерялся и не смог найти окончательное решение о том, как реализовать uglify-es.