Weboldal keresés

ecmascript 6 - Hogyan lehet osztályokhoz tree-shakinget használni Typescript és Webpack segítségével?


Van egy Car nevű osztályom a car.ts fájlban, és két másik osztály a motorokhoz egy másik fájlban, az engine.ts-ben.

autó.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());

A car.ts fájl csak a V8Engine osztályt importálja, de a V6Engine osztály még a minifikált fájlban is megjelenik. Az engine.ts-ből exportált, nem használt függvényt eltávolítják.

Amikor a Webpacket UglifyJS plugin nélkül futtatjuk, a V6Engine osztály a várt módon a /* unused harmony export V6Engine */ jelzéssel van megjelölve. De a plugin hozzáadása után ezt a figyelmeztető üzenetet kapom az UglifyJS-től:

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]

Létrehoztam egy tárolót, ahol a probléma reprodukálható. A npm run webpack és a npm run webpack-prod parancsok klónozása, telepítése és futtatása reprodukálja a problémát.

Nem tudom, hogy ez egy hiba a Typescript átalakításában, az UglifyJS-ben vagy ezeknek az eszközöknek az összehangolásában. Typescript 2.0-dev verziót használok es2015 modulokkal és Webpack 2.1.0-beta.21 verzióval.

Válasz #1

A kulcs az, hogy ES2015 modulokat és kódot állítsunk elő, majd futtassuk rajta a Babili minifájlt. Ez végzi el helyesen a tree-shakinget.