我目前正在开发一个Angular 4项目,该项目涉及开发外部UI组件库(非常类似于“ngx-bootstrap”)。
将两者分开是非常重要的,因为稍后将在其他Angular 4项目中使用所述UI组件库。
我注意到大多数图书馆是预建的,
然而,单独构建它们(至少现在)是太麻烦了,我宁愿同时处理它们,我的第一个想法就是简单地导入.ts
文件并从父文件中编译它们项目
我尝试使用npm link
来实现此功能,但在线阅读时,似乎不推荐使用此方法。
https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/linked-library.md
我很想知道我有什么选择来实现这个功能。
另一个重要的事情是在外面提供源代码,因为库将在其他项目中使用和开发。
答案 0 :(得分:2)
您可以使用ng-packagr轻松构建库。
你会得到一些想法。我觉得这适合你。只需创建要用作库的组件并将其导出即可。npm install @angular/cli -g
ng new my-component-library
ng generate module modules/header
[将充当库的模块] ng generate component modules/header
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HeaderComponent } from './header.component';
@NgModule({
imports: [
CommonModule
],
declarations: [
HeaderComponent
],
exports: [
HeaderComponent // <-- this!
]
})
export class HeaderModule { }
npm install ng-packagr --save-dev
ng-packagr
文档,我们需要向项目中添加两个文件,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"
}
}
从header.module.ts
public_api.ts
export * from './src/app/modules/header/header.module'
现在我们将向我们的package.json
添加一个打包程序脚本,我们可以根据ng-ng-packagr
的配置告诉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文件夹。这是您的组件库。完全自给自足,根据最佳实践进行包装,并准备将它的红色标题照亮世界。
要PACK,请运行npm pack dist
,否则您可以直接发布npm publish dist/
使用npm登录登录npm帐户后,您可以使用npm publish dist发布组件库。请确保您有一个唯一的包名称(提示:可以采用my-component-library)。发布后,您将能够使用npm install my-component-library
从npm安装组件库。
安装完成后,您可以将头部组件导入任何应用程序的app.module.ts,方法是将其包含在@NgModule导入数组中......
import { HeaderModule } from 'my-package-name';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HeaderModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
在模板中使用其选择器,就像在应用程序中使用组件一样。