RequireJS:丑化不起作用

时间:2017-09-22 22:12:02

标签: gulp requirejs requirejs-optimizer

我必须在某个地方犯错,但在优化过程中没有写入stdout。我试图通过requirejs优化文件,但输出没有被缩小。根据{{​​3}},UglifyJS应该缩小代码。

无论如何,以下代码是微不足道的,但它隔离了问题。

的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任务:

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抛出错误?如果是这样,有没有办法在运行gulp任务时看到它?

编辑这里是一个指向RequireJS文档的链接,其中讨论了在节点中使用优化器,这是在上面提到的gulp任务中完成的。它位于底部"使用优化器作为节点模块"。

documentation

2 个答案:

答案 0 :(得分:3)

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只是跳过该文件的缩小步骤。由于这不是一个彻头彻尾的错误,文件仍然是输出,只是没有缩小。

如果您在let中将var更改为myMod.js,则问题就会消失。

不幸的是,由于这不是执行失败(r.js仍在运行,它只是不会缩小文件),错误不会发送到传递给rjs.optimize的错误处理程序。我没有看到在Gulpfile中捕获此类错误的方法。安全的做法是设置optimize: "none"并在运行rjs.optimize后执行缩小作为额外的构建步骤。

答案 1 :(得分:0)

我也遇到了同样的问题,其中 require.js 的优化器 (r.js) 组合了不同的模块,但是,它没有缩小合并的文件。尽管我的运行时环境与您的不同(使用 Java 的 Nashorn 引擎),但在我的控制台上可以看到此错误:

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. 

此外,此错误不会阻止优化器合并文件,只是优化器将无法缩小合并文件。