热乎乎的nodejs进阶教程第二篇来了,如果第一篇没看过,建议大家先移步到第一篇npm使用技巧和最佳实践
这篇讲述如何发布一个npm模块,大家平时都是下载各种第三方的npm包到自己的项目,身为一个有追求的程序员,肯定要学学自己造轮子,今天手把手教大家如何发布一个自己开发的npm包到npm仓库,让别人也能下载使用你开发的npm模块。
马上开始!!!
npm模块发布
当我们开发node应用的时候,npm仓库上有很多现有的模块可以帮助我们提高开发效率,像日期处理,字符串处理这些低级的事情我们就不需要自己做了,因为npm仓库有很多包可以处理这些,我们直接引入使用即可
那么问题来了,你有没有想过npm仓库上的模块来自哪里,又是怎么发布上去的?
这篇文章的目标就是解决上面的这些问题的,let's go!!!
npm上面长千上万的包来自哪里
npm上成千上万的模块是存储在一个巨大的仓库,地址是 https://registry.npmjs.org/,所以我们要发布自己开发的模块的话,也是发布到这里,下面来看看怎么发布
如何把npm包放到npm仓库
1 创建一个模块
打开命令行,新建一个目录mkdir npm-publish-test
,执行npm init -y
初始化一个默认的包文件package.json
{
"name": "npm-publish-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
复制代码
package.json中最重要的属性是name和version两个属性,这两个属性一起形成了一个npm模块的唯一标识符, 这两个属性是必须的,否则模块就无法被安装,。模块中内容变更的同时,模块版本也应该一起变化至于怎么变化,后面会介绍。
name
,你的模块名, 需要保证唯一,npm仓库上的模块名是不能重复的main
描述了当你用require('modulename')
引用这个模块的时候,引用的是哪个文件,这个字段的值你可以采用默认的或者修改成你项目中任何一个有效的文件keywords
也应该包含在包文件里面,npm是根据keywords的值去索引模块的,这样其他人才能通过搜索这些关键字从而找到你的模块author
就是你了,但是如果你的项目不是你一个人来发的,那么你也应该将你的开发伙伴一起添加进去
package.json还有很多字段,想全面了解移步这篇文章
2 license
单独开个小节,来说明license这个字段的意思
license是开源许可说明。在开源世界里,license是具有法律效力的,通过选择相应的license,版权拥有者可以声称自己相应的权利,包括其他人使用、修改、引用、共享等一系列涉及版权的操作。
各大组织设立了为代码开源许可的规范文档,当作者声明此文档类型时,他人必须遵守该文档类型的规范。
国际公认的开源license,有多达80余种,一张图带你了解比较常用的几种开源许可协议(原图来自阮一峰大神,自己稍微修葺了一下)
关于开源许可协议,大家要了解去网上看吧,这里不再赘述,我们放松一下,来听个小故事吧
Facebook + React的变脸
2016年5月,Facebook开源了前端框架React,平地一声雷,引来前端界震动。
同年7月,Facebook在React开源许可协议中的附加专利条款,条款的精髓概括一下就是"如果你觉得Facebook侵犯了你的知识产权,你不能起诉Facebook;如果Facebook起诉你,那么你不能反诉,否则你就立即停止使用React",反正怎样挨打的都是你,然后大家都被Facebook的流氓行径搞炸了,说好的开源共享精神呢???
随后,Apache、WordPress等组织陆续宣布封杀或弃用React,同时,中国互联网的一批企业开始意识到问题严重性,寻求新的前端技术来替代React
如果当时你们公司采用的技术栈是React, 但是你们不为所动,还是继续无所忌惮使用的话,原谅我这个老实人要说大实话了,那你们公司在互联网行业的水平和地位,嗯嗯嗯。。。。。大家都懂的。
10月,Facebook迫于开发者和开源社区的压力,宣布将react及其他一系列采用BSD+专利许可协议的软件改用MIT许可。
瞧瞧!小扎多精明,除了会敲代码,变脸技术也不赖! 虽然一波三折,最后还是开源共享了,再加上这张帅脸把持,我们还是选择原谅他吧。
故事讲完了,想知道怎么选择软件许可协议的小伙伴,请移步这个网站
3 语义化版本
version非常重要!!!在此再重申一遍!!!
教程的第一篇已经详细解释了npm模块版本的问题,这里再重申一遍npm的语义化版本定义:major.minor.patch(大版本.小版本.补丁版)
- 大版本,做了不兼容的API修改
- 小版本,添加了向后兼容的功能
- 补丁版,做了向后兼容的bug修复
版本不是为机器定义的,是为用户定义的,所以你项目做了改变的时候,记得同步更改对应版本,版本号的定义请严格按照语义化版本来。
4 加入说明文档
如果你要向别人分享你的代码,那么有一个合适的说明文档就非常有必要了,通常在你项目的根目录放一个README.md
就够了
这个是规范性要求,不是强制性要求,你要是任性不放,我也不会打你
你要是觉得大家时间多到用不完还有心情去看你的代码,然后搞明白你的代码是干什么的以及如何使用,你可以试试不加。
5 私有文件不要上传
用.npmignore
文件来记录不发布的私有文件,在这个文件里面添加你不想上传的私有文件
这个文件和在在git项目中使用.gitignore
的效果是一样的,npm和git一样,会查找你包里面所有目录中的.npmignore和.gitignore文件
6 注册npm账户
你冥思苦想,奋笔疾书,洋洋洒洒写了一篇自以为很棒的文章,准备发布到网上,吸引无数粉丝,阅读破万,一跃成为网红写手,想想都好激动!!!对此,我只能
冷静一下 在发布之前,还有一件很重要的事情要做,去npm官网注册用户,否则你没有权限在npm仓库发包注册的方式有两种
- 去npm官网注册,和你平时注册一个网站账户大同小异
- 用命令行注册
身为一个程序员,一定要有逼格,所以我的选择肯定不是第一种
命令行注册步骤:在命令行执行npm adduser
, 按照提示依次输入用户名,密码和邮箱,我就随便注册了一个用户给大家演示一下
上面显示已经注册成功了,但是去npm的官网用这个账号登陆不进去,报错如下
细心的小伙伴应该已经找到原因了
还没找到原因的小伙伴,请仔细看看上面我注册的地址
my god! 这哪是注册到npm上去了,这是注册到npm的淘宝镜像了,由于之前我为了npm包下载的更快,配置了这条命令 npm config set registry https://registry.npm.taobao.org
晕,不小心中招了
现在切换到官方仓库地址,执行 npm config set registry https://registry.npmjs.org/
执行npm adduser
重新注册一个
特别说明:平时开发,大家可以把npm的registry设置成淘宝镜像源来加快开发效率,但是大家如果要发布包,建议一开始就把npm的registry配置成官方镜像地址,不然后面发布还会出问题!!!
7 npm包发布
开发包我就不说了,你不会我也没办法,呵呵,本地测试自己开发包第一篇教程已经讲了,现在我们直奔主题,如何发布这个已经开发好的包。 在项目根目录下执行
npm whoami //验证你的凭据已存储在客户端,注册成功了就会显示你的用户名
npm publish --access=public //如果是公开包这样发布,如果不是公开的包则去掉--access=public即可
复制代码
8 更新一个已经发布的包
当你更改了代码,准备重新发布包的时候
先执行npm version major/minor/patch
更新对应版本,
然后再执行 npm publish
进行发布
9 删除包
- 1、删除指定的版本
npm unpublish 包名@版本号
复制代码
- 2、删除整个包
npm unpublish 包名 --force
后记
最近公司的任务不多,所以就多了很多时间来写文章,感觉自己快成二师兄了
谁知道啥时候忙起来,就很难保持高更的频率了
虽然任性了一点,但是我做人还是有底线的,一个月2篇+文章还是有保证的,毕竟要同时兼顾质量和数量。
最后,公总号同步更新,欢迎扫码关注,第一时间获取更新动态。