UglifyJS ändrar inte funktionsnamn i TypeScript-genererad JavaScript


Jag har en enkel TypeScript-klass, som jag transpilerar till ES5 och sedan paketerar med webpack 2 och minimerar med UglifyJS3.

Jag skulle förvänta mig att UgilfyJS också skulle ändra funktionsnamnet showGreeting() (se koden nedan), men i den minifierade js-filen är det inte så. Finns det någon annan inställning jag kan göra för att minifiera funktionsnamnen eller gör jag något fel? Jag förstår att variabelnamnet inte ändras, men varför inte funktionsnamnet?

Här är den ursprungliga TypeScript-filen:

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();

Och detta är webpack.config inklusive 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
            }
        }), 
]
};

Och den genererade utdata Javascript innehåller följande rader:

[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()
        }
    ]);

Svar #1

Klassmedlemmar är objektets egenskaper, och UglifyJS ändrar inte egenskapsnamn. Här är en förklaring.

Google Closure Compiler kan göra jobbet. Men det är svårt att använda och har begränsningar.