使用 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 模块:

ng generate module modules/header

创建 header 组件:

ng generate component 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 // 导出组件
]
})
export class HeaderModule { }

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

实际操练

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

<app-header>Such Header</app-header>

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

最后,需要导入 HeaderModule 到 AppModule 中,这样 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]
})
export class AppModule { }

现在使用 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.json 和 public_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 组件库的更多相关文章

  1. Angular CLI 创建你的第一个 Angular 示例程序

    第一步:安装 Angular CLI 你要使用 Angular CLI 来创建项目.创建应用和库代码,并执行多种开发任务,比如测试.打包和发布. 全局安装 Angular CLI. 要想使用 npm  ...

  2. Angular入门,开发环境搭建,使用Angular CLI创建你的第一个Angular项目

    前言: 最近一直在使用阿里的NG-ZORRO(Angular组件库)开发公司后端的管理系统,写了一段时间的Angular以后发现对于我们.NET后端开发而言真是非常的友善.因此这篇文章主要是对这段时间 ...

  3. 构建一个简单的Angular工程

    1.创建一个空的工程,之后用webstorm打开,添加一个bower.json文件: { "name": "AngularTpl", "depende ...

  4. 从零开始构建一个Reactor模式的网络库(二)线程类Thread

    线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #if ...

  5. 构建一个类jq的函数库

    jqfree core var $ = function(selector, context) { return new $.fn.init(selector, context); }; $.fn = ...

  6. 从零开始构建一个Reactor模式的网络库(一) 线程同步Mutex和Condition

    最近在学习陈硕大神的muduo库,感觉写的很专业,以及有一些比较“高级”的技巧和设计方式,自己写会比较困难. 于是打算自己写一个简化版本的Reactor模式网络库,就取名叫mini吧,同样只基于Lin ...

  7. SvelteUI:运用svelte3构建的网页版UI组件库(升级版)

    距离上次分享的svelte-ui 1.0已经一月有余,这次带来全新升级完整版svelte-ui 2.0. 这次优化并新增15+个组件.在开发之初借鉴了element-ui组件库,所以在组件结构及语法上 ...

  8. angular/cli 常用指令

    1.安装@angular/cli npm install -g @angular/cli 2.更新@angular/cli npm uninstall -g @angular/cli npm cach ...

  9. 从Java角度理解Angular之入门篇:npm, yarn, Angular CLI

    本系列从Java程序员的角度,带大家理解前端Angular框架. 本文重点介绍Angular的开发.编译工具:npm, yarn, Angular CLI,它们就像Java在中的Maven,同时顺便介 ...

随机推荐

  1. golang实现一个代理服务器(proxy)学习笔记

    golang是google公司开发一门新的编程语言.对于老的程序员来说,学习一门语言最好的方式,不过是做一个小的项目. 网上看到这一篇使用golang开发proxy的例子,觉得挺有意思.希望通过实际模 ...

  2. global

    使用关键字“global”你就可以把全局数据导入到一个 函数的局部范围内.

  3. 关于dc.add(Restrictions.like("XXX", "%"+XXX+"%"))查询不到结果,但数据库中存在

    找了好久,最后发现是连接池的jdbc.jdbcUrl=jdbc:mysql:///XXX没有写编码格式 把jdbc.jdbcUrl改为jdbc:mysql:///XXX?characterEncodi ...

  4. Spring Relational Database

    为了避免持久化的逻辑分散到应用的各个组件中,将数据访问功能放到一个或多个专注于此项任务的组件中,这样的组件通常称为数据访问对象(DAO)或Repository. 为了避免应用与特定的数据访问策略耦合在 ...

  5. linux管道命令之head与tail

    常常会遇到这样的情况: 1.我训练一个模型需要用到很多图片,这些图片都在一个文件夹下面,但是我想仅仅拷贝个一两张看一下图片的质量怎么样? 2.文件夹下有各种各样的数据,数目非常庞大,我想看一下文件夹下 ...

  6. 【CSP】最大的矩形

    问题描述 试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ ...

  7. CSS使用方法

    CSS行内样式: 在开始标签内添加style样式属性 如:<p style="color:red;">内容</p> CSS内部样式: 内部样式(嵌入样式), ...

  8. CF453(Div1 简单题解)

    A .Little Pony and Expected Maximum pro:给定M,N,表示一个M面的骰子,甩N次,问出现的最大的数的期望. sol:容斥,f(i)表示最大数<=i的期望,那 ...

  9. Install Java on Ubuntu server

    准备工作 a) 获得超级用户权限 关于超级用户访问权限的说明: 要将 Java 安装在系统级位置(例如 /usr/java),则必须以超级用户身份登录,从而获得必要的权限.如果您不具有超级用户访问权限 ...

  10. (1)HTML的组成(什么是标签、指令、转义字符、数据、标签字符表)

    html的组成:标签+指令+转义字符+数据 1.标签 <>内的,以字母开头,可以结合合法字符(- 或者数字),能被浏览器解析的符号 <!DOCTYPE html> #这个是系统 ...