当前位置: 首页 > 知识库问答 >
问题:

WebPack TerserPlugin:mangle忽略属性和类名-错误代码的质量很差

储志业
2023-03-14

所有属性名称,许多变量都有它们的原始名称。即使明确指定了Terser的mangle选项:

  • mangle:没错,
  • sourceMap:false,
  • 保留名称:false,
  • 顶层:没错

这是网页包配置:

const TerserPlugin = require('terser-webpack-plugin');
const path = require('path');

module.exports = {
    entry: './src/scripts/index.ts',
    devtool: 'inline-source-map',
    module: {
        rules: [        
            {
                test: /\.tsx?$/,                
                use: {
                    loader: 'ts-loader',
                    options: { configFile: 'tsconfig-build.json' }
                },
                exclude: /node_modules/,                
            },
        ],        
    },
    resolve: {
        extensions: [ '.tsx', '.ts', '.js' ],
    },
    plugins: [ ],

    // PROBLEMS HERE:
    optimization: {        
        minimize: true,        
        minimizer: [new TerserPlugin({
            sourceMap: false,            
            extractComments: false, // To avoid separate file with licenses.
            terserOptions: {
                mangle: true,
                sourceMap: false,       
                //keep_classnames: false,
                keep_fnames: false,
                toplevel: true,                                
            },                     
        })],
    },

    output: {    
        path: path.resolve(__dirname, resultDirPath),
        filename: 'main.js',
        publicPath: './',
    }   

}

我错过了配置中的什么吗?

共有3个答案

司寇嘉茂
2023-03-14

mangle:{properties:true}是安全的,如果你没有进行内省或其他在TypeScript中不典型的魔法:

class MyClassName {
    constructor(public arg: string) {
        console.log(arg);
    }

    getContext() {
        console.log("I'm not mangled because I might be a HTMLCanvasElement.getContext");
    }

    someCustomMethodName() {
        console.log("What's my name?");
    }
}

const x = new Foo("Hello world");
x.getContext();
x.someCustomMethodName();

将变成

(() => {
    const e = new class {
        constructor(e) {
            this.o = e, console.log(e);
        }

        getContext() {
            console.log("I'm not mangled because I might be a HTMLCanvasElement.getContext");
        }

        t() {
            console.log("What's my name?");
        }
    }("Hello world");
    e.getContext(), e.t();
})();
邹山
2023-03-14

不幸的是,没有简单的解决方案,而这段代码已经是使用Terser所能得到的最好的代码。

然而,我找到了一个完美的解决方案:“JavaScript混淆器”——https://github.com/javascript-obfuscator/javascript-obfuscator#readme

和它的WebPack插件:“javascript-obfucator plugin for Webpack”-https://github.com/javascript-obfuscator/webpack-obfuscator

顺便说一句,在我的情况下,它只大约35%。

所以,总结一下,你所需要的一切,只是为了:

  1. 安装“网页包javascript模糊器插件”:“npm安装--保存开发人员网页包模糊器”
const JavaScriptObfuscator = require('webpack-obfuscator');

// ...

// webpack plugins array
plugins: [
    new JavaScriptObfuscator ({
      rotateUnicodeArray: true
  }, ['excluded_bundle_name.js'])
],

这就是全部!

公西天逸
2023-03-14

我相信在你的原始配置中,你需要添加mangle。属性以使ES6类方法和数据成员被损坏。为了避免损坏外部库,我使用与下面的正则表达式匹配的前缀策略“唯一地”命名要损坏的所有方法和数据成员。

            new TerserPlugin({
                terserOptions: {
                    mangle: {
                        properties: {
                            regex: /(^P1|^p1|^_p1)[A-Z]\w*/
                        }
                    }
                }
            })
        "terser-webpack-plugin": "^2.2.1",

这种方法的细微之处在于:

  • 我目前的命名与我正在使用的外部库中的命名不匹配。在未来的库版本中不能保证这一点。
  • 这让我原来的src有点丑。
 类似资料:
  • 错误日志: com.android.build.api.transform.transformException:com.android.ide.common.Process.processException:java.util.concurrent.executionException:com.android.ide.common.Process.processException:org.gra

  • Liniting是一个检查你代码风格和编码错误的一个过程,对于python中有很多流行的linting工具,我们这里使用Flake8 - 融合了pep8和pyflakes两种linting工具。 首先,在requrements.txt文件中添加flake8依赖包: flake8==3.5.0 同样的,重新构建容器: (tdd3)$ docker-compose -f docker-compose

  • 我是不是漏掉了什么?我应该如何使用这些异步方法来处理这样的错误响应呢?

  • 问题内容: 我在GlassFish 4上使用java.util.logging。 我正在定义自己的类,以通过定义System属性 来初始化。 我的班级加载文件,将其与其他属性文件合并,并进行一些自定义替换。 以下是我文件的相关部分: 我正在使用标准并将其配置为使用格式化程序。 但是字符串被完全忽略了。相反,SimpleFormatter使用其默认格式。 我哪里做错了? 问题答案: 我假设系统属性是

  • QueryList遵循将业务与错误分离的原则, HTTP请求传输过程中如果出现的错误,QueryList将会抛出异常。 QueryList的HTTP客户端基于GuzzleHttp,它提供了丰富的HTTP异常类型,用户可以自行设计根据不同的异常类型做不同的处理。 如果你觉得麻烦,并不想每次都去处理HTTP异常,选择直接忽略,让程序继续运行下去,做法可以参考下面方式: 对内置的get()进行封装: u

  • 问题内容: 我正在使用Retrofit(与OkHttp和GSON结合使用)与在线Web服务进行通信。该Web服务的所有响应都有一个默认包装,类似于: 在此示例中,将为或。此外,仅在处理请求时发生错误时才包含任何内容。最后但并非最不重要的一点将包含调用的实际结果(示例中为字符串,但是某些调用返回JSON数组或JSON对象)。 为了处理此元数据,我创建了一个通用类,如下所示: 我还创建了代表有时给出的