6

I am building an angular 4 application with angular-cli version 1.3.2 so far so good. I read in documentation that we can use global style with lazy loading at https://github.com/angular/angular-cli/wiki/stories-global-styles.

Now when I run the command

ng build --prod -vc -nc --build-optimizer

it generates following output for bootstrap

chunk {bootstrapBundle} bootstrapBundle.cf320d25069acd157990.bundle.css (bootstrapBundle) 96.9 kB {inline} [initial]

As per my understanding this css should be applied to the website but, when I see the website it doesn't have any bootstrap css applied on it.

Now, how can I use bootstrapBundle or bootstrap chunk in the site ?

Here is my angular-cli.json style configuration

"styles": [
      "styles.scss"
       {
         "input": "./assets/smartadmin/bootstrap.scss",
         "lazy": true,
         "output":"bootstrapBundle"
       },
    ],

Please help.

Thanks.

2
  • 1
    Have a look in to Lazy load application theme styles with Angular CLI I think it should answer your question Commented Sep 18, 2017 at 23:56
  • @Kuncevic thanks for the link. I had also solved it in same way. I will add my answer. Commented Sep 19, 2017 at 6:33

1 Answer 1

6

I have found a solution to my problem with help of @Kuncevic who pointed me to this

Lazy load application theme styles with Angular CLI

Now until this point the css files will be generated and if we add them to index.html via

<link href='yourstyle.bundle.css' rel='stylesheet'/>

then it will be eagerly loaded on first request.

But the Problem Is, I really want to lazily load them and apply them over my website


Solution.

  1. Extracted css as mentioned in the article
  2. Added style references to app.component.html since this will be a root component therefore I added it in this.

app.component.html

<div *ngIf="stylesLoaded">
  <link rel="stylesheet" href="/bootstrap.cf320d25069acd157990.bundle.css">
</div>
  1. Added stylesLoaded property to app.component.ts
  2. Implemented AfterViewChecked in app.component.ts. For details Check Life cycle Hooks

app.component.ts

export class AppComponent implements AfterViewChecked {
  stylesLoaded: boolean = false;
  
  constructor() {}

  ngAfterViewChecked() {
    this.stylesLoaded = true;
  }
}

Now once your view is rendered the AfterViewChecked will be fired and makes the stylesLoaded to true this will enable the styles link in app.component.html and start loading them.

Hence lazy loaded :)

In similar way you can load JS module(s).

Hope that will help someone. Happy coding

Sign up to request clarification or add additional context in comments.

2 Comments

How could it works since you add the css bundle with the hash as a link in your index file ? Each time the app build, the hash change, then your link will be false and the bundle fetch will be the old one.
Extracted CSS bundles are no longer hashed in newer versions of Angular (definitely v10).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.