自 ng-zorro-antd 1.7.x 之後圖標發生破壞性變動,雖然帶了諸多優點,同時也帶來幾個劣勢:css
st
組件的 format
參數沒法直接指定圖標ng-alain 默認使用靜態加載的作法,畢竟後端使用圖標相對於比較有限,即便將 svg 都打包進腳本相比較以前整個 styles 體積上是全部減小,但比較並很少。html
而針對以上問題,ng-alain 提供幾種方案。node
儘量從項目中分析並生成靜態 Icon,插件會自動在 src
目錄下生成兩個文件:git
src/style-icons.ts
自定義部分沒法解析(例如:遠程菜單圖標)src/style-icons-auto.ts
命令自動生成文件自動排除 ng-zorro-antd 和 @delon 已經加載的圖標。
ng g ng-alain:plugin icon
同時,須要手動在 startup.service.ts
中導入:github
import { ICONS_AUTO } from '../../../style-icons-auto'; import { ICONS } from '../../../style-icons'; @Injectable() export class StartupService { constructor(iconSrv: NzIconService) { iconSrv.addIcon(...ICONS_AUTO, ...ICONS); } }
有效語法json
<i class="anticon anticon-user"></i> <i class="anticon anticon-question-circle-o"></i> <i class="anticon anticon-spin anticon-loading"></i> <i nz-icon class="anticon anticon-user"></i> <i nz-icon type="align-{{type ? 'left' : 'right'}}"></i> <i nz-icon [type]="type ? 'menu-fold' : 'menu-unfold'" [theme]="theme ? 'outline' : 'fill'"></i> <i nz-icon [type]="type ? 'fullscreen' : 'fullscreen-exit'"></i> <i nz-icon type="{{ type ? 'arrow-left' : 'arrow-right' }}"></i> <i nz-icon type="filter" theme="outline"></i> <nz-input-group [nzAddOnBeforeIcon]="focus ? 'anticon anticon-arrow-down' : 'anticon anticon-search'"></nz-input-group>
動態加載,這是爲了減小包體積而提供的方式。當 NG-ZORRO 檢測用戶想要渲染的圖標尚未靜態引入時,會發起 HTTP 請求動態引入。你只須要配置 angular.json
文件:後端
{ "assets": [ { "glob": "**/*", "input": "./node_modules/@ant-design/icons-angular/src/inline-svg/", "output": "/assets/" } ] }
無論是靜態或動態加載,依然沒法解決原始方法 class="anticon anticon-"
的便利性,畢竟字符串就是字符串並不是 Angular 模板沒法被解析,而針對這個問題,提供兩種解決辦法。bash
事實上全部 Antd 圖標均可以在 iconfont 找獲得,能夠點選本身須要的圖標並生成相應的 css 文件或 cdn,最後在項目中能夠直接使用 1.7.0
以前的寫法。antd
注意: 在項目編輯里加上
anticon anticon-
前綴才能同以前的類名保持一致。
// angular.json "styles": [ "src/iconfont.css" ],
若是非cnd還須要將相應的 icon 圖標文件複製到 assets
目錄下,同時修改 iconfont.css
中 @font-face
對應的 url 路徑。app
動態加載的另外一種方式是使用 @angular/elements,只須要 nz-icon
指令從新封裝成組件。
import { Component, Input } from '@angular/core'; @Component({ selector: 'nz-icon', template: `<i nz-icon [type]="type"></i>`, }) export class IconComponent { @Input() type: string; }
同時在根模塊裏註冊它。
import { createCustomElement } from '@angular/elements'; @NgModule({ declarations: [], entryComponents: [] }) export class AppModule { constructor(injector: Injector) { customElements.define('nz-icon', createCustomElement(IconComponent, { injector })); } }
最後。
@Component({ selector: 'app-demo', template: ` <div [innerHTML]="value"></div> `, }) export class DemoComponent { constructor(private san: DomSanitizer) { } value = this.san.bypassSecurityTrustHtml( `icon: <nz-icon type="bell"></nz-icon>`, ); }
本文只是針對這一次 ng-zorro-antd 圖標上的變動作一個總結,就我我的而言仍是比較推薦靜態加載的方式,這無關乎包體大小的問題,而是更加明確我須要什麼因此我應加載什麼。