如何发布一个自己的node模块到npm
本文介绍如何创建一个自己的 node 模块,以及怎样发布到 npm ,与其他开发人员共享你的模块。
前言
作为一个前端开发人员,或者 nodejs 开发人员,目前我们使用最多的模块管理机制实属是 npm。我们可以使用很简单方式引用其他开发者发布到 npm 的模块。例如,当需要在你的项目中使用 vue。那么你可以:
1 | $ npm install vue --save |
安装 vue 模块到你的项目中,然后通过简单的导入命令使用她:
1 | const Vue = require('vue') |
那么,我们自己怎样去创建一个自己模块,并且发布到 npmjs 呢?
准备
在开始之前,你需要有 3 样关键的工具,请确保你已经安装或者注册了。
- 编辑器,推荐使用 Visual Studio Code
- Node.js 环境
- npm 账户
创建一个模块
npm init
首先,我们要初始化一个 node 项目,也就是你的 node 包。随便在电脑的哪个位置创建一个新的文件夹,名字嘛,假定我们叫她 hello-npm-test。什么!你说她俗气?没办法!因为 苏大强 喜欢,我 苏明成 表示也没有办法。
OK!使用编辑器打开并进入到 hello-npm-test 文件夹,使用 npm init 初始化 package.json。
1 | $ npm init |
这时你会看到一些提示:
1 | elenh@elenh MINGW64 ~/Desktop/hello-npm-test |
具体的意思就是确定 package.json 文件中的一些必要字段信息。比如,包的名字 name ,包的语义化版本号 version ,包的描述信息 description,包的入口点 (entry point)main,测试脚本命令 (test command)script,git 仓库地址 (git repository),在 npm 中的搜索关键字 keywords ,包的作者名 author 以及该包的开源许可证类别 license。
注:如果直接按回车的话,表示直接使用默认值设置该字段,但是作为一个即将要把包发布到
npm的模块分享者来说,请仔细填写这些信息。因为这关系到该模块是否能正常使用(main 入口点),或者说别的开发者能够方便检索到你的模块(keywords, description)。很关键的一点是,你的version字段一定要遵循npm的语义化版本定义规则。以便使用此模块的开发者知道使用该模块的哪个版本。关于语义化版本规则请参考本博客的另一篇文章 npm使用说明。
编写模块
现在,我们已经初始化好了 package.json 文件。是时候创建模块文件了。在 hello-npm-test 文件夹中新建一个名为 index.js 的文件。并在里面写入如下代码:
1 | module.exports = function ( str ){ |
如上,使用 CommonJs 模块语法默认导出了一个函数,代码质量及其酷炫。苏明玉 都表示很惊讶!
至于为什么使用名为 index.js 的文件呢?这边要说的话就需要展开 nodejs 的模块加载规则了,嗯,苏明哲让我别展开了,听大哥的话,所以请自行 Google。
另一点需要说的是,在 package.json 文件中,我们定义了模块的入口点(entry point)main 字段,其默认值就是 index.js。她表示当使用模块导入语法使用该模块时,使用哪个文件作为入口点。当然,你可以修改她,比如:
1 | { |
表示模块入口点为 src 文件夹下的 index.js 文件。
测试你的模块
到目前为止,你的模块已经可用了,那么怎么测试你的模块呢?此时,因为还没有发布到 npm ,所以不能使用如下方式直接安装。
1 | $ npm install hello-npm-test |
重新创建一个项目文件夹用来测试我们新写的模块,名为 my-project 。进入到该文件夹,初始化 node 项目。
1 | npm init -y |
此时,我们直接使用默认的
package.json的设置即可,因为只是用来测试的。
同样,我们新建一个 index.js 文件,并准备在该文件中使用 hello-npm-test 模块。
两种方式来引用她:
- 可以使用本地绝对路径引用的方式来使用她。
cd 进入到 my-project 文件夹中,并安装 hello-npm-test。
1 | $ npm install C:/Users/yisiw/Desktop/hello-npm-test |
然后你可以看到 my-project 文件夹中的 package.json 文件中多出了 dependencies 字段如下:
1 | { |
在 index.js 中使用她。
1 | // my-project/index.js |
然后在终端执行:
1 | $ node index.js |
没错!成功的打印出了 hellonpm,鼓掌。
- 你也可以使用
npm link将hello-npm-test包关联到全局后通过npm link hello-npm-test来使用她。
首先进入到 hello-npm-test 文件中,打开命令行,输入如下命令:
1 | npm link |
这句命令的意思是将本模块地址关联到 nodejs 的全局环境中,以便可以在本机的任何项目中使用她。
1 | $ E:\nodejs\node_modules\hello-npm-test -> C:\Users\yisiw\Desktop\hello-npm-test |
执行完 npm link 后,会出现上方的提示信息,表示 hello-npm-test 模块的副本已经安装关联到 nodejs 的全局环境中了,你可以打开如上方的路径地址找到hello-npm-test 模块文件夹,就在 (E:\nodejs\node_modules\hello-npm-test)。
为了同第一种方式区分开,我们首先把之前的 node_modules 文件夹、package-lock.json 和 package.json 中的 dependencies 字段删除,然后进入到 my-project 文件夹中。输入如下命令:
1 | npm link hello-npm-test |
执行完 npm link hello-npm-test 命令后,你会发现,my-project 文件夹中的 node_mnodules 又出现了,并且里面存在 hello-npm-test 包。那么我们再次执行:
1 | $ node index.js |
没错,同样是有用的。
将模块管理到 Github
接下来,我们应该将我们的包使用版本控制工具管理起来,方便之后的维护及更新。没错!是 Github。理所当然!
1 |
|
然后在 package.json 文件中加入 homepage 字段,并写上你的仓库地址或者项目文档地址。这样,当用户在 npm 中查看你的包信息时,就可以看到她。帮助用户熟悉并使用。
1 | { |
添加 README.md
在开发完你的包功能后,你应该创建一个 README.md 文件来描述你的包。
- 这个包怎么安装
- 这个包是用来干什么的
- 这个包解决了什么问题
- 这个包有哪些配置项及APIS
独立说明文档
如果,你的包提供的功能特别多,比如像,一些 UI 组件库,她会提供很多组件,指令,api 服务等。
那么,一个简单的 README.md 就不是很合适了,目前,推荐的方式是,使用 vuepress, hexo 等这类静态站点部署工具,来构建文档。
然后,部署在 GitHub Pages 或者 Gitee Pages 上。
这里推荐一个快速构建文档的框架: aidol 。基于 vuepress。
具体细节,可参照其说明文档,进行构建部署。
添加.npmignore
在开发你的包的过程中,你可能会新建一些依赖文件,测试文件等,比如:
1 | package-lock.json |
打包构建配置、以及 .npmignore 自身。这些都是不需要发布到 npm 上的。
判别的基本原则就是,与该包不相关且其他人引入时,不需要加载的,我们都应该进行忽略。
cd 进入到 hello-npm-test ,打开你的终端命令行敲入 touch .npmignore 在项目包的根目录下新建 .npmignore 文件。
1 | touch .npmignore |
然后在该文件中写入你要忽略的文件、文件夹配置。
1 | node_modules/ |
注意:可别把
package.json忽略掉了。这是必须上传的关键文件,该包的信息都被保存在该文件中,使用者使用导入语法导入该模块时,也是通过package.json文件中的main字段来查找入口文件。
发布到 npm
最后一步就是发布你的模块到 npm。进入到 hello-npm-test ,打开命令行。敲入如下命令:
1 | # 添加用户 |
结果:
1 | elenh@elenh MINGW64 ~/Desktop/hello-npm-test (master) |
按提示输入 用户名(Username)、密码(Password)以及邮箱(Email)后,便会提示你已经作为谁谁谁登陆到了 npm。
1 | Logged in as elenh on https://registry.npmjs.org/. |
你可以使用 npm version 查看该模块当前所处的版本:
1 | $ npm version |
当前版本为 1.0.0。
紧接着就是将包发布。
1 | # 私有包发布方式 |
在发布的过程中,你可能会遇到一些错误,比如
npm中已经有存在你当前的这个包名了。那么修改你的包名再发布。
使用
现在,你可以使用诸如:$ npm install hello-npm-test --save,这样的方式来安装你自己的包了,并且在其他项目中使用她。
1 |
|
打印结果:
1 |
|
维护和升级
你的包在不断使用的过程中,使用者们或你自己会发现,她存在某些 BUGS ,或者需要优化,再或者你需要添加新的功能 APIS。
假定,你已经对包升级完毕,那么怎样更新 npm 上的包数据呢?这同样很简单,你只需要按照 语义化版本规则 更新你的版本号后,再修改下 README.md 说明文档,指出你的哪些改动,以及新的 API 用法。
你就可以在该包根目录下打开命令行再次键入:
1 | $ npm publish --access=public |
你的包就会在 npmjs 被更新为一个新的版本。使用者们,不定期的执行 npm outdated 就会看到你的包的更新情况,并更新他们本地的包文件。
版本号更新方式
通常,当你的爱包中的代码被你优化修改了,你需要先升级你的包版本号,然后再 npm publish。你有以下两种更新版本号的方式。
- 手动修改
package.json中的version字段,注意遵循语义化版本规则。然后再npm publish。 - 使用
npm version <update_type>命令。
其中 update_type 参数有 3 个常用可选值:patch , minor 和 major。
- patch 表示补丁级别的版本更新,即递增第三位版本号
- minor 表示小版本级别的版本更新,即递增第二位版本号
- major 表示大版本级别的版本更新,即递增第一位版本号
<update_type>的其他值,不在此处列出,| premajor | preminor | prepatch | prerelease [--preid=<prerelease-id>] | from-git。
例:当前 hello-npm-test 的版本号为 1.0.1,我们现在对小版本进行更新。
1 | $ npm version minor |
如上打印结果,版本号已经升级到了第二位上,注意,因为是递增制,所以第三位版本号恢复从 0 开始。
然后你就可以将新的版本发布到 npm 了。
1 | $ npm publish --access=public |
注意:在使用 npm version <update_type> 更新版本号之前,你需要先将你的代码提交到 github 否则会调用命令失败!