簡體   English   中英

Gulp uglify 因 js 解析錯誤而失敗

[英]Gulp uglify fails with js parse error

我正在為一個非常煩人的錯誤而苦苦掙扎。 首先:我是 gulp 的新手。

我嘗試使用 Angular 實現單頁應用程序。 為了使我的工作流程更好,我嘗試實現 gulp。

我在安裝一些 gulp 插件時遇到了一些嚴重的 npm 錯誤,但這是另一個故事,我意識到它可以正常工作,也可以沒有錯誤。

我真正想到的是 useref 插件。 或者更准確地說,是 uglify 插件。

這是在我的 gulpfile.js 中:

gulp.task('useref', function() {
  return gulp.src('app/*.html')
    .pipe(useref())
    .pipe(gulpIf('*.js', uglify()))
    .pipe(gulpIf('*.css', cssnano()))
    .pipe(gulp.dest('dist'))
});

這是它在嘗試運行時拋出的堆棧跟蹤。 C:\\Work\\evori-portfolio>gulp userref

[16:32:40] Using gulpfile C:\Work\evori-portfolio\gulpfile.js
[16:32:40] Starting 'useref'...

events.js:141
      throw er; // Unhandled 'error' event
      ^
 Error
    at new JS_Parse_Error (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:1526:18)
    at js_error (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:1534:11)
    at croak (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2025:9)
    at token_error (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2033:9)
    at expect_token (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2046:9)
    at expect (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2049:36)
    at eval (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2602:13)
    at eval (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2072:24)
    at expr_atom (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2532:35)
    at maybe_unary (eval at <anonymous> (C:\Work\evori-portfolio\node_modules\uglify-js\tools\node.js:22:1), <anonymous>:2708:19)

這個堆棧跟蹤對我來說絕對沒有任何意義。

我查看了堆棧跟蹤中列出的所有目的地,但沒有發現任何故障。

我認為這可能是由 gulp 所做的異步工作引起的。 可能是 uglify 插件試圖將此時未完成的 useref 文件丑化。 怎么知道?

因此,我將所有內容分開以確保錯誤不是由重疊插件引起的。

這是我重現錯誤的方式:1. gulp clean:dist

gulp.task('clean:dist', function() {
  return del.sync('dist')
});
  1. 吞下用戶引用

    gulp.task('useref', function() { return gulp.src('app/*.html') .pipe(useref()) .pipe(gulp.dest('dist')) });

  2. 吞咽縮小

    gulp.task('minify', function() { return gulp.src('dist/**/*.js') /*.pipe(gulpIf('*.css', cssnano()))*/ .pipe(uglify()) .pipe(gulp.dest('dist')) });

  3. 對堆棧跟蹤感到瘋狂

    C:\\Work\\evori-portfolio>gulp minify [11:55:50] Using gulpfile C:\\Work\\evori-portfolio\\gulpfile.js [11:55:50] Starting 'minify'...

    events.js:141 throw er; // Unhandled 'error' event ^ Error at new JS_Parse_Error (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:1526:18) at js_error (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:1534:11) at croak (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2025:9) at token_error (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2033:9) at expect_token (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2046:9) at expect (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2049:36) at eval (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2602:13) at eval (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2072:24) at expr_atom (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2532:35) at maybe_unary (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2708:19) at expr_ops (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2743:24) at maybe_conditional (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2748:20) at maybe_assign (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2772:20) at expression (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2791:20) at eval (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2173:39) at eval (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2072:24) at block_ (eval at <anonymous> (C:\\Work\\evori-portfolio\\node_modules\\uglify-js\\tools\\node.js:22:1), <anonymous>:2352:20)

編輯好的...我在我的 index.html 文件中有大量的 .js 文件。 我試圖獲取該文件,通過刪除每個文件並嘗試運行 useref+minify 導致錯誤。 我明白了。 壞文件。 當它從 index.html 中刪除時,minify 就像一個魅力。 但我不知道我做錯了什么或可能導致錯誤。

'use strict';

angular.module('previewApp')
  .factory('dienstleisterRegObjService', function() {

    /* Aktuell ausgewähltes Produkt */
    var vorselektiertesProdukt = {
      servicetyp: '',
      dienstleistungstyp: '',
      produkt: ''
    };

    /* Registrations Objekt; wird per API an Server übergeben */
    var regObj = {
      organisation: '',
      vorname: '',
      nachname: '',
      mail: '',
      nationalitaet: 'Schweiz',
      sprache: 'Deutsch',
      produkte: []
    };

    /* Reset Methods */
    var getNewVorSelektProd = function() {
      vorselektiertesProdukt.servicetyp = '';
      vorselektiertesProdukt.dienstleistungstyp = '';
      vorselektiertesProdukt.produkt = '';
    };

    var getNewRegObj = function() {
      regObj.organisation = '';
      regObj.vorname = '';
      regObj.nachname = '';
      regObj.mail = '';
      regObj.nationalitaet = 'Schweiz';
      regObj.sprache = 'Deutsch';
      regObj.produkte = [];
    };

    /* Service Objekt */
    return {
      vorselektiertesProdukt,
      regObj,
      addProduct: function(servicetyp, dienstleistungstyp, produktparam) {
          var produkt = {};
          produkt.servicetyp = servicetyp;
          produkt.dienstleistungstyp = dienstleistungstyp;
          produkt.produkt = produktparam;
          regObj.produkte.push(produkt);
      },
      deleteProduct: function(produkt) {
        var index = regObj.produkte.indexOf(produkt);
        regObj.produkte.splice(index, 1);
      },
      resetVorSelektProd: function() {
        getNewVorSelektProd();
      },
      resetRegObj: function() {
        getNewRegObj();
      },
      resetAllObj: function() {
        getNewVorSelektProd();
        getNewRegObj();
      }
    };
  });

如果有人遇到同樣的問題,我建議修改 gulp 代碼以檢查文件導致問題的原因。

node_modules/gulp-uglify/minifier.js找到函數: var mangled = trycatch(function () {} before return write console.log(file.path);保存文件然后再試一次,你會看到文件正在處理

錯誤前終端中出現的最后一個文件路徑是出現錯誤的文件。

好的,看起來我找到了失敗的聲明。

我不明白為什么,但是當我刪除 dienstleisterRegObjService.js 的返回對象中的語句時它會起作用:

vorselektiertesProdukt,
regObj,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM