[转]使用 Angular CLI 和 ng-packagr 构建一个标准的 Angular 组件库

摘要:
使用AngularCLI构建Angular应用程序是最方便的方式之一。我们将会使用它来把我们的组件打包成Angular包标准格式的组件库,使得它可以在任意的Angular项目中使用。根据ng-package文档得知,我们需要在我们的项目中添加两个文件,ng-package.json和public_api.ts。,ng-package.json用来配置n-packagr并告诉它去哪里找public_api.ts文件,这个文件通常是用来导出我们组件库的功能模块。

使用 Angular CLI 构建 Angular 应用程序是最方便的方式之一。

项目目标

现在,我们一起创建一个简单的组件库。

首先,我们需要创建一个header组件。这没什么特别的,当然接下来会明白的。

我们能从中能得到什么收获?

  • 自动生成项目结构

  • 自动生成组件库的组件、模块和服务

  • 自动生成组件库的测试用例

  • 在打包组件库之前会自动生成对应的测试环境测试组件库中的组件

  • 自动打包组件库为 Angular Package 的标准格式

准备工作

首先,安装 Angular CLI ,如下所示:

npm install @angular/cli -g

Angular CLI 安装完成后,接着创建组件库

ng new my-component-library
ng-server 将会从组件库的目录开始启动项目

接下来,启动项目,如下:

ng serve --port 4200

在浏览器中输入 localhost:4200 ,可以看到:

页面显示是 Angular CLI 构建项目的默认展示

创建一个组件

使用 CLI 生成一个header组件,同时设置组件的选择器为app-header,新建一个文件夹modules

在 module 文件夹中创建一个 header 功能组件

创建header模块:

nggeneratemodulemodules/header

创建header组件:

nggeneratecomponent modules/header

这里会在src/app/modules/header文件夹生成如下文件:

  • header.component.css

  • header.component.html

  • header.component.spec.ts

  • header.component.ts

  • header.module.ts

定制组件 header 内容

打开header.component.html文件,并替换为如下内容:

<h1>
  <ng-content></ng-content>
</h1>

美化header组件

设置组件h1标签的字体颜色为红色

h1 {
  color: red;
}

module中导出我们的组件

打开header.module.ts文件,并在@NgModule中添加exports,并导出HeaderComponent

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HeaderComponent } from './header.component';
@NgModule({
  imports: [
    CommonModule
  ],
  declarations: [
    HeaderComponent
  ],
  exports: [
    HeaderComponent // 导出组件 
  ]
})
exportclassHeaderModule{ }

在应用中确保在使用HeaderComponent组件之前导入 HeaderModule 模块并在@NgModuledeclarations中声明。如果没有在exports中导出HeaderComponent,则组件能且只能在它的模块中使用,而不能在其他模块中使用。

实际操练

打开app.component.html并替换为如下内容:

<app-header>SuchHeader</app-header>

我们给<app-header></app-header>设置了内容 "Such Header" ,这个内容将会替换 header 模板中<ng-conent></ng-content>占位符。

最后,需要导入HeaderModuleAppModule中,这样app.component.html才知道如何渲染<app-header>

app.module.ts文件的 imports 中添加HeaderModule

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
// 导入我们的模块 
import { HeaderModule } from './modules/header/header.module';
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HeaderModule // import it into our @NgModule block
  ],
  providers: [],
  bootstrap: [AppComponent]
})
exportclassAppModule{ }

现在使用ng serve启动本地服务,打开浏览器输入localhost:4200可以看到如下:

ng-packagr

n-packagr是一个 node 库,它可以编译和打包 TypeScript 库为 Angular 包的标准格式。我们将会使用它来把我们的组件打包成 Angular 包标准格式的组件库,使得它可以在任意的 Angular 项目中使用。

在项目的根目录中执行npm install ng-packagr --save-dev安装n-packagr,这时将会开始下载n-packagr,同时在package.json文件中的devDependency声明包依赖,我们可以在npm scripts中调用它。

根据ng-package文档得知,我们需要在我们的项目中添加两个文件,ng-package.jsonpublic_api.ts。,ng-package.json用来配置n-packagr并告诉它去哪里找public_api.ts文件,这个文件通常是用来导出我们组件库的功能模块。(备注:public_api.ts文件是 Angular 组件的使用约定)

ng-package.json文件中添加如下内容:

{
  "$schema": "./node_modules/ng-packagr/ng-package.schema.json",
  "lib": {
    "entryFile": "public_api.ts"
  }
}

并且,在public_api.ts文件中导出header.module.ts

export*from'./src/app/modules/header/header.module'

package.json文件中的scripts添加"packagr": "ng-packagr -p ng-package.json",告诉ng-packagr根据ng-package.json来打包我们的组件库。同时,设置"private": false

"scripts": {
  "ng": "ng",
  "start": "ng serve",
  "build": "ng build",
  "test": "ng test",
  "lint": "ng lint",
  "e2e": "ng e2e",
  "packagr": "ng-packagr -p ng-package.json"
},
"private": false

创建组件包

运行npm run packagr创建组件包,创建完成后会在项目的根目录中生成dist文件夹,里面的内容就是我们生成的标准的 Angular 组件库的结构。

为本地开发打包组件库

我们可以在应用中使用npm install安装本地的开发包。进入dist目录执行npm pack打包组件库,打包完成后,会在项目的根目录生成my-component-library-0.0.0.tgz0.0.0来至于 package.json 文件中一部分。

在其他的 Angular 项目中有依赖你的组件库,则可以使用 `npm install ./path/dist/my-component-library-0.0.0.tgz 安装本地依赖包。

在 npm 网站上发布我们的组件库

使用 npm login 登录 npm 账号,然后使用npm public 发布我们的组件库。需要注意的是,发布时需要确保我们定义的包名是唯一的(本例中使用:my-component-library)。发布成功后,就可以在我们的应用中使用npm install my-component-library安装和使用我们的组件库。

发布过程中遇到一个错误:Package name triggered spam detection; if you believe this is in error, please contact support@npmjs.com

解决方法: 修改包名

使用我们自定义的组件库

安装完成后,把组件导入到app.module.ts,并在@NgModule中的imports数组中添加导入的HeaderModule组件库...

import{ HeaderModule }from'my-package-name';//引入我们自定义的组件库
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HeaderModule  // 在这里导入
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

在应用程序的模板中使用组件库中组件定义的选择器,使得组件库中的组件成为我们应用程序中的一部分。

// app.component.html
<h1>
   {{ title }}
</h1>
<!-- 看这里,在这里使用 -->
<app-header></app-header>
<!-- end -->
原文地址:https://segmentfault.com/a/1190000010900969

免责声明:文章转载自《[转]使用 Angular CLI 和 ng-packagr 构建一个标准的 Angular 组件库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.NET 轻量级 ORM 框架apache中配置php支持模块模式、cgi模式和fastcgi模式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js对flv提取h264、aac音视频流

FLV提取里面的h264视频流 FLV和MP4支持的编码 流媒体和媒体文件的区别 流媒体是指将一连串的多媒体资料压缩后,经过互联网分段发送资料,在互联网上即时传输影音以供观赏的一种技术与过程,此技术使得资料数据包得以像流水一样发送,如果不使用此技术,就必须在使用前下载整个媒体文件。flv属于流媒体格式,所以很适合做低延时的直播 对比hls和mp4 相对于...

ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解

ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解 潇湘隐者 2020-12-17我要评论 这篇文章主要给大家介绍了关于ORACLE如何检查找出损坏索引(Corrupt Indexes)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧 索引 索引与表一样,也属于段(segment)的...

使用C++ 实现的 websocket 客户端 (基于easywsclient)

直接上代码 easywsclient.hpp #ifndef EASYWSCLIENT_HPP_20120819_MIOFVASDTNUASZDQPLFD #define EASYWSCLIENT_HPP_20120819_MIOFVASDTNUASZDQPLFD // This code comes from: // https://github.co...

nginx做80端口转发

server { server_name zjrzb.cn listen 80; location / { proxy_pass http://127.0.0.1:8090; proxy_set_header Host $host:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X...

tp5做的excel导入导出(用的PHPexcel类)

//ajax没有流类型,需要另外的处理方式// 应用公共文件 function excelExport($fileName = '', $headArr = [], $data = []) { //引入phpExecl类 vendor("PHPExcel.PHPExcel"); $fileName .= "_" . da...

binary hacks读数笔记(readelf基本命令)

一、首先对readelf常用的参数进行简单说明: readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍: 1、readelf -v 显示版本 2、readelf -h 显示帮助 3、readelf -a test 显示test的全部信息 4、readelf -h te...