2017-09-22 65 views
1

我必須在某處犯個錯誤,但在優化過程中不會寫入stdout。我試圖通過requirejs優化一個文件,但輸出沒有被縮小。根據documentation,UglifyJS應該縮小代碼。RequireJS:Uglification無法正常工作

無論如何,下面的代碼是微不足道的,但它隔離了這個問題。

的src/index.js:

require(['config'], function() { 
    require(['myMod'], function (myMod) { 
     console.log(myMod.x()); 
    }) 
}) 

的src/myMod.js:

define(function() { 
    let myMod = { 
     x: 5 
    }; 

    return myMod; 
}) 

的src/config.js:

define(function() { 
    require.config({ 
     baseUrl: 'src' 
    }); 
}) 

而這裏的一飲而盡任務是執行優化:

gulp.task('optimize', function (cb) { 
    let config = { 
     appDir: 'src', 
     dir: 'dist/src', 
     generateSourceMaps: true, 
     preserveLicenseComments: false, 
     removeCombined: true, 
     baseUrl: './', 
     modules: [{ 
      name: 'index', 
      include: ['myMod'] 
     }] 
    } 

    let success = function (buildResponse) { console.log(buildResponse); cb() }, 
     error = function (err) { console.log(err); cb(err) } 

    rjs.optimize(config, success, error) 
}) 

運行該任務後,dist/src/index.js包含其中的所有其他模塊。但是,它沒有被縮小,並且沒有變量被重命名。相反,就好像這些文件只是連接在一起,而已。有人可以告訴我(1)爲什麼它沒有被縮小? (2)是UglifyJS拋出一個錯誤?如果是這樣,當吞嚥任務正在運行時有沒有辦法看到它?

編輯這裏是RequireJS文檔的鏈接,它提到了在節點中使用優化器的問題,這是在上面提到的gulp任務中完成的。它位於「使用優化器作爲節點模塊」的底部。

http://requirejs.org/docs/node.html

回答

1

RequireJS」優化束UglifyJS2。 UglifyJS2不處理ES6或更高版本。如果我帶你在你的gulpfile使用的選項,並把它們花掉到一個單獨的文件,我的名字options.js,併發出以下命令:

$ ./node_modules/.bin/r.js -o options.js 

然後我得到這樣的輸出:

Tracing dependencies for: index 
Uglify file: /tmp/t33/dist/src/index.js 
Error: Cannot uglify file: /tmp/t33/dist/src/index.js. Skipping it. Error is: 
SyntaxError: Unexpected token: name (myMod) 

If the source uses ES2015 or later syntax, please pass "optimize: 'none'" to r.js and use an ES2015+ compatible minifier after running r.js. The included UglifyJS only understands ES5 or earlier syntax. 

index.js 
---------------- 
config.js 
index.js 
myMod.js 

正如你可以看到,UglifyJS確實無法縮小文件,RequireJS只是跳過該文件的縮小步驟。由於這不是一個徹頭徹尾的錯誤,文件仍然是輸出,只是沒有縮小。

如果您在myMod.js更改letvar,則問題消失。

不幸的是,因爲這不是一個執行失敗(r.js仍然運行,它只是沒有再壓縮文件),其誤差不通知給你傳遞給rjs.optimize的errback可處理程序。我沒有看到在Gulp文件中捕獲這種錯誤的方法。安全的做法是設置optimize: "none"並在運行rjs.optimize後執行縮小作爲附加構建步驟。

+0

非常感謝!我很尷尬地說,這不是我第一次犯這個錯誤:(希望它是最後一個,但! – Andrew