ecmascript 6 - Hvordan bruger man tree-shaking for klasser med Typescript og Webpack?


Jeg har en klasse kaldet Car i filen car.ts og to andre klasser for motorerne i en anden fil engine.ts.

bil.ts

import { V8Engine, Engine } from './engine';

class SportsCar {
  constructor(private engine: Engine) {}

  toString() {
    return this.engine.toString() + ' Sports Car';
  }
}

engine.ts

export interface Engine {
  toString(): string;
}

export class V6Engine implements Engine {
  toString() {
    return 'V6';
  }
}

export class V8Engine implements Engine {
  toString() {
    return 'V8';
  }
}

export function getVersion() {
  return '1.0';
}

console.log(new SportsCar(new V8Engine()).toString());

Filen car.ts importerer kun klassen V8Engine, men klassen V6Engine vises også i den minificerede fil. Den ubrugte funktion, jeg eksporterer fra engine.ts, bliver fjernet.

Når man kører Webpack uden UglifyJS-plugin, bliver V6Engine-klassen markeret med /* unused harmony export V6Engine */ som forventet. Men efter at have tilføjet pluginet får jeg denne advarselsbesked fra UglifyJS:

WARNING in car.prod.bundle.js from UglifyJs
Dropping unused function getVersion [car.prod.bundle.js:89,9]
Side effects in initialization of unused variable V6Engine [car.prod.bundle.js:73,132]

Jeg har oprettet et repository, hvor problemet kan reproduceres. Kloning, installation og kørsel af npm run webpack og npm run webpack-prod reproducerer problemet.

Ved ikke, om dette er en fejl med Typescript-transpileringen, UglifyJS eller orkestreringen af disse værktøjer. Jeg bruger Typescript 2.0-dev med es2015-moduler og Webpack 2.1.0-beta.21.

Svar #1

Nøglen er at outputte ES2015-moduler og kode og derefter køre Babili-minifieren på det. Den laver tree-shaking korrekt.