Angular 17+ 高階教程 – Library

兴杰發表於2024-04-13

前言

當你需要管理超過一個專案時,你就需要知道怎麼使用 Angular Library。

你可以把多個專案共享的元件放到這個 Library 了,就像 Angular Material 那樣。

參考

Sandro Roth – Building an Angular Library with multiple entry points (主要參考)

Docs – Creating libraries

Docs – Copy assets

Docs – Embed assets in CSS

Angualr Library の Get Started 版

我們先來一個 Get Started 版本,之後再補一個實戰班。

提醒:我這裡給的例子,Library 和 Application 會在同一個專案裡 (所謂的 Local Library)。如果要不同專案,那就需要把 Library 釋出到 npm 才行。在本篇的結尾會講解如何 publish to npm。

Create project

ng new play-library --create-application=false

在建立專案的同時,不要建立 Application 先,因為有 Library folder 結構會不一樣。

目前 folder 結構長這樣

angular.json 長這樣

空空如也。

Create Application

接著建立 Application

ng g app my-app --routing=false --ssr=false --style=scss --skip-tests

folder 多了 projects/my-app

angular.json 也多了 projects.my-app

Create Library

接著建立 Library

ng g lib stooges --prefix=stg

我的 Library 名字叫 stooges

在 projects folder 裡面多了一個 stooges library

它已經替我們做好了一個 demo component 和 service。

angular.json 也多了一個 stooges library

Build library

要使用 Library ,我們需要先 build 它。

ng build stooges --watch

build 也是可以 watch 的哦,每當我們修改,它就會 re-build (我不清楚是 re-build 修改的部分還是全部🤷‍♂️)

build 好後它會多一個 dist/stooges folder

Use library in application

app.component.ts

import { Component } from '@angular/core';
import { StoogesComponent } from 'stooges'; // 1. import component from library

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [StoogesComponent],              // 2. import StoogesComponent
  templateUrl: './app.component.html',
  styleUrl: './app.component.scss'
})
export class AppComponent {}

app.component.html

<stg-stooges />

run

ng serve --open

效果

The connection between the library and the application

你可能會好奇,app.component.ts 為什麼可以 import 到 'stooges'

import { StoogesComponent } from 'stooges';

stooges library 在 dist 裡,並不在 node_modules 裡丫🤔。

它的秘密在 tsconfig.json 裡

這裡頭做了一個 connection,所以 Application 就和 Library 連上了。

總結

Get Started 只是讓大家感受以下 Angular Library 長啥樣,上面提到的幾個 folder 和 file 都是和 Library 比較有關係的,如果以後遇到什麼疑難雜症可以多往這幾個地方調查。

好,我們進入下一 part -- Angualr Library 實戰版。

Angualr Library の 實戰版

我們延續上面 Get Started 版本,把它改成實戰版本。

Multiple export path

目前有一個問題 -- Library 只有一個出入口

import { StoogesComponent } from 'stooges';

假設我有 1000 個元件,由於它們都是透過 import .. from 'stooges' 匯入,那它們就絕對不可以撞名字。

這對命名要求很高啊。

假如可以這樣...

import { StgDialogComponent, StgSameNameComponent as StgDialogSameNameComponent } from 'stooges/dialog';
import { StgCardComponent, StgSameNameComponent as StgCardSameNameComponent } from 'stooges/card';

stooges/table 和 stooges/select 都是 stooges library,但 stooges library 裡面又細分成了 2 個 namespace 'table' 和 'select'。

我們可以以 2 個不同的 path 做 import,這樣就大大減少了撞名的可能性,即使撞了名字也可以透過 as alias 換名。

restructure folder

首先,把 src/lib/ folder 給刪了。

改成這樣

select 和 table 將成為 2 個 export path,它們裡面裝了很多元件,細節我們下面看。

index.ts 取代了原本的 src/public_api.ts

由於我沒有需要 root export (因為有了 select 和 table 2 個 sub export),所以這裡做一個假 export 騙過它就好。

接著,ng-package.json 的路徑需要換一下

然後是 table 和 select folder

每一個要 sub export 的 folder 都需要加上 index.ts 和 ng-package.json。

index.ts 負責 export 元件

ng-package.json 就抄 root 的 ng-package.json

有兩個小區別:

  1. $schema 路徑多了一個 ../

  2. root 有一個 "dest" : "../../dist/stooges" 屬性,sub 不需要 "dest" 屬性。

select 和 table 一樣,也需要 index.ts 和 ng-package.json。

build & connect

接著 build library

ng build stooges --watch

效果

之前只有一個 lib folder,現在變成了 2 個 folder -- select 和 table。

目錄

上一篇 Angular 17+ 高階教程 – EventManagerPlugin & Hammer.js Gesture

下一篇 Angular 17+ 高階教程 – Prettier, ESLint, Stylelint

想檢視目錄,請移步 Angular 17+ 高階教程 – 目錄

相關文章