In a previous post I spoke about the configurations to manage bundles in angular 2 with Systemjs.
For this purphose, the latest versions of Angular CLI uses webpack and we can use it as module bundler in the new angular 2/4 applications.
The reason of this choice is that webpack has a lot of plugins that they help us with a refined management of the modules bundling.
Entries
When we configure webpack, the first thing that we need to do is define the entries of the bundles.
Every bundle has the main entry point, that is the module where webpack start to build the bundle hierarchy.
I like to build two different bundle, the first one for the vendors libraries and the second one for the application modules.
The main entry for the vendors is a typescript class that looks like this:
import '@angular/platform-browser'; import '@angular/platform-browser-dynamic'; import '@angular/core'; import '@angular/common'; import '@angular/http'; import '@angular/router'; import '@angular/animations'; import 'jquery'; import 'lodash'; import 'ng2-toastr'; import 'ng2-translate'; import 'reflect-metadata'; import 'zone.js'; import 'rxjs';
The second one is the main module for the app:
export { PostModule } from "./post.module";
Webpack is able to load these modules and build the dependencies of the childs descendans, and process them.
Loaders
Loaders are specific webpack tools that are able to process specific file types and to produce the right bundle outputs.
For example, in order to make webpack to be able to resolve the angular html templates or the router modules, or more simply to compile typescript files, specific loaders are needed.
Below you can see a bunch of loaders used in an Angular 2 application:
module: { rules: [ { test: /\.ts$/, loaders: [ { loader: 'awesome-typescript-loader', options: { configFileName: 'tsconfig.json' } }, 'angular2-template-loader', 'angular2-router-loader' ] }, { test: /\.html$/, loader: 'html-loader' }, { test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/, loader: 'file-loader?name=images/[name].[hash].[ext]' }, { test: /\.css$/, exclude: helpers.root('src', 'app'), loader: ExtractTextPlugin.extract({ fallbackLoader: 'style-loader', loader: 'css-loader?sourceMap' }) }, { test: /\.css$/, include: helpers.root('src', 'app'), loader: 'raw-loader' } ] }
Plugins
These are utilities that we can help us in some additional tasks of the webpack script.
For example, we would like to share a common chunk and we would want that the chunk, if used from different module of the application, is not repeated in the bundle but is present only once.
CommonsChunkPlugin deal with this work:
plugins: [ ..... new webpack.optimize.CommonsChunkPlugin({ name: ['vendor'] }), ..... ]
Another requirement could be write the script references in the index.html file of the application.
HtmlWebpackPlugin can help us in this work:
plugins: [ ..... new HtmlWebpackPlugin({ filename: 'index.html', template: 'src/index.html', chunks: ['app', 'vendor'] }), new HtmlWebpackPlugin({ filename: 'index.admin.html', template: 'src/index.admin.html', chunks: ['app.admin', 'vendor'] }), ..... ]
Output
In this section we can configure the file results of the webpack process.
We have to produce these files in the public folder of the application; the output section is look like this:
output: { path: helpers.root('wwwroot'), filename: 'js/[name].js', chunkFilename: 'js/[id].chunk.js' }
You can find the source code here.
Leave a Reply