【Node】包与npm:npm包的管理与发布

734 阅读4分钟

1.npm背景

作为前端开发工程师和node开发者而言,对于npm并不陌生,如npm init、npm install、npm uninstall等命令使用得如火纯青,那么npm到底是个什么呢?最近在学习《深入浅出nodejs》这本书和阅读一些博客文章,在此总结了一些对于npm的理解,此片文章记录我的一些心得。

npm是在安装nodejs环境时连同安装的包管理工具,能够解决nodejs代码部署的一些问题,能够将各种发布的模块进行联系。在对第三方包进行管理发布时,由于各个开发者编写的规范和模块都是散布的,这对于使用者而言是难以理解的,npm作为存放第三方模块的管理平台。npm允许用户下载安装别人编写的第三方包或命令行程序使用,还能将自己开发的包或命令行发布在npm平台供他人使用。

image.png

在我看来,一个npm包也是有生命周期的,从开发、发布、安装、更新、卸载/废弃等阶段,见证了一个npm插件从出生到死亡的整个过程。

2.包和包描述文件

npm主要涉及到两个主体:包(node_modules)和包描述文件(package.json

  • package.json:用于管理当前项目中所有的第三方插件和包的文件行为
  • node_modules:用于存放被nodejsrequire进行加载的任何文件和文件夹

另外,基于以上,可以看出packagemodule的关系:

  • module不一定是package(比如node内置模块),package一定是module
  • package.json文件的module一定是package
{
  "name": "jctalk",//包名
  "version": "1.0.1",//版本号
  "description": "a hello jctalk",//包的描述
  "main": "./jctalk.js",//入口文件
  "scripts": {//脚本说明对象
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [//关键词数组
    "hello",
    "jctalk"
  ],
  "author": "Jesse Liu",//作者
  "license": "MIT"//当前包所使用的许可证列表
}

3.npm包的下载、安装、卸载、发布等功能

(1)登录或注册npm账号

  • 方式一:可以前往npm官网进行自行注册,注册完之后需要进行邮箱验证方可使用。

  • 方式二:命令行注册。可以在命令行中输入npm adduser进行注册账号。

    $ npm adduser
    Username: jesseliu
    password:
    Email:jesseliu@gmail.com
    

    登录账号:

    $ npm login
    Username: jesseliu
    Password:
    Email: (this IS public) jesse@gamil.com
    Logged in as jesseliu on https://registry.npmjs.org/.
    

(2)npm初始化项目

初始化包描述文件,通过命令行进行问答式填写。

$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (jctalk) jctalk
version: (1.0.1) 1.0.1
git repository:
license: (MIT) MIT
About to write to D:\web\jctalk\package.json:

{
  "name": "jctalk",
  "version": "1.0.1",
  "description": "a hello jctalk",
  "main": "./jctalk.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "hello",
    "jctalk"
  ],
  "author": "Jesse Liu",
  "license": "MIT"
}
Is this OK? (yes) y

(3)上传发布包

首先需要先编写待发布的包文件jctalk.js

exports.jctalk = function(){
  return "hello jctalk";
}

接着输入命令进行上传发布:

$ npm  publish .
npm notice 
npm notice package: jctalk@1.0.1
npm notice === Tarball Contents ===
npm notice 57B  jctalk.js
npm notice 275B package.json
npm notice 0    readme.md
npm notice === Tarball Details ===
npm notice name:          jctalk
npm notice version:       1.0.1
npm notice package size:  369 B
npm notice unpacked size: 332 B
npm notice shasum:        0e5bca0553d5c02c8f73a3263a17fab0fe702d22
npm notice integrity:     sha512-njXdhYQMacX6f[...]SHnaVmJ3Q4htw==
npm notice total files:   3
npm notice
+ jctalk@1.0.1

此时npm文件将会把目录打包成一个存档文件,然后上传到官方源仓库中。

打开官网进行查找发布的包。

image.png

(4)安装包

为了验证自己上传的包是否成功,可以切换目录进行下载安装测试。

$ npm install jctalk
npm WARN saveError ENOENT: no such file or directory, open 'D:\web\test_jctalk\package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open 'D:\web\test_jctalk\package.json'
npm WARN test_jctalk No description
npm WARN test_jctalk No repository field.
npm WARN test_jctalk No README data
npm WARN test_jctalk No license field.

+ jctalk@1.0.1
added 1 package from 1 contributor and audited 1 package in 3.502s
found 0 vulnerabilities


(5)分析包

在进行使用npm包的过程中,如果对自己所使用的包是否导入,可以使用命令进行解析当前项目的包的目录。

$ npm ls
D:\web\test_jctalk
`-- jctalk@1.0.1

(6)更新包

在进行版本迭代的时候,需要对版本号进行更新:

+ "version": "1.0.0"
- "version": "1.0.1",

(7)取消发布

在项目开发中,可能对于一些发布的模块不更新或者需要进行销毁,可以使用:

npm unpublish jstalk --force

4.可能会遇到的问题

code E403:表示当前没有权限进行发布,即没有注册登录npm账号,或者邮箱还未验证。

npm ERR! code E403
npm ERR! 403 403 Forbidden - PUT https://registry.npmjs.org/jctalk - Forbidden
npm ERR! 403 In most cases, you or one of your dependencies are requesting
npm ERR! 403 a package version that is forbidden by your security policy.

还可能你的源设置成第三方源的时候才有可能发生,比如设置了淘宝源就可能会导致该问题。只要把源改回默认的就可以了,如下:

npm config set registry http://registry.npmjs.org

code E402:表示要进行发布私用包,但是私用包是需要进行收费的。

402 Payment Required - PUT 
http://registry.npmjs.org/@dinghx%2funifiedValidator 
- You must sign up for private packages

这是因为包名是 @xxx/xxxx npm会认为要发布私包,私包需要收费,需将发布命令改成:

npm publish --access public

包名相似

npm ERR! Package name too similar to existing packages; 
try renaming your package to '@dinghx/captcha' and publishing 
with 'npm publish --access=public' instead : your-package

邮箱没有校验

npm ERR! you must verify your email before publishing a new package
: https://www.npmjs.com/email-edit : your-package

只要登录邮箱进行验证即可。

参考文章:

1.掘金文章:二月君,NPM」发布自己的 npm 包,地址:juejin.cn/post/687776…

2.掘金文章:我是一尾,npm发布包教程,地址:juejin.cn/post/684490…

以上只是个人的学习记录,如有错误,烦请指出,感激不尽。