请允许我总结一下截至 2020 年 9 月的工作方法,并提供第三种奖励方法:)
选项 1:
在您的中包含 Ionic 库package.json
正如其他人所提到的,问题是我们将包含整个 IONIC 库以最终只使用图标。就是这样
ng add @ionic/angular
选项 2:将图标库直接用作 Web 组件。通过使用这种方式,<ion-icon>
组件被注册,因此它甚至可以在 vanilla javascript 中使用。这可以通过简单地将以下脚本添加到您的index.html
<script type="module" src="https://unpkg.com/ionicons@5.1.2/dist/ionicons/ionicons.esm.js"></script>
然后您可以<ion-icon>
在模板中使用 WebComponent,例如
<ion-icon name="heart"></ion-icon>
顺便说一句,您还应该添加schemas: [CUSTOM_ELEMENTS_SCHEMA]
到您的app.modules.ts
配置中以避免 Angular 抱怨'ion-icon'
不是已知元素。
奖励(如果您使用 Angular 材质):
材质图标还不错,但我特别喜欢 Ionic 图标,尤其是它们的轮廓变体。它可能看起来有点“hacky”,但有一种方法可以使用 IONIC 图标,mat-icon
这个想法是用来MatIconRegistry
将 IONIC 图标注册为 Angular Material 的一部分。如果您只想使用两个或三个图标,这很容易,事实上,这里有一些关于它的帖子https://riptutorial.com/angular-material2/example/32566/using-svg-icons和这里https:// /dev.to/elasticrash/using-custom-made-svg-icons-through-the-angular-material-library-2pif
然而,对于那些需要所有图标的人来说,这种方法是不可扩展的,但是还有另一种“喂”MatIconRegistry
使用matIconRegistry.addSvgIconSetInNamespace
的方法。文档很少,但基本上我们需要的是一个包含所有 Ionic 图标的 SVG 容器(又名 SVG Sprite)
要求是:
- 安装了 Ionicons 和 package.json 的一部分
npm install
在 every 之后运行并生成精灵的脚本
- 注册 Sprite 所需的代码
MatIconRegistry
- 风格调整
对于第一点,只需运行npm i ionicons
。对于第二个,确保将以下脚本保存到项目的根目录中,我将其命名为,postinstall.js
但您可以自由选择所需的名称。此外,svgstore
通过运行将包添加到您的开发依赖项npm i svgstore -D
// postinstall.js
const fs = require('fs');
const path = require('path');
const svgstore = require('svgstore');
const normalizePath = (folderPath) => path.resolve(path.normalize(folderPath));
const SVG_INPUT_FOLDER = normalizePath('node_modules/ionicons/dist/ionicons/svg');
const SPRITE_OUTPUT_FOLDER = normalizePath('src/assets/images/');
const GENERATED_SPRITE_NAME = path.join(SPRITE_OUTPUT_FOLDER, 'ionic-icons.svg');
const sprite = svgstore();
console.log('Generating SVG Sprite');
fs.readdir(SVG_INPUT_FOLDER, function (err, files) {
if (err) {
return console.log('Ups, there was an error reading the Directory: ' + err);
}
files
.filter(el => /\.svg$/.test(el))
.forEach((file) => {
sprite.add(file.replace('.svg', ''), fs.readFileSync(`${SVG_INPUT_FOLDER}/${file}`, 'utf8').replace(/<title.*>.*?<\/title>/ig, ''));
});
fs.writeFileSync(GENERATED_SPRITE_NAME, sprite);
console.log('Sprite generated successfully');
});
该脚本读取node_modules/ionicons/dist/ionicons/svg
文件夹中包含的所有 SVG,并将精灵保存为src/assets/images/ionic-icons.svg
. 正如我之前所说的,这个脚本应该在每个 中运行npm install
,这可以通过简单地编辑你的package.json
文件并"postinstall": "node postinstall.js"
在scripts
部分中添加来实现。
几乎就在那里:使用MatIconRegistry
. 就我而言,我决定创建一个名为 Material 的模块,然后将其导入app.module.ts
// material.module.ts
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { MatIconModule, MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser';
@NgModule({
declarations: [],
exports: [MatIconModule],
providers: [
{
provide: APP_INITIALIZER,
useFactory: configureMatIconRegistry,
multi: true,
deps: [MatIconRegistry, DomSanitizer]
}
]
})
export class MaterialModule {}
export function configureMatIconRegistry(
matIconRegistry: MatIconRegistry,
domSanitizer: DomSanitizer
): () => Promise<void> {
return (): Promise<any> => {
matIconRegistry.addSvgIconSetInNamespace(
'ionicon',
domSanitizer.bypassSecurityTrustResourceUrl('assets/images/ionic-icons.svg')
);
return Promise.resolve();
};
}
相关部分是,configureMatIconRegistry
但我认为是不言自明的。
最后但同样重要的是:样式我们的 mat-icon 可以像这样使用:
<mat-icon svgIcon="ionicon:heart-outline"></mat-icon>
但是,由于这些图标的创建方式(我指的是原始 SVG),我们需要进行一些样式调整。只需确保将其放在您的全局样式中以针对mat-icons
整个应用程序进行定位,不要担心“常规”材质垫图标将保持不变。
// styles.scss
.mat-icon {
&[data-mat-icon-namespace="ionicon"] {
display: inline-block;
width: 24px;
height: 24px;
font-size: 24px;
line-height: 24px;
contain: strict;
fill: currentcolor;
box-sizing: content-box !important;
svg {
stroke: currentcolor;
.ionicon {
stroke: currentColor;
}
.ionicon-fill-none {
fill: none;
}
.ionicon-stroke-width {
stroke-width: 32px;
}
}
.ionicon,
svg {
display: block;
height: 100%;
width: 100%;
}
}
}
差不多就是这样!现在,npm install
您将拥有所有准备好与<mat-icon>