【问题标题】:RequireJS: Uglification Not WorkingRequireJS:丑化不起作用
【发布时间】:2018-03-04 13:48:03
【问题描述】:

我一定在某处犯了错误,但在优化期间它没有被写入标准输出。我正在尝试通过 requirejs 优化文件,但输出没有被缩小。根据documentation,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 任务中完成的。它位于“将优化器用作节点模块”下方。

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

【问题讨论】:

    标签: gulp requirejs requirejs-optimizer


    【解决方案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 中的let 更改为var,那么问题就消失了。

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

    【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,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. 
    

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

    【讨论】:

    • 请告诉我如何解决这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2012-06-26
    • 2013-05-07
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多