1.npm背景
作为前端开发工程师和node开发者而言,对于npm并不陌生,如npm init、npm install、npm uninstall等命令使用得如火纯青,那么npm到底是个什么呢?最近在学习《深入浅出nodejs》这本书和阅读一些博客文章,在此总结了一些对于npm的理解,此片文章记录我的一些心得。
npm是在安装nodejs环境时连同安装的包管理工具,能够解决nodejs代码部署的一些问题,能够将各种发布的模块进行联系。在对第三方包进行管理发布时,由于各个开发者编写的规范和模块都是散布的,这对于使用者而言是难以理解的,npm作为存放第三方模块的管理平台。npm允许用户下载安装别人编写的第三方包或命令行程序使用,还能将自己开发的包或命令行发布在npm平台供他人使用。
在我看来,一个npm包也是有生命周期的,从开发、发布、安装、更新、卸载/废弃等阶段,见证了一个npm插件从出生到死亡的整个过程。
2.包和包描述文件
npm主要涉及到两个主体:包(node_modules)和包描述文件(package.json)
package.json:用于管理当前项目中所有的第三方插件和包的文件行为node_modules:用于存放被nodejs的require进行加载的任何文件和文件夹
另外,基于以上,可以看出package和module的关系:
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文件将会把目录打包成一个存档文件,然后上传到官方源仓库中。
打开官网进行查找发布的包。
(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…
以上只是个人的学习记录,如有错误,烦请指出,感激不尽。