Gulp RequireJS:丑化不起作用

o2gm4chl  于 2022-12-08  发布在  Gulp
关注(0)|答案(2)|浏览(285)

我一定是在哪里犯了错误,但是在优化的过程中它并没有被写入到stdout。我试图通过requirejs优化一个文件,但是输出并没有被缩小。根据documentation,UglifyJS应该缩小代码。
无论如何,下面的代码是微不足道的,但它隔离了问题。
源代码/索引. js:

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

来源/我的修改. js:

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

    return myMod;
})

源/配置. 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任务运行时看到它?

    • EDIT**这里有一个到RequireJS文档的链接,它讨论了在节点中使用优化器,这是在上面提到的gulp任务中完成的。它在"使用优化器作为节点模块"的底部。

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

lqfhib0f

lqfhib0f1#

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后作为额外的构建步骤执行缩小。

yptwkmov

yptwkmov2#

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

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

相关问题