【问题标题】:Gulp uglify unable to handle arrow functionsGulp uglify 无法处理箭头函数
【发布时间】:2016-03-23 13:16:21
【问题描述】:

我正在尝试使用 gulp-uglify 压缩我的项目,但是 gulp 似乎在遇到代码中的箭头函数时会抛出错误 Unexpected token: punc ()。我能做些什么来解决这个问题吗?谢谢。

gulp-crash-test.js

// Function with callback to simulate the real code
function test(callback) {
    if (typeof callback === "function") callback();
}

// Causes a crash
test(() => {
    console.log("Test ran successfully!");
});

// Doesn't cause a crash
test(function () {
    console.log("Test ran successfully!");
});

gulpfile.js

var gulp = require("gulp");
var concat = require("gulp-concat");
var uglify = require("gulp-uglify");

gulp.task("scripts", function() {
    gulp.src([
        "./gulp-crash-test.js"
    ]).pipe(
        concat("gulp-crash-test.min.js")
    ).pipe(
        uglify().on('error', function(e){
            console.log(e);
        })
    ).pipe(
        gulp.dest("./")
    );
});

gulp.task("watch", function() {
    gulp.watch("./gulp-crash-test.js", ["scripts"]);
});

gulp.task("default", ["watch", "scripts"]);

【问题讨论】:

  • 你可以在你的 gulpfile.js 中练习箭头函数。但首先检查你的 node.js 版本。

标签: javascript gulp ecmascript-6 gulp-uglify


【解决方案1】:

箭头函数是 ES6 特性。 Babel(和其他)旨在将 ES6 转换为 ES5 或更早版本,作为构建过程的一部分。幸运的是,有 Gulp 和 Grunt 的 Babel 插件。在 uglify 之前运行 Babel。

https://www.npmjs.com/package/gulp-babel

我希望这会引导您朝着正确的方向前进/有人可以演示一些代码。

【讨论】:

【解决方案2】:

没有支持 ES6 语法的 ugilify(minify) 工具。 你应该在 babel compile (es6 -> es5) 之后构建 gulp 任务

1.安装包

npm install gulp-babel babel-preset-es2015

2.如下更改您的代码。

    var gulp = require("gulp");
    var concat = require("gulp-concat");
    var uglify = require("gulp-uglify");
    var babel  = require('gulp-babel');

    gulp.task("scripts", function() {
        return gulp.src(["./gulp-crash-test.js"])
    .pipe(babel({presets: ['es2015']}))
    .pipe(concat("gulp-crash-test.minjs"))
    .pipe(uglify().on('error', function(e){
         console.log(e);
    }))
    .pipe(gulp.dest("./"))
    });

【讨论】:

  • 我不知道为什么这里的人我用 babel 给出建议,问题显然是如何缩小 ecma6 代码,而这个问题仍然没有答案
  • .pipe(uglify({ compress: true }) 插入到上述答案中将产生缩小的 ES2015 代码。
【解决方案3】:

您可以使用babel minify(以前的 Babili)一个基于 babel 的库来压缩 ES6 代码而无需转译:

首先通过 npm 安装:

npm install --save-dev babel-preset-minify

然后在你的 gulp 文件中:

var gulp = require('gulp')
var babel = require('gulp-babel')
gulp.task('default', () => {
  return gulp.src('src/app.js')
  .pipe(babel({presets: ['minify']}))
  .pipe(gulp.dest('dist'))
})

它使用 babel 作为解析器,但没有转译。

【讨论】:

  • 值得一提的是Babili需要node>=4.0.0
  • 我更喜欢这种方法,因为我的目标是 ES6
  • 对我不起作用...安装似乎不是正确的。错误:找不到模块 'gulp-babel' - 为什么要安装 babel-preset-minify 并将其称为 gulp-babel?您在发布之前尝试过自己安装吗?
  • @johnblair 显然您需要安装 gulp-babel,因为您需要,gulp 也是如此。我在预设上添加了安装,因为这在代码中并不明显,babel 从配置中加载它
  • 好的。我放弃了 Babel,因为我发现版本不兼容有很多问题,我实际上并不需要或想要转译——只是缩小。最后我使用 gulp-uglifyes 来最小化我的 ES6 js。在这里发布代码以防其他人发现它有用。 uglify = require("gulp-uglifyes") // 缩小文件 .pipe(uglify({ mangle: true, ecma: 6 }))
【解决方案4】:

我试过 babeli,它有点糟糕。构建时间花了我 40 多岁。而且我也不打算将代码转换成 es5

我更喜欢使用 uglify-es 遵循描述 https://www.npmjs.com/package/uglify-es https://www.npmjs.com/package/gulp-uglify

我的构建时间现在是 10 秒。我有耐心等 10 秒。

这是我的 gulpfile

var gulp = require('gulp');
var uglifycss = require('gulp-uglifycss');
var htmlminifier = require('gulp-html-minifier');
var useref = require('gulp-useref');
var gulpif = require('gulp-if');
var clean = require('gulp-clean');
var uglifyes = require('uglify-es');
var composer = require('gulp-uglify/composer');
var minifyes = composer(uglifyes, console);

.pipe(gulpif('*.js', minifyes()))

【讨论】:

    【解决方案5】:

    这是我使用 angular 和 babel 的 useref。

    gulp.task('concat-js', ['your dependency task'],function(){
      return gulp.src('dev/dev_index/index.html')
        .pipe(useref())
        .pipe(gulpif('*.js', ngAnnotate())) // if you use angular
        .pipe(gulpif('*.js',babel({
            compact: false,
            presets: [['es2015', {modules: false}]]
         })))
        .pipe(gulpif('*.js', uglify({ compress: false })
        .pipe(gulp.dest('./'));
    });
    

    【讨论】:

      【解决方案6】:

      首先'babel' .js 文件

      var babel = require('gulp-babel');
      gulp.task('babel-js', () =>
      gulp.src('js/main.js')
       .pipe(babel({presets: ['env']}))
       .pipe(gulp.dest('build/babel'))
      );
      

      https://www.npmjs.com/package/gulp-babel

      比“丑化”它

      var uglify = require('gulp-uglify'), pump = require('pump');
      gulp.task('uglify-js', function (cb) {
         pump([
           gulp.src('build/babel/main.js'),
           uglify(),
           gulp.dest('build/js')
         ],
         cb
      );
      });
      

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

      待安装

      npm install --save-dev gulp-babel babel-core babel-preset-env
      npm install uglify-es -g
      npm install pump
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多