发布自己的Angular2库初探

从去年年底开始使用ng2,遇到并解决或被虐了一些问题点,对其各种新特性与开发模式感觉还算舒服。还有的一个感想就是,要使用ng2还得先学习不少其他东西,比如TypeScript语法,比如ES6新特性,还有就是酷炫的npm平台。本文就将侧重点放到npm上来,看看npm平台给ng2带来的酷炫的帮助。

现在眼前有一个问题:

我写了一个自己很满意的ng2的通用小组件,现在想要在以后的其他项目中都使用它,甚至想要把它分享给互联网上其他同时在被代码虐的兄弟们一起使用,这要如何实现呢?

回想以前外链script标签引用插件方式统治前端的时候,想要写一个通用的ng1小插件的流程大概是:

1. 在单独的angular.module("myPlugin")中写指令、服务、过滤器等

2.将其压缩打包成myplugin.min.js

3.其他项目中引入这个脚本然后angular.module("", ["myPlugin"])

现在到了ng2的时代,ng2自己的核心依赖都是使用npm管理的(而且是基于TypeScript),还非要手动写出一个xxx.min.js总给人一种无从下手的感觉,所以现在如果要开发自己的ng2库的话也要入乡随俗,利用起npm这个好东西。

笔者对于npm起初也是一脸懵逼,到现在也不敢说自己已能熟练使用之,不过npm只是个平台,是为了方便开发者而存在的,而不是为了“为难”开发者,所以一点点摸索,也能使用得还过得去。

先给出在发布ng2库到npm的整个大体的流程:

1. 要有一个ng2库的完善的信息描述以及依赖文件(自然就是package.json)

2. 安装ng2库需要的依赖

3. 编写实际代码

4. 在根路径下建立一个index文件导出依赖(比如你写的服务啊模块啊等等)

5. TypeScript预发布(写的是.ts文件,这一步将生成得到.js.map、.js以及.d.ts文件)

6. 链接到npm并发布

下面笔者将演示如何把之前写过的一个音频服务发布到npm。

一、建立项目

创建根目录ng2-firstyitimo,进入后cmd里直接 npm init ,照着引导一步步敲如我们的ng2库的信息,包括了其版本号、作者、描述等信息,最终npm会为我们创建出这个package.json文件:

 1 {
 2   "name": "ng2-firstyitimo",
 3   "version": "1.0.0",
 4   "description": "angular2 lib publishing test by yitimo",
 5   "main": "index.js",
 6   "scripts": {
 7     "prepublish": "tsc"
 8   },
 9   "keywords": [
10     "angular2"
11   ],
12   "author": "yitimo",
13   "license": "MIT"
14 }

这些参数大家肯定都见多非常熟悉了,这里只多提一点就是其中的 version 字段,每次重新publish我们的库到npm时,都要更新此字段的值(因为版本更新了嘛)。

二、添加依赖

下一步就是要添加依赖,我们要发布的是ng2库,所以必要的ng2依赖是肯定要有的,还有就是发布时编译将使用到的typescript工具以及ng2的类型预定义库,由于笔者使用的ng2版本是比较新的,使用到的依赖就在下面这个最新的完整package.json文件中:

{
  "name": "ng2-firstyitimo",
  "version": "1.0.4",
  "description": "angular2 lib publishing test by yitimo",
  "main": "index.js",
  "scripts": {
    "prepublish": "tsc"
  },
  "keywords": [
    "angular2"
  ],
  "author": "yitimo",
  "license": "MIT",
  "dependencies": {
    "@angular/common": "^2.4.6",
    "@angular/core": "^2.4.6",
    "rxjs": "^5.2.0"
  },
  "devDependencies": {
    "@types/core-js": "^0.9.35",
    "typescript": "^2.2.1"
  }
}

虽说是完整的package.json但是代码也非常少,因为要写的只是个ng2库而已,需要的只有common以及core两个ng2依赖。当然正常情况下,为了开发调试还是需要引入其他的依赖,如果向上面这样只引用最少的东西,那就只能发布后在其他项目中引用了才能看到效果(因为此项目本身并不能运行)。

三、实际代码

然后建立一个src目录,在里面编写实际的代码,这里要写的是之前写过的音频服务,代码就不给出了,完成后的文件结构如下:

这里笔者选择导出的是整个音频模块,所以里面的audio-studio组件必须在模块的exports中声明过,否则在其他项目中就是用不了这个组件了,不过其他的组件或指令不打算给外界使用,所以就不导出。服务也不需要导出,但是要在providers中声明,并在后面的index中导出(不然就不能给其他项目使用此服务了)。

四、使用index文件导出库

我们定义好的AudioModule以及AudioService是需要被其他项目引用或使用的,所以必须让外界知道我们的库提供了这两个东西(还有个组件的话由于是在html标签中使用,不需要被ts代码知道,所以exports导出就够了),这时就要在根目录下建立一个index.ts文件,内容非常简单,导出模块和服务就够了:

export * from ‘./src/audio.module‘;
export * from ‘./src/services/audio.service‘;

五、发布我们的ng2库

现在最前面讲到的6个步骤还剩5、6两步,仅仅是在cmd悄悄指令就能完成。但是在这之前我们还需要一个tsconfig.json,用来告诉typescript要如何编译我们的ts文件以及里面的类型预定义,如果没有这个文件项目中的实际代码是会报一大堆错误的,并且还不能被编译。笔者这里给出的tsconfig.json如下所示:

{
  "compilerOptions": {
        "noImplicitAny": true,
        "module": "commonjs",
        "target": "ES5",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "declaration": true,
        "typeRoots": [
            "../node_modules/@types"
        ],
        "types" : [
            "core-js"
        ]
    },
    "files": [
        "index.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}

现在一鼓作气来敲指令玩:

npm run prepublish


npm link


npm link ng2-firstyitimo


npm publish



完成了,现在在其他项目中安装这个刚发布的ng2库:

npm install --save ng2-firstyitimo

使用的时候:

import {AudioModule,AudioService} from ‘ng2-firstyitimo‘;

总结:

发布ng2库到npm的流程其实非常简单,而且非常有成就感。个人认为的难点就在于跨不出第一步,就像笔者在之前也是完全没头绪,想写个自己的ng2还得用npm,不过发布成功过一次之后,会发现这么一套流程其实都很清晰明了,并且还要再次提到,npm对ng2开发的帮助实在是太大了。

时间: 2024-08-06 20:19:08

发布自己的Angular2库初探的相关文章

带你玩转Visual Studio——带你发布自己的工程库

上一篇文章带你玩转Visual Studio--带你高效管理代码通过对VisualSVN优秀插件的讲解,让我们掌握了在集成开发环境VS中快捷高效地管理代码的技能.然而我们开发的程序并不总是直接地生成可执行的软件,我们可能只是开发某个大型系统的一个组件,也可能是开发某个软件的内核SDK提供给上层的应用程序调用,在开发的过程中我们也可能会用到第三方的开源库.那如果将自己的程序编译成程序库给调用方用呢?又如何在自己的程序中引用第三方库呢?这将是这篇文章要讲的内容--发布自己的工程库. 什么是程序库?

Maven发布工程到公共库

1.发布工程 新建一个 Maven build 选择要发布的工程

STL库初探

库:没错误,比框架小,用来解决小问题. 框架:解决开发中某个功能很全. STL:标准规范,代码不一样,风格,框架有差异 包括: 算法 容器 STL包括: 容器:容纳数据的结构 迭代器:扮演容器和算法的胶合剂 空间配置器:内存空间(动态分配)的分配与管理 配接器:一种修饰容器的东西:stack,queue,eg:反向迭代器 更约束,不支持遍历 算法#include<algorithm> 仿函数 迭代器:指向一个迭代器,类似指针(一个类型封装的指针) 迭代器失效:类似野指针,和删除有关 erase

机器学习库初探之TensorFlow

什么是TensorFlow?1 TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor).它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等.TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深

机器学习库初探之MXnet

什么是MXnet?1 这是自 xgboost, cxxnet, minerva 以来集合DMLC几乎所有开发者 (李沐和陈天奇等各路英雄豪杰) 力量的一个机器学习项目.MXNet名字源于"Mix and Maximize".MXnet 的目标就是希望把 cxxnet 这样强调性能静态优化的 C++ 库和灵活的 NDArray 有机结合在一起.做包含cxxnet 的静态优化,却又可以像 minerva, theano, torch 那样进行灵活扩展的深度学习库. 与其他工具相比,MXne

优秀个人免费私有云OwnCloud 8.0终于发布 - 亮眼新功能初探简介

OwnCloud是一个基于Linux的私有云开源项目,用户可以免费使用它来搭建自己的私有云来进行文件和多媒体等的分享. 本人有幸在大概一年多前因为项目需要而接触和使用到OwnCloud,但不幸的是当时发现有很多如性能等问题亟待解决.但这并不妨碍OwnCloud作为一个优秀的,免费的,开源的私有云服务器. 今天闲逛HackerNews的时候发现OwnCloud刚刚发布了8.0版本,而我们当时希望有的很多功能都已经囊括进来了,这是个非常激动人心的发布.下面对该版本的一些新功能进行介绍,希望能帮助到同

c++11 Thread库初探

c++11中最重要的特性之一就是对多线程的支持了,然而<c++ primer>5th却没有这部分内容的介绍,着实人有点遗憾.在网上了解到了一些关于thread库的内容.这是几个比较不错的学习thread库的资源: Thread support library                    : http://en.cppreference.com/w/cpp/thread Cpp reference/thread                      : http://www.cpl

使用Android Studio将开源库发布到Jcenter中央库

首先在 https://bintray.com 注册一个账号,登录后然后从其后台获得一个API Key 在你的项目根目录下的build.gradle文件中加入依赖,最后文件内容就变成了这样子. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' classpath 'com.jfrog.bintray.gradle:gradle-bintr

itchat库初探--微信好友全头像的拼接

代码: 1 import itchat 2 import math 3 import PIL.Image as Image 4 import os 5 6 itchat.auto_login() 7 friends = itchat.get_friends(update=True)[0:] 8 user = friends[0]["UserName"] 9 10 num = 0 11 for i in friends: 12 img = itchat.get_head_img(user