angular - cli - ¿Cómo usar tree shaking en Webpack?
webpack angular 6 (3)
El cambio a angular-cli actualmente parece ser la manera de continuar con las aplicaciones angulares. Está basado en el paquete web y ahora incluso es compatible con las capacidades de agitación de los árboles. Solo usa ng build --prod
Acabo de actualizar a webpack 2.1.0-beta.15 con una aplicación Angular 2 (versión rc.2) (con Typescript), pero me preguntaba cómo usar la función de agitación de árbol. Leí que debería funcionar "de fábrica", pero todavía tengo un paquete de 1.7Mb para una aplicación muy simple, así que probablemente estoy haciendo algo mal.
Esto es lo que tengo hasta ahora:
tsconfig.json
{
"compilerOptions": {
"target": "es5",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules",
"typings/main",
"typings/main.d.ts"
]
}
paquete.json
{
"name": "angular2-quickstart",
"version": "1.0.0",
"scripts": {
"build": "webpack --progress",
"build:prod": "webpack -p --progress --optimize-minimize",
"postinstall": "typings install",
"serve": "webpack-dev-server --inline --progress --output-public-path=/dist/"
},
"license": "ISC",
"dependencies": {
"@angular/common": "2.0.0-rc.2",
"@angular/compiler": "2.0.0-rc.2",
"@angular/core": "2.0.0-rc.2",
"@angular/forms": "0.1.0",
"@angular/http": "2.0.0-rc.2",
"@angular/platform-browser": "2.0.0-rc.2",
"@angular/platform-browser-dynamic": "2.0.0-rc.2",
"@angular/router": "2.0.0-rc.2",
"@angular/router-deprecated": "2.0.0-rc.2",
"@angular/upgrade": "2.0.0-rc.2",
"angular-pipes": "1.4.0",
"bootstrap": "3.3.6",
"core-js": "2.4.0",
"file-loader": "0.9.0",
"jquery": "2.2.3",
"lodash": "4.13.1",
"reflect-metadata": "0.1.3",
"rxjs": "5.0.0-beta.6",
"script-loader": "0.7.0",
"style-loader": "0.13.1",
"url-loader": "0.5.7",
"zone.js": "0.6.12"
},
"devDependencies": {
"concurrently": "^2.0.0",
"css-loader": "0.23.1",
"html-loader": "0.4.3",
"json-loader": "^0.5.4",
"raw-loader": "0.5.1",
"ts-loader": "0.8.2",
"typescript": "1.8.10",
"typings": "1.0.4",
"webpack": "^2.1.0-beta.15",
"webpack-dev-server": "^2.1.0-beta",
}
}
webpack.config.js
var webpack = require(''webpack'');
var PROD = JSON.parse(process.env.PROD_ENV || ''0'');
module.exports = {
entry: ''./app/main.ts'',
output: {
path: ''./dist'',
filename: ''app.bundle.js''
},
module: {
loaders: [
{ test: //.json$/, loader: ''json'', include: [/node_modules/] },
{ test: //.ts$/, loader: ''ts'' },
{ test: //.html$/, loader: ''html'' },
{ test: //.css$/, loader: ''style!css'' },
{ test: //.(png|woff|woff2|eot|ttf|svg)$/, loader: ''url-loader?limit=100000'' }
]
},
resolve: {
extensions: ['''', ''.js'', ''.ts'', ''.css'']
},
''htmlLoader'': {
caseSensitive: true
},
plugins: PROD ? [
new webpack.optimize.UglifyJsPlugin({
compress: { warnings: false }
})
] : []
}
Estoy usando sentencias de importación bastante estándar como import {FORM_DIRECTIVES,REACTIVE_FORM_DIRECTIVES} from ''@angular/forms''
e intento importar solo lo que necesito ( import ''rxjs/add/operator/map'';
) y ejecutar la compilación con npm run build:prod
con la variable de entorno PROD_ENV = 1.
Tal vez algo como jquery o lodash está causando problemas ( import * as $ from ''jquery''
o import {orderBy} from ''lodash''
), pero creo que ambos son relativamente pequeños. Según el visualizador de webpack , Jquery y Lodash representan el 6.2% y el 12% del tamaño del paquete, respectivamente. Angular usa el 49% del tamaño del paquete.
¿Qué me estoy perdiendo?
Para el borrado de árboles, debes usar el mecanografiado 2
npm i typescript@next --save-dev
que soporta
tsconfig.json
{
"compilerOptions": {
"module": "es6",
"target": "es5"
}
}
Esto se debe a que los módulos es6 son estadísticamente analizables y Webpack puede determinar cuáles de sus dependencias se usan y cuáles no.
Tree Shaking no se envió con Webpack 2 y aún está bloqueado sin un camino claro de acuerdo con los comentarios del equipo Core en el tema. Me temo que puedes estar usando la ropa nueva del Emperador .