如何发布一个nodejs模块

1. 背景介绍

本人写了一个音乐播放器程序,想把其中核心的部分发布成Nodejs模块,这样我无论是在web端,还是桌面端都能引用该核心模块,我想在web端实现一个网友播放器,桌面端利用Electron包装一下实现一个桌面版的播放器,这样同一套代码,多端就可以共用了.说干就干, 以下记录了nodejs发布的全过程.

2. Nodejs发表流程

首先了解一下nodejs发表流程,

3. 注册npm用户

这里有两种方式,两种方式任选一种:

  • 方式一:到npm官网注册
    • 官网网址为: https://www.npmjs.com/
    • 注册过程非常简单,如果你的邮箱能正常收件的话
    • 打开官网首页后, 点击sign up按钮, 系统会导航到注册页面,输入用户名,输入密码点击创建用户即可.
    • ~~ 似乎不用验证邮箱的有效性,当然为了账号安全,务必记住密码和确保邮箱是正确的.~~
    • 补充这里创建账号后一定要去邮箱检查有没有严重邮箱的邮件, 及时进行验证, 如果过了24小时再去验证就很麻烦了, 而且影响后续的publish命令的使用.
  • 方式二:使用命令行注册
1
2
3
4
$ npm adduser
Username: your_name
Password: your_password #需要牢牢记住密码
Email: (this IS public) #正确填写你的邮箱, 方便以后找回密码

注册完成后记住用户名密码,后续步骤需要用到.

4. 创建一个nodejs模块

创建Nodejs模块可以参考我的博客文章如何创建Nodejs模块基础篇

5. 发布nodejs模块到npm中央仓库

  • 说明:publish之前需要注意一点,是我们项目中的所有文件都需要上传到npm服务器,此时我们可以创建一个.npmignore文件忽略掉不需要上传的文件, .npmignore 可以被认为是一个黑名单即包含在.npmignore文件中的文件不发布,这样会带来一些麻烦,每增加一个源文件,都需要调整.npmignore文件,而调整文件这件事是很容易被忘记的,如果新增文件中包含了CI/CD等等的保密信息,有可能无意中发布出去,存在一定的安全风险. 所以这里最好使用白名单,或者白名单与黑名单结合.白名单需要在package.json的files上设置.例如

    package.json

    1
    2
    3
    4
    5
    6
    7
    "files": [
    "package.json",
    "greeting.js",
    "audioplayer.js",
    "README.md",
    "index.js"
    ]
  • 全局安装 nrm 并切换到npm registry

    1
    2
    sudo cnpm install -g nrm 
    nrm use npm
    • 或者手动修改~/.npmrc 将registry改回到npm registry https://registry.npmjs.org/

    • 或者 命令行切换到npm registry

      1
      npm config set registry https://registry.npmjs.org/
  • 首先在命令行中登录nodejs

    1
    2
    3
    4
    5
    $npm login
    Username: your_usename #输入用户名
    Password: your_password   #输入用户名
    Email: (this IS public) your_email #输入邮箱
    Logged in as xxxxx on https://registry.npmjs.org/.
  • 成功之后,npm会把认证信息存储在~/.npmrc中,可查看npm当前使用的用户:

    1
    $npm whoami
  • 开始发布

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $npm publish
    npm notice
    npm notice 📦 h5-audio-player@0.1.0
    npm notice === Tarball Contents ===
    npm notice 13.1kB audioplayer.js
    npm notice 230B greeting.js
    npm notice 57B index.js
    npm notice 348B package.json
    npm notice 1.0kB README.md
    npm notice === Tarball Details ===
    npm notice name: h5-audio-player
    npm notice version: 0.1.0
    npm notice package size: 4.2 kB
    npm notice unpacked size: 14.8 kB
    npm notice shasum: f0719dcd923b9b6806e66c03e7aaf5409d16b00c
    npm notice integrity: sha512-3eKgKEQpgfMx0[...]ci2QctFZaH/PQ==
    npm notice total files: 5
    npm notice
    + h5-audio-player@0.1.0

6. 验证发布是否成功

  • 首先创建一个测试文件夹

  • 然后切换回淘宝npm镜像

    1
    2
    3
    4
    $mkdir test   #建测试文件夹
    $cd test #进入测试项目
    $nrm use taobao #切换回淘宝npm镜像
    $cnpm install h5-audio-player@0.1.0 #安装刚刚发布的包
  • 安装完成后项目的目录结构如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $tree test
    test
    └── node_modules
    ├── h5-audio-player -> _h5-audio-player@0.1.0@h5-audio-player
    └── _h5-audio-player@0.1.0@h5-audio-player
    ├── audioplayer.js
    ├── greeting.js
    ├── index.js
    ├── package.json
    └── README.md
  • 执行测试用例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ~/proj/test
    $node
    Welcome to Node.js v14.17.6.
    Type ".help" for more information.
    > let player = require('h5-audio-player');
    undefined
    > player.add(2, 3);
    2 + 3 =5
    5
    > player.greeting();
    hello, world
    undefined
    > .exit

7. 删除npm包

  • 有些时候发现发布的包有bug或有安全风险,还可以进行删除,npm给我们留下了反悔的机会.
    1
    2
    3
    4
    npm unpublish --force //强制删除
    npm unpublish packageName@1.0.0 //指定版本号
    npm deprecate //某些情况
    npm unpublish packageName --force //npm撤销(24小时内可以撤销)

8. 参考文章

9. Trouble Shooting

9.1. 登录npm服务器失败

1
2
3
4
5
6
$npm login
Username: xxxx
Password:
Email: (this IS public) xxxxx@gmail.com
npm ERR! code E409
npm ERR! 409 Conflict - PUT https://registry.npm.taobao.org/-/user/org.couchdb.user:xxx - [conflict] User xxxx already exists

原因分析:
可以看出报错出现了taobao.org 这不是我想要的,我想要的是发表到npmjs.org
详细原因可以参考这篇文章有关 npm login 和publish 的疑惑

解决方案有两个
可以全局安装 nrm

1
2
3
sudo cnpm install -g nrm 
nrm use taobao
nrm use npm

9.2. 发布时提示24小时内不让上传

403 Forbidden - PUT https://registry.npmjs.org/h5-audio-player - h5-audio-player cannot be republished until 24 hours have passed
原因分析:
出现这个原因是因为输入的邮箱📮没有校验,⚠️查看手机的邮箱的文件点击验证!!!

10. Nodejs 系列文章

最新更新以及更多Nodejs相关文章请访问 鹏叔的技术博客 - Nodejs