Terser在Node.js环境中丑化了process.env,使其无法使用

时间:2018-12-10 13:57:57

标签: node.js

我想在Node.js环境中使用软件包Terser(基本上是ES6 +的UglifyJS)。我将webpackterser-webpack-plugin用于以下选项:

optimization: {
    minimizer: [
      new TerserPlugin({
        parallel: true,
        terserOptions: {
          ecma: 6,
          toplevel: true,
          keep_classnames: false,
          keep_fnames: false,
          mangle: {
            properties: true
          }
        },
      }),
    ]
  },

mangle.properties设置为true时,插件会将process.env修改为r.es之类的内容,因此在尝试使用r.es['NODE_ENV']或类似名称访问时会使其中断码。检查一下terser产生的以下代码:

"use strict";
(function(t) {
    Object.defineProperty(e, "l", {
        h: !0
    });
    const n = i(1)
      , s = i(45)
      , r = i(78);
    e.ts = (t=>parseInt(r.es[t] || "")); // r.es should be r.env or process.env
    let o = e.ts("LOG_LEVEL");
    isNaN(o) && (o = n.ss.ns);
    class c {
    }
    c.rs = e.ts("API_PORT") || 9e3,
    c.os = r.es.cs || "0.0.0.0",
    c.us = "YES" === r.es.hs,
    c.ls = o,
    c.fs = e.ts("LOG_ROWS_TO_KEEP") || 1e5,
    c.ys = s.join(c.ds, "build"),
    e.a = c
}
).call(this, "/")

mangle.properties设置为false时可以解决此问题,但是我真的很想打开它。

导入或要求输入process是我尝试的第一件事,但是terser的输出完全没有改变。

const process = require('process');

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

最初,我认为保留@NgModule({ imports: [...], declarations: [ AcctSelectComponent, RefillDepositWinComponent ], entryComponents: [ RefillDepositWinComponent ] }) export class CabinetLayoutModule { } 就足够了,但事实并非如此。

相反,我想到了这个:

process

这有点骇人听闻,因为例如它还禁用了对mangle: { properties: { keep_quoted: true, reserved: [ 'process', 'env' ], } } 的篡改。