UglifyJS nemení názvy funkcií v JavaScripte generovanom TypeScriptom


Mám jednoduchú triedu v TypeScripte, ktorú transpiluem do ES5 a potom zostavujem s webpack 2 a minimalizujem pomocou UglifyJS3.

Očakával by som, že UgilfyJS tiež pokrúti názov funkcie showGreeting() (pozri kód nižšie), ale v minifikovanom js-súbore tomu tak nie je. Existuje nejaká iná možnosť, ktorú môžem nastaviť na minifikáciu názvov funkcií, alebo robím niečo zle? Chápem, že názov premennej nie je pokrútený, ale prečo nie názov funkcie?

Tu je pôvodný súbor TypeScript:

export class Greeter {
    constructor(greeting: string) {
        this.greeting = greeting;
    }

    greeting: string;
    showGreeting() {
        console.log(this.greeting);
    }
}

const myGreeter = new Greeter("hello, world");
myGreeter.greeting = "howdy";
myGreeter.showGreeting();

A toto je webpack.config vrátane UglifyJS:

const path = require('path');
const webpack = require('webpack');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
    entry: './test.ts',
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    devtool: "source-map",
    resolve: {
        extensions: ['.ts', '.tsx', '.js']
    },
    module: {
        loaders: [
          { test: /\.tsx?$/, loader: 'ts-loader' }
        ]
    },
    plugins: [
        new UglifyJSPlugin({
            mangle: {
                toplevel: true,
                eval: true
            }
        }), 
]
};

A vygenerovaný výstup Javascript obsahuje nasledujúce riadky:

[function (e, t, r) {
            "use strict";
            Object.defineProperty(t, "__esModule", {
                value: !0
            });
            var n = function () {
                function e(e) {
                    this.greeting = e
                }
                return e.prototype.showGreeting = function () {
                    console.log(this.greeting)
                },
                e
            }
            ();
            t.Greeter = n;
            var o = new n("hello, world");
            o.greeting = "howdy",
            o.showGreeting()
        }
    ]);

Odpoveď č. 1

Členovia triedy sú vlastnosti objektu a UglifyJS nezmieša názvy vlastností. Tu je vysvetlenie.

Kompatibilátor Closure od Googlu môže túto prácu zvládnuť. Ale je ťažké ho používať a má obmedzenia.