UglifyJS, TypeScript tarafından üretilen JavaScript'te fonksiyon isimlerini karıştırmaz


Basit bir TypeScript sınıfım var, bunu ES5'e dönüştürüp sonra webpack 2 ile paketliyor ve UglifyJS3 ile küçültüyorum.

UgilfyJS'nin ayrıca showGreeting() fonksiyon adını da değiştirmesini beklerdim (aşağıdaki koda bakın), ancak küçültülmüş js dosyasında değişmemiş. Fonksiyon adlarını küçültmek için ayarlayabileceğim başka bir seçenek var mı yoksa bir şeyleri mi yanlış yapıyorum? Değişken adının değiştirilmediğini anlıyorum, ama fonksiyon adı neden değiştirilmedi?

İşte orijinal TypeScript dosyası:

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

Ve bu, UglifyJS'i içeren webpack.config:

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

Ve oluşturulan çıktı Javascript aşağıdaki satırları içerir:

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

Cevap #1

Sınıf üyeleri nesne özellikleridir ve UglifyJS özellik isimlerini karıştırmaz. İşte bir açıklama.

Google'ın Closure compiler aracı işi yapabilir. Ama kullanımı zor ve sınırlamaları var.