返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何用DevUI搭建自己的Angular组件库
  • 225
分享到

如何用DevUI搭建自己的Angular组件库

2024-04-02 19:04:59 225人浏览 独家记忆
摘要

目录前言创建组件库关键配置修改目录布局调整库构建关键配置开发一个Alert组件组件功能介绍组件结构分解定义输入输出定义布局测试Alert组件开发态引用组件编写单元测试发布组件前言 作

前言

作为前端开发者,随着公司业务的不断发展和增长,业务对组件功能、交互的诉求会越来越多,不同产品或者团队之间公用的组件也会越来越多,这时候就需要有一套用于支撑内部使用的组件库,也可以是基于已有组件扩展或者封装一些原生三方库。本文会手把手教你搭建自己的angular组件库。

创建组件库

我们首先创建一个Angular项目,用来管理组件的展示和发布,用以下命令生成一个新的项目


ng new <my-project>

项目初始化完成后,进入到项目下运行以下cli命令初始化lib目录和配置, 生成一个组件库骨架


ng generate library <my-lib> --prefix <my-prefix>

my-lib为自己指定的library名称,比如devui,my-prefix为组件和指令前缀,比如d-xxx,默认生成的目录结构如下

angular.JSON配置文件中也可以看到projects下面多出了一段项目类型为library的配置


"my-lib": {
  "projectType": "library",
  "root": "projects/my-lib",
  "sourceRoot": "projects/my-lib/src",
  "prefix": "dev",
  "architect": {
    "build": {
      "builder": "@angular-devkit/build-ng-packagr:build",
      "options": {
          "tsConfig": "projects/my-lib/tsconfig.lib.json",
          "project": "projects/my-lib/ng-package.json"
      },
  "configurations": {
    "production": {
      "tsConfig": "projects/my-lib/tsconfig.lib.prod.json"
    }
  }
},
...

关键配置修改

目录布局调整

从目录结构可以看出默认生成的目录结构比较深,参考material design,我们对目录结构进行自定义修改如下:

修改说明:

  • 删除了my-lib目录下的src目录,把src目录下的test.ts拷贝出来,组件库测试文件入口
  • 把组件平铺到my-lib目录下,并在my-lib目录下新增my-lib.module.ts(用于管理组件的导入、导出)和index.ts(导出my-lib.module.ts,简化导入)
  • 修改angular.json中my-lib下面的sourceRoot路径,指向my-lib即可

修改如下:


// my-lib.module.ts


import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AlertModule } from 'my-lib/alert'; // 此处按照按需引入方式导入,my-lib对应我们的发布库名


@NgModule({
  imports: [ CommonModule ],
  exports: [AlertModule],
  providers: [],
})
export class MyLibModule {}


// index.ts
export * from './my-lib.module';


//angular.json
"projectType": "library",
"root": "projects/my-lib",
"sourceRoot": "projects/my-lib", // 这里路径指向我们新的目录
"prefix": "devui"

库构建关键配置

ng-package.json配置文件,angular library构建时依赖的配置文件


{
  "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
  "dest": "../../publish",
  "lib": {
    "entryFile": "./index.ts"
  },
  "whitelistedNonPeerDependencies": ["lodash-es"]
}

关键配置说明:

  • dest,lib构建输出路径,这里我们修改为publish目录,和项目构建dist目录区分开
  • lib/entryFile,指定库构建入口文件,此处指向我们上文的index.ts

whitelistedNonPeerDependencies(可选),如果组件库依赖了第三方库,比如lodash,需要在此处配置白名单,因为ng-packagr构建时为了避免第三方依赖库可能存在多版本冲突的风险,会检查package.json的dependencies依赖配置,如果不配置白名单,存在dependencies配置时就会构建失败。

package.json配置,建议尽量使用peerDependcies,如果业务也配置了相关依赖项的话


{
  "name": "my-lib",
  "version": "0.0.1",
  "peerDependencies": {
    "@angular/common": "^9.1.6",
    "@angular/core": "^9.1.6",
    "tslib": "^1.10.0"
  }
}

详细完整的配置,可以参考angular官方文档 https://GitHub.com/ng-packagr/ng-packagr/blob/master/docs/DESIGN.md

开发一个Alert组件

组件功能介绍

我们参考DevUI组件库的alert组件开发一个组件,用来测试我们的组件库,alert组件主要是根据用户传入的类型呈现不同的颜色和图标,用于向用户显示不同的警告信息。视觉显示如下

组件结构分解

首先,我们看一下alert组件目录包含哪些文件

目录结构说明:

  • 组件是一个完整的module(和普通业务模块一样),并包含了一个单元测试文件
  • 组件目录下有一个package.json,用于支持二级入口(单个组件支持按需引入)
  • public-api.ts用于导出module、组件、service等,是对外暴露的入口,index.ts会导出public-api,方便其它模块

关键内容如下:


// package.json
{
  "ngPackage": {
    "lib": {
      "entryFile": "public-api.ts"
    }
  }
}


//public-api.ts

export * from './alert.component';
export * from './alert.module';

定义输入输出

接下来我们就开始实现组件,首先我们定义一下组件的输入输出,alert内容我们采用投影的方式传入,Input参数支持指定alert类型、是否显示图标、alert是否可关闭,Output返回关闭回调,用于使用者处理关闭后的逻辑


import { Component, Input } from '@angular/core';
// 定义alert有哪些可选类型
export type AlertType = 'success' | 'danger' | 'warning' | 'info';


@Component({
  selector: 'dev-alert',
  templateUrl: './alert.component.html',
  styleUrls: ['./alert.component.sCSS'],
})
export class AlertComponent {
  // Alert 类型
  @Input() type: AlertType = 'info';
  // 是否显示图标,用于支持用户自定义图标
  @Input() showIcon = true;
  // 是否可关闭
  @Input() closeable = false;
  // 关闭回调
  @Output() closeEvent: EventEmitter<boolean> = new EventEmitter<boolean>();
  hide = false;
  constructor() {}


  close(){
    this.closeEvent.emit(true);
    this.hide = true;
  }
}

定义布局

根据api定义和视觉显示我们来实现页面布局结构,布局包含一个关闭按钮、图标占位和内容投影 ,组件关闭时,我们采用清空dom的方式处理。


<div class="dev-alert {{ type }} " *ngIf="!hide">
  <button type="button" class="dev-close" (click)="close()" *ngIf="closeable"></button>
  <span class="dev-alert-icon icon-{{ type }}" *ngIf="showIcon"></span>
  <ng-content></ng-content>
</div>

到这里,我们组件的页面布局和组件逻辑已经封装完成,根据视觉显示再加上对应的样式处理就开发完成了。

测试Alert组件

开发态引用组件

组件开发过程中,我们需要能够实时调试逻辑和调整UI展示,打开根目录下的tsconfig.json,修改一下paths路径映射,方便我们在开发态就可以本地调试我们的组件,这里直接把my-lib指向了组件源码,当然也可以通过ng build my-lib --watch来使用默认的配置, 指向构建好的预发布文件,此时这里就要配置成我们修改过的目录public/my-lib/*


"paths": {
  "my-lib": [
    "projects/my-lib/index.ts"
  ],
  "my-lib/*": [
    "projects/my-lib/*"
  ],
}

配置完成后,就可以在应用中按照npm的方式使用我们正在开发的库了,我们在app.module.ts中先导入我们的正在开发的组件,这里可以从my-lib.module导入全部组件,或者直接导入我们的AlertModule(前面已经配置支持二级入口)


import { AlertModule } from 'my-lib/alert';
// import { MyLibModule } from 'my-lib';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    // MyLibModule
    AlertModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

此时在app.component.html页面中就可以直接使用我们正在开发的alert组件了


<section>
  <dev-alert>我是一个默认类型的alert</dev-alert>
</section>

打开页面,就可以看到当前开发的效果,这时候我们就可以根据页面表现来调整样式和交互逻辑,此处就不继续展示了

编写单元测试

前面提到我们有一个单元测试文件,组件开发为了保证代码的质量和后续重构组件的稳定性,在开发组件的时候,有条件的建议加上单元测试。

由于我们调整了目录结构,我们先修改一下相关配置


// angular.json
"my-lib": {
  ...
  "test": {
    "builder": "@angular-devkit/build-angular:karma",
    "options": {
      "main": "projects/my-lib/test.ts", // 这里指向调整后的文件路径
      "tsConfig": "projects/my-lib/tsconfig.spec.json",
      "karMaconfig": "projects/my-lib/karma.conf.js"
    }
  },
}


//my-lib 目录下的tsconfig.spec.json  


"files": [
  "test.ts" // 指向当前目录下的测试入口文件
]

下面是一个简单的测试参考,只简单测试了type类型是否正确,直接测试文件中定义了要测试的组件,场景较多的时候建议提供demo,直接使用demo进行不同场景的测试。


import { async, ComponentFixture, TestBed } from '@angular/core/testing';


import { Component } from '@angular/core';
import { AlertModule } from './alert.module';
import { AlertComponent } from './alert.component';
import { By } from '@angular/platfORM-browser';


@Component({
  template: `
    <dev-alert [type]="type" [showIcon]= "showIcon"[closeable]="closeable"    (closeEvent)="handleClose($event)">
    <span>我是一个Alert组件</span>
    </dev-alert>
  `
})
class TestAlertComponent {
  type = 'info';
  showIcon = false;
  closeable = false;
  clickCount = 0;
  handleClose(value) {
    this.clickCount++;
  }
}


describe('AlertComponent', () => {
  let component: TestAlertComponent;
  let fixture: ComponentFixture<TestAlertComponent>;
  let alertElement: HTMLElement;


  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [AlertModule],
      declarations: [ TestAlertComponent ]
    })
    .compileComponents();
  }));


  beforeEach(() => {
    fixture = TestBed.createComponent(TestAlertComponent);
    component = fixture.componentInstance;
    alertElement = fixture.debugElement.query(By.directive(AlertComponent)).nativeElement;
    fixture.detectChanges();
  });


  describe('alert instance test', () => {
    it('should create', () => {
      expect(component).toBeTruthy();
    });
  });


  describe('alert type test', () => {
    it('Alert should has info type', () => {
      expect(alertElement.querySelector('.info')).not.toBe(null);
    });


    it('Alert should has success type', () => {
      // 修改type,判断类型改变是否正确
      component.type = 'success';
      fixture.detectChanges();
      expect(alertElement.querySelector('.success')).not.toBe(null);
    });
  }

通过执行 ng test my-lib就可以执行单元测试了,默认会打开一个窗口展示我们的测试结果

到这一步,组件开发态引用、测试就完成了,功能和交互没有问题的话,就可以准备发布到npm了。

更多测试内容参考官方介绍:Https://angular.cn/guide/testing

发布组件

组件开发完成后,单元测试也满足我们定义的门禁指标,就可以准备发布到npm提供给其他同学使用了。

首先我们构建组件库,由于ng9之后默认使用ivy引擎。官方并不建议把 Ivy 格式的库发布到 NPM 仓库。因此在发布到 NPM 之前,我们使用 --prod 标志构建它,此标志会使用老的编译器和运行时,也就是视图引擎(View Engine),以代替 Ivy。


ng build my-lib --prod

构建成功后,就可以着手发布组件库了,这里以发布到npm官方仓库为例

如果还没有npm账号,请到官网网站注册一个账号,选用public类型的免费账号就可以

已有账号,先确认配置的reGIStry是否指向npm官方registry https://registry.npmjs.org/

在终端中执行npm login登录已注册的用户

准备工作都完成后,进入构建目录,这里是publish目录,然后执行 npm publish --access public就可以发布了,注意我们的库名需要是在npm上没有被占用的,名字的修改在my-lib目录下的package.json中修改。

npm发布参考: https://docs.npmjs.com/packages-and-modules/contributing-packages-to-the-registry

如果是内部私有库,按照私有库的要求配置registry就可以了,发布命令都是一样的。

以上就是如何用DevUI搭建自己的Angular组件库的详细内容,更多关于DevUI搭建自己的Angular组件库的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何用DevUI搭建自己的Angular组件库

本文链接: https://lsjlt.com/news/126530.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用DevUI搭建自己的Angular组件库
    目录前言创建组件库关键配置修改目录布局调整库构建关键配置开发一个Alert组件组件功能介绍组件结构分解定义输入输出定义布局测试Alert组件开发态引用组件编写单元测试发布组件前言 作...
    99+
    2024-04-02
  • 如何搭建自己的Gitlab库
    今天,我们来介绍一下关于如何搭建Gitlab库的方法。Gitlab是最受欢迎的自托管的Git存储库。Git是一个版本控制工具,用于记录和追溯文件的更改。在本文中,我们将一步步向您介绍如何搭建自己的Gitlab库。第一步:安装必要的软件包要搭...
    99+
    2023-10-22
  • datepickerrh 定义自己的angular时间组件
    这篇文章将为大家详细讲解有关datepickerrh 定义自己的angular时间组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先是引入相应的文件jquery和da...
    99+
    2024-04-02
  • 如何搭建自己的Github(步骤)
    现如今,Github 受到越来越多的程序员和开发者的青睐,成为了常见的协作与代码共享平台。如果你还没有开始使用 Github,那你可能会与程序员领域的最新趋势失去联系。但是,该如何搭建自己的 Github 呢?下面,就来介绍如何开始使用 G...
    99+
    2023-10-22
  • 如何自己搭建服务器
    搭建服务器的操作步骤:打开控制面板找到Windows功能组件中的Internet信息服务进行安装更新。更新完成后,打开“Internet 信息服务管理器”创建Web网站,再打开浏览器,输入“http://localhost/”地址后按回车,...
    99+
    2024-04-02
  • 如何搭建react+ts组件库
    本篇内容介绍了“如何搭建react+ts组件库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!整体需求react组件库,取名r-ui,能够导出...
    99+
    2023-06-30
  • 如何搭建自己的云服务器
    要搭建自己的云服务器,你可以按照以下步骤进行操作:1. 选择云服务提供商:有许多云服务提供商可供选择,你可以根据自己的需求和预算选择...
    99+
    2023-09-27
    云服务器
  • 如何搭建自己的git服务器
    要搭建自己的Git服务器,可以按照以下步骤进行操作:1. 选择操作系统:选择适合自己的操作系统作为服务器,如Linux、Window...
    99+
    2023-10-08
    git
  • 10分钟搭建自己的Git仓库
    目录Gitlab服务端搭建下载Gitlab的Docker镜像运行如下命令来启动Gitlab开启防火墙的指定端口访问GitlabGitlab的使用选择创建项目、创建组织、创建帐号 创建...
    99+
    2024-04-02
  • Python中如何搭建自己的量化分析数据库
    本篇文章给大家分享的是有关Python中如何搭建自己的量化分析数据库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。手把手教你搭建自己的量化分析数据库引言:数据是金融量化分析的重...
    99+
    2023-06-02
  • 自己如何搭建云服务器
    个人搭建云服务器的操作步骤:挑选云服务器供应商并进入官网。注册账户并登录。点击购买云服务器。选择云服务器配置,个人使用的话,选择”1核1G,带宽2M”配置足够。云服务器系统选择自己熟悉的即可。例如Windows和Linux系统。付款交易成功...
    99+
    2024-04-02
  • 如何自己云服务器搭建
    以下是一个简单的步骤: 选择一台云服务器:您可以选择适合您需求的云计算平台,例如 Amazon Web Services (ECS)、Google Cloud Platform (GCP)。 安装所需的软件:在 GitHub 上下载云服...
    99+
    2023-10-26
    服务器
  • 如何自己搭建云服务器
    要自己搭建云服务器,需要按照以下步骤进行: 确定云服务器的类型:根据不同的云服务器供应商和服务平台,选择合适的服务器类型,例如Windows服务器、Linux服务器、MySQL服务器等。 规划服务器:根据所需的存储容量和计算能力,规划服...
    99+
    2023-10-26
    服务器
  • 如何使用elasticsearch搭建自己的搜索系统
    这期内容当中小编将会给大家带来有关如何使用elasticsearch搭建自己的搜索系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是e...
    99+
    2024-04-02
  • 如何用自己的电脑搭建云服务器
    以下是用自己的电脑搭建云服务器的一般步骤: 安装云服务器:首先,需要购买一个云服务器。您可以直接在网上购买,或者向提供云服务器的公司提出请求购买。 配置云服务器:一旦您购买了云服务器,就需要对其进行配置。这可能包括安装必要的软件包,添加...
    99+
    2023-10-26
    自己的 如何用 服务器
  • 如何搭建自己的云服务器呢
    搭建自己的云服务器可以使用自己熟悉的虚拟主机或云主机服务,也可以使用第三方开源云服务器(如GitCloud、Stack Cloud)。 下面是一些关于如何搭建自己的云服务器的步骤和要点: 选择云服务商:在决定要使用哪种云服务之前,你可以...
    99+
    2023-10-26
    自己的 服务器
  • pytorch如何搭建自己的神经网络
    在Pytorch中搭建神经网络通常需要遵循以下步骤: 定义神经网络的结构:通过创建一个继承自torch.nn.Module的类来定...
    99+
    2024-04-02
  • 怎么搭建自己的git远程仓库
    要搭建自己的Git远程仓库,可以按照以下步骤操作: 在服务器上安装Git:首先需要在服务器上安装Git软件,可以通过包管理工具(...
    99+
    2024-04-02
  • 从0搭建Vue3组件库之如何使用Vite打包组件库
    目录打包配置声明文件本篇文章将介绍如何使用 vite 打包我们的组件库,同时告诉大家如何使用插件让打包后的文件自动生成声明文件(*.d.ts) 打包配置 vite 专门提供了库模式的...
    99+
    2023-03-07
    Vite打包组件库 vue3 Vite打包组件库
  • 自己如何组建云服务器
    要组建云服务器,可以按照以下步骤进行: 确定云服务器的类型和用途 选择公共云服务器、私有云服务器和混合云服务器中的任何一种。公共云服务器通常具有更高的可用性和可靠性,而私有云服务器通常更具有弹性和灵活性。 确定云服务器的容量和可用性...
    99+
    2023-10-26
    服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作