components: Error when retrieving icon from registry in server side rendering
Bug, feature request, or proposal:
When we register some icons in MatIconRegistry
and access to them in SSR
, we have some errors and icons aren’t displayed.
What is the expected behavior?
Display icons and not have error in the console
What is the current behavior?
Icon aren’t displayed and we have error in the console
What are the steps to reproduce?
Create a component and register an icon in MatIconRegistry
:
import {Component, OnInit} from '@angular/core';
import {MatIconRegistry} from '@angular/material';
import {DomSanitizer} from '@angular/platform-browser';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
constructor(private _matIconRegistry: MatIconRegistry, private _domSanitizer: DomSanitizer) {
this._matIconRegistry.addSvgIcon('loader', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/Icons/loader-default.svg'));
}
ngOnInit() {
}
}
@NgModule({
declarations: [
AppComponent
],
imports: [
// Make AppModule compatible with Universal
BrowserModule.withServerTransition({ appId: 'universal-app' }),
MatIconModule,
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {
}
Access to it in server side rendering
:
<mat-icon svgIcon="loader"></mat-icon>
In the console you’ll have this message:
Error retrieving icon:
ERROR [Error]
What is the use-case or motivation for changing an existing behavior?
MatIconRegistry
should work in SSR
Which versions of Angular, Material, OS, TypeScript, browsers are affected?
"dependencies": {
"@angular/animations": "^5.2.2",
"@angular/cdk": "^5.1.1",
"@angular/common": "^5.2.2",
"@angular/compiler": "^5.2.2",
"@angular/core": "^5.2.2",
"@angular/forms": "^5.2.2",
"@angular/http": "^5.2.2",
"@angular/material": "^5.1.1",
"@angular/platform-browser": "^5.2.2",
"@angular/platform-browser-dynamic": "^5.2.2",
"@angular/platform-server": "^5.2.2",
"@angular/router": "^5.2.2",
"@hapiness/config": "^1.1.1",
"@hapiness/core": "^1.3.0",
"@hapiness/ng-universal": "^5.2.2",
"@hapiness/ng-universal-transfer-http": "^5.2.2",
"@nguniversal/module-map-ngfactory-loader": "^5.0.0-beta.5",
"core-js": "^2.5.1",
"rxjs": "^5.5.6",
"zone.js": "^0.8.20"
},
"devDependencies": {
"@angular/cli": "^1.6.6",
"@angular/compiler-cli": "^5.2.2",
"@angular/language-service": "^5.2.2",
"@types/jasmine": "~2.8.3",
"@types/jasminewd2": "~2.0.2",
"@types/node": "^9.4.0",
"codelyzer": "^4.1.0",
"jasmine-core": "~2.8.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~2.0.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "^1.2.1",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.1.2",
"ts-loader": "^3.3.1",
"ts-node": "^4.0.1",
"tslint": "^5.9.1",
"typescript": "^2.6.2"
}
About this issue
- Original URL
- State: closed
- Created 6 years ago
- Reactions: 23
- Comments: 24 (1 by maintainers)
For SSR, full URL is needed in order to retrieve svg icon. When encountered to this issue, I fixed it with something like this:
Facing same issue, with version 10.0.2 of @nguniversal/express-engine. @milosbr solution works indeed, however reading angular’s doc about absolute urls, we shouldn’t have to do this, unless I’m missing something…
If you don’t need icons to be actually rendered by server you can just replace icons with epmty SVG
In this case all icons will be empty in server response but frontend will load them after loading
I go this error instead
error retrieving icon: <svg> tag not found
and absolute path doesn’t solve this issue. I have searched through the internet and could barely find any solution or workaround for it, please help give me any hint if you can, thanks a lotI ran into this issue as well and couldn’t solve my problem until I realized that I had an interceptor that was changing all outbound request headers to application/json. I fixed it by adding some extra logic to see if I was requesting a resource from the assets folder to fix it. If any of you are still having this issue you might look at that.
Just follow this receipt to use absolute paths on server side: https://angular.io/guide/universal#using-absolute-urls-for-server-requests
Assets not properly configured in
angular.json
. Moveassets
directory tosrc
then updateangular.json
and set"assets": ["src/assets"]
Make sure of the following:
angular-in-memory-web-api
make sure to setpassThruUnknownUrl: true
angular.json
)Got simular issue, but the icon appers suddenly after a few refreshes.