What's new in Angular CLI 8.1?
Angular CLI 8.1.0 is out!✨
Of course this brings us the support of the brand new Angular 8.1 version, but also a lot of new features.
If you want to upgrade to 8.1.0 without pain (or to any other version, by the way), I have created a Github project to help: angular-cli-diff. Choose the version you’re currently using (7.2.1 for example), and the target version (8.1.0 for example), and it gives you a diff of all files created by the CLI: angular-cli-diff/compare/7.2.1…8.1.0.
It can be a great help along the official ng update @angular/core @angular/cli
command.
You have no excuse for staying behind anymore!
Let’s see what we’ve got in this release, and start with new options for several commands.
Fun with flags
ng generate component –skip-selector
It is now possible to generate a component without a selector,
by using the --skip-selector
option.
This can be handy when you are generating components
that will only be instantiated dynamically,
for example by the router.
In that case, the component doesn’t really need a selector,
so this option allows you to generate a component skeleton without one.
ng generate module –route
The module
schematics can now take a --route
option to indicate
that you want to generate a lazy-loaded module.
For example:
ng generate module admin --module users --route admin
will generate a new module AdminModule
in its own directory,
as it already previously did.
But it will now also automatically add a route (here admin
),
to lazy-load this module in the (already existing in my example) users.module.ts
:
export const USERS_ROUTES: Routes = [
...
// automatically added by the schematic
{ path: 'admin', loadChildren: () => import('../admin/admin.module').then(m => m.AdminModule) }
];
@NgModule({
imports: [CommonModule, ..., RouterModule.forChild(USERS_ROUTES)],
declarations: [...]
})
export class UsersModule {}
Note that it also creates a new component AdminComponent
,
already registered in the route configuration of the new AdminModule
:
const routes: Routes = [
{ path: '', component: AdminComponent }
];
@NgModule({
declarations: [AdminComponent],
imports: [CommonModule, RouterModule.forChild(routes)]
})
export class AdminModule { }
ng test –include
You can now specify a file or a directory when running ng test
thanks to the new --include
flag:
# all specs in src/app/admin/*
ng test --include app/admin
# just src/app/user.service.spec.ts
ng test --include app/user.service.spec.ts
You could already focus a test suite by changing the describe
function to fdescribe
or the it
function to fit
,
but ng test
was still rebuilding all your tests.
By specifying --include
, only the provided files are rebuilt,
so it’s faster and doesn’t care if you have compilation errors in other files 🌈.
And of course, you won’t forget to replace fdescribe
by describe
before committing anymore.
ng doc –version
ng doc
is not very well-known but it is quite handy,
as you can search the official documentation directly from your command line.
For example ng doc component
opens your browser to the search results for component
on angular.io.
The command now allows to specify a specific version to search,
for example ng doc --version 6 component
.
It is also possible to use ng doc --version next
to search the docs of the next Angular version.
And if you don’t specify a version,
the command now searches the docs for the Angular version you are using in your project
(whereas it was looking in the docs of the most recent Angular version until now).
I’m really happy about this tiny new feature,
because it was the first open-source contribution of a developer
I mentored during the HackCommitPush event in Paris! 🚀
ng build –cross-origin
You can now define the crossorigin attribute setting of elements that provide CORS support. 3 values are currently possible, very similar to what the official specification allows:
none
which doesn’t do anything and is the default. CORS will not be used at all.anonymous
which automatically addscrossorigin="anonymous"
to your scripts. There will be no exchange of user credentials via cookies, client-side SSL certificates or HTTP authentication, unless it is in the same origin. That still checks for the origin though.use-credentials
which automatically addscrossorigin="use-credentials"
to your scripts, meaning that user credentials will be needed even if the file is from the same origin.
ng upgrade –allow-dirty
ng upgrade
has now a new --allow-dirty
option
to allow updating when the repository contains modified or untracked files.
Previously, trying to run ng upgrade
in a project with unsaved modifications
was always resulting in an error.
AoT by default for Ivy
The framework team has been working hard at squashing bugs in Ivy,
and also improved the build mechanisms,
resulting in faster AoT builds.
The CLI team now considers that the performances with AoT and Ivy enabled
are good enough to always serve your application with AoT enabled.
If you generate a new project with --enable-ivy
,
you’ll see that the aot
option in angular.json
is now true
by default.
In their experiments, the CLI team found that the AoT builds with Ivy enabled
were much faster than with View Engine,
and pretty much on par with JiT builds.
I gave it a try on one of our projects,
and here are the results of how much time rebuilds are taking after a modification:
Ivy disabled, JiT mode: 190-250ms (initial 11.5s)
Ivy disabled, AoT mode: 630-1700ms (initial 11.8s)
Ivy enabled, AoT mode: 210-270ms (initial 13.0s)
So I have a slightly slower initial compilation, but then the AoT rebuilds are roughly as fast as the JiT rebuilds without Ivy✨!
TypeScript configuration changes
A side-note about the TypeScript configuration to conclude.
If you check out the
differences between version 8.0 and 8.1,
you’ll notice that the tsconfig.json
file lost the emitDecoratorMetadata
option.
This option was only needed for JiT development
for the dependency injection (you can read an old blog post of mine about that).
As it was only useful for that use-case,
the CLI is now handling it itself when building your application in dev mode.
So you can now remove this option from your project!
The default configuration now includes downlevelIteration
,
a TS compiler option to enable iterating over iterators.
Check out this article
if you want to have a better understanding of this option.
You will also note that two angularCompilerOptions
are now enabled by default:
"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true
}
The first one is one of my favorites,
as it allows a deeper check of your templates.
I explained this option
when it was introduced in Angular 5.0.
strictInjectionParameters
errors when an injection type can’t be determined.
As you can see, this 8.1 release was packed with new features!
All our materials (ebook, online training and training) are up-to-date with these changes if you want to learn more!