前几天大师兄说需要将已经开发完成的Saga在线工具
模块化,提供给其他平台使用。所以打算先开发一个angular版本的插件试试。
以下为开发angular插件的教程:
1 开发基于angular的插件
1.1 初始化
在本地电脑中选择开发目录,开始初始化,cmd下:
1 2 3
| mkdir ng-test-plugin cd ng-test-plugin npm init
|
在npm init
之后需要填写第三方包的基本信息,项目名不可以大写,如果不填写可直接回车。执行完毕后项目中只有一个package.json。
注意:如果第三方包要发布到 npm 上,项目名在npm上已存在会导致发布失败。
1.2 添加 angular 所需依赖
1
| npm install --dev typescript@latest @angular/core @angular/common rxjs zone.js
|
此时安装的包并不需要发布,发布时只发布代码,需要在package.json
中配置peerDependencies
作为前置依赖,但包本身不会实际安装这些依赖,实际的包应该由应用项目来安装,现在把peerDependencies
添加进package.json
1 2 3 4 5
| "peerDependencies": { "@angular/common": ">=5.0.0", "@angular/core": ">=5.0.0", "rxjs": ">=5.0.0" }
|
1.3 项目开发
1.3.1 开发插件功能
根目录创建lib文件夹,并在文件夹下创建fivering.component.ts
和fivering.module.ts
文件
fivering.component.ts
文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core' @Component({ selector: 'app-fivering', template: ` <div class="five-rings"> <div class="ring1"></div> <div class="ring2"></div> <div class="ring3"></div> <div class="ring4"></div> <div class="ring5"></div> </div> `, styles: ['.five-rings{position:fixed;top: 50%;left:50%;width: 290px;height: 130px;margin-top: -65px;margin-left:-145px;} .ring1,.ring2,.ring3,.ring4,.ring5{position: absolute; width: 80px;height: 80px;border-radius: 50%;border:5px solid;} .ring1{\ border-color: purple;\ }\ .ring2{\ left: 100px;\ border-color: black;\ }\ .ring3{\ left: 200px;\ border-color: red;\ }\ .ring4{\ top: 45px;\ left: 50px;\ border-color: yellow;\ }\ .ring5{\ top: 45px;\ left: 150px;\ border-color: green;\ }'] }) export class FiveRingComponent implements OnInit { show_rings = false; constructor() { } ngOnInit() { } }
|
fivering.module.ts
文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import { FiveRingComponent } from './fivering.component'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core';
@NgModule({ declarations: [ FiveRingComponent ], imports: [ CommonModule ], providers: [], exports: [FiveRingComponent], }) export class FiveRingModule { }
|
1.3.2 支持TypeScript
为了支持TypeScript
,还需要一个tsconfig.json
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| { "compilerOptions": { "baseUrl": ".", "declaration": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, "module": "commonjs", "moduleResolution": "node", "rootDir": ".", "lib": ["es2015", "dom"], "skipDefaultLibCheck": true, "skipLibCheck": true, "target": "es5", "suppressImplicitAnyIndexErrors": true, "strictNullChecks": true, "noImplicitAny": true, "sourceMap": true, "removeComments": true, "noFallthroughCasesInSwitch": true }, "exclude": [ "node_modules", "*.d.ts", "**/*.d.ts" ] }
|
1.3.3 导出功能
功能完成后需要导出,让其他项目引用,所以在项目根目录下创建一个index.ts
文件,文件内容:
1
| export * from './lib/fivering.module';
|
1.3.4 编译打包
修改package.json
中的script
方便编译打包:
1 2 3 4 5 6
| "scripts": { "prepublish": "npm run clean && tsc", "clean": "rimraf index.js index.js.map index.d.ts lib/**/*.js lib/**/*.js.map lib/**/*.d.ts *.tgz", "link": "npm run pack && tar -zxf linktest.tgz && rimraf ../lib-test-app/node_modules/ng-test-plugin && mv package ../lib-test-app/node_modules/ng-test-plugin", "pack": "npm run prepublish && npm pack" }
|
执行时,使用npm run prepublish
形式,clean命令需要先安装rimraf
:
2 发布插件
2.1 npm 账号
注册npm账号: 地址:https://www.npmjs.com
进入项目根目录下打开终端
运行:npm login
输入账号、密码、邮箱
可使用 npm whoami
命令确认身份
2.2 完善包信息
完善package.json
,包括开源许可、包名、作者、版本号等,最重要直接影响发布的是版本号。
2.3 选择性发布
基于angular
的第三方包区别与普通的js包最大的地方就在于,不能直接把整个包都发布到npm,这样会导致奇怪错误,原因在于.ts文件,实际上需要发布的只是.js、.js.map、.d.ts
这三种类型的文件就够了。
因为在其他项目中不一定会使用TypeScript
,即使用了也不会刻意包含node_modules
目录,也就是说其他项目只管使用,编译的活由我们得包自己来做,相反要是我们还发布多余的.ts文件,只会导致错误。
为了做到选择性发布,需要一个.npmignore
文件,和.gitignore
配合用来忽略上传的文件,一般这些编译输出我们会添加在.gitignore
中,若项目不存在.npmignore
,发布到npm时也会使用.gitignore
,这不是我们想要的,所以需要再创建这个.npmignore
来忽略.ts文件而包含编译输出:
1 2 3 4 5 6 7 8
| node_modules yarn-error.log tsconfig.json .gitignore .npmignore yarn.lock *.ts !*.d.ts
|
2.4 执行发布命令
将插件项目发布到npm
:
1 2
| npm run prepublish npm publish
|
3 引用插件
3.1 安装插件
在需要引用插件的项目中执行以下命令安装插件:
1
| npm install ng-test-plugin
|
3.2 引入到项目中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import { FiveRingModule } from 'ng-test-sj'; @NgModule({ declarations: [ AppComponent, SagaPluginComponent, ], imports: [ BrowserModule, FiveRingModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
|
3.3 html中使用
1
| <app-fivering></app-fivering>
|
4 参考
Yitimo - 简书:angular第三方包开发整理
essential_note - 简书:组件的工程化(开发第三方angular包)