Mit der Angular Cli lässt sich mit folgendem Befehl sehr einfach ein neues Angular Projekt erstellen in dem die Component Library entwickelt wird:
ng new ng-my-lib
Zu Testzwecken wird eine einfache Angular Component erstellt.
Hierfür wird der Ordner my-header im Rootverzeichnis erstellt (der Ordner kann aber auch nach belieben positioniert werden).
Nun wird die Datei my-header.component.ts mit folgendem Inhalt erstellt:
import { Component } from "@angular/core";
@Component({
selector: 'my-header',
template: `<h1 [ngClass]="{'custom-h1':true}"><ng-content></ng-content></h1>`
})
export class MyHeaderComponent { }
Diese wird anschließend im Module my-header.module.ts importiert und deklariert.
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MyHeaderComponent } from './my-header.component';
@NgModule({
imports: [CommonModule],
declarations: [MyHeaderComponent],
exports: [MyHeaderComponent]
})
export class MyHeaderModule { }
Dies dient nur zu Demonstationszwecken und als Nachschlag wie ich zurzeit „assets“ für Component Libraries behandele.
Dazu wird im Lib Order my-header der Ordner assets und die Datei styles.scss mit folgendem Inhalt erstellt:
.custom-h1 {
color: red;
}
Dies soll als Indikator dienen, dass später der Import dieser Styles auch funktioniert.
Als nächstes wird das Package ng-packagr installiert, welches das Erstellen der Angular Component Library vereinfacht:
npm install ng-packagr --save-dev
Das Package ng-packagr benötigt als Einstieg eine Datei, die das Module mit der Component exportiert.
Diese wird im Ordner der Library erstellt (hier in my-header).
Als Pattern setzt sich hierbei immer mehr die Benennung public_api.ts durch:
export * from './my-header.module'
Zur Konfiguration von ng-packagr wird im Root-Verzeichnis der Angular Applikation die Datei ng-package.json mit folgendem Inhalt angelegt:
{
"$schema": "./node_modules/ng-packagr/ng-package.schema.json",
"lib": {
"entryFile": "my-header/public_api.ts"
},
"dest": "dist-ng-my-lib",
"whitelistedNonPeerDependencies": [
"angular",
"core-js",
"rxjs",
"zone.js"
]
}
Nun wird die scripts Section der package.json so ergänzt, dass sich mittels packagr Command das Builden der Angular Component Library starten lässt.
"scripts" : {
...
"packagr": "ng-packagr -p ng-package.json"
...
}
Nun kann die Angular Component Library über folgenden Befehl in einem Terminal (Rootverzeichnis) gestartet werden:
npm run packagr
Dies erstellt die Angular Component Library im Rootverzeichnis unter dist-ng-my-lib (siehe dest in ng-package.json).
Das automatische Integrieren von Styles und Assets war zur Zeit der Erfassung dieses Tutorials noch nicht integriert.
Abhilfe wird hier mittels copy, xcopy oder auch mit dem npm package copyfiles geschaffen.
npm install copyfiles --save-dev
Mittels npx Befehl lassen sich lokal installierte Module ausführen.
Der folgende Befehl kopiert mittels copyfiles alle Inhalte aus assets und fügt sie in das dest-Verzeichnis der gebuildeten Component Library ein.
"scripts" : {
...
"copy-files": "npx copyfiles -f './my-header/assets/*.*' './dist-ng-my-lib/assets'"
...
}
Hierfür wird das zuvor erstellte Script ausgeführt:
npm run copy-files
Die erstellte Angular Component Library lässt sich nun einfach lokal in andere Projekte installieren.
Hierfür wechselt man mittels Terminal unter das erstellte dest Verzeichnis und führt folgenden Befehl aus:
npm pack
Dies erstellt eine „ng-my-lib-0.0.0.tgz“ Datei.
Die erstellte .tgz sollte sich mittels 7.zip oder anderen Archiv-Manager öffnen lassen. In dieser sollte ebenfalls der Ordner assets enthalten sein.
Die .tgz lässt sich nun in einem anderem Projekt wie folgt installieren:
npm install ../PFAD-ZUR-LIB/dist-ng-my-lib/ng-my-lib-0.0.0.tgz
Nach der erfolgreichen Installation lässt sich das Modul MyHeaderModule in AppModule importieren.
Hierbei muss der Name aus der package.json der Component Library gewählt werden – hier „my-header“.
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { MyHeaderModule } from 'my-header';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, HeaderModule],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Die Component lässt sich anschließend wie folgt benutzen:
<my-header>Some Header</my-header>
Abschließend lässt sich das Styling wie folgt in einer styles.scss Datei des neuen Projektes integrieren:
@import "~ng-my-lib/assets/styles";
Nach einem Reload sollte die Schrift nun in „rot“ eingefärbt werden.
Mittels ng-packagr ist das Erstellen einer einfachen Angular Component Library viel einfacher.
Ersteller der Webseite MuchaDev. Selbstständiger IT Constultant für Frontend Technologien.