防止替换 Terser 中的 ES6 对象传播符号

prevent replacing ES6 Object spread notation in Terser

!((
    input,
    processed = {
        foo: 1,
        ...input
    }
) => {
    window.console.log(processed)
})({
    bar: 2  // input configuration
})

缩小为:

((t, e = {
    foo: 1,
    bar: 2
}) => {
    window.console.log(e);
})();

我需要那个 input 参数用于以后的配置

问题:如何保持原有格局?

我需要更简洁的输出:

((t, e = {
    foo: 1,
    ...t
}) => {
    window.console.log(e);
})({bar: 2});

评论后更新:

let input1 = { bar:2 }
!((
    input,
    processed = {
        foo: 1,
        ...input
    }
) => {
    window.console.log(processed)
})( input1 )

输出:

((t, e = {
    foo: 1,
    ...t
}) => {
    window.console.log(e);
})({
    bar: 2
});

Terser 将处理您代码的当前版本。现在,您正在将一个常量参数传递给一个函数,因此 terser 可以直接将其内联以防止创建中间对象。

如果将来您在函数内部(对于原始值)或函数外部(对于对象)更改此参数,则 terser 应该能够识别并且不再内联。

令人惊讶的是,已经将参数声明为变量似乎给了简洁的正确提示,正如 OP 所发现的:

let input1 = { bar:2 }
!((
    input,
    processed = {
        foo: 1,
        ...input
    }
) => {
    window.console.log(processed)
})( input1 )

将导致

((t, e = {
    foo: 1,
    ...t
}) => {
    window.console.log(e);
})({
    bar: 2
});