NPM的发包流程
一、什么是NPM
npm全称 node package manager ,是一个辅助前端开发的包管理工具。
包括:
网站:找包、注册用户
命令行:程序员与npm交互的主要形式
仓库:最大的JavaScript软件库
管理对象:包(package)
管理方式:
增(发布:npm publish;安装:npm i)
删(废弃:npm deprecate;卸载:npm rm)
改(更新:npm up)
查(搜索:npm s)
npm中涉及到的主体主要有两个:package和module,定义如下:
package:含有package.json描述文件并发布到npm仓库的文件或者文件夹
module:在node_modules中,可以被Node.js的require()方法加载的任何文件或文件夹
可以这样理解:一个JavaScript软件,从本地发布到npm仓库时是package,从npm仓库下载到本地时就变成了module
另外,基于以上,可以看出package和module的关系:
module不一定是package(比如node内置模块),package一定是module
含package.json文件的module一定是package
二、package (包)
Scope (作用域、范围)
一旦注册个人或者团体账户,就获得了与个人或者团体名相匹配的scope,可以用这个scope作为包的命名空间,例如@vue、@heihei 用:为你自己发布的包提供命名空间,防止与他人的包名冲突。有两种大分类:
unscoped:例如babel
scoped
user:例如@heihei/babel
org:@babel/parser
Accessibility (可访问性)
属性值有:
private:私有,仅作者本人或团队成员可见
public:公有,所有人可见
此属性和github创建仓库时设定访问性的策略一致:公有,所有人可见,免费;私有,仅自己可见,收费。
三、module (模块)
下载到本地的module主要是用于在node环境被引用,为了能被Node.js的require()方法加载,module必须是下列情况之一:
包含package.json,且package.json中有main字段的文件夹
含有index.js的文件夹
JavaScript文件
四、发布包
- 注册npm账号
注册地址:https://www.npmjs.com/signup
全名:
邮箱:
用户名:重要!发布scoped包时会用到
密码:
2.发布包
首先,官方建议规范的包至少包含:
package.json(包的基本信息)
README.md(文档)
index.js (入口文件)
2.1 发布一个unscope 包
(1) 创建项目
新建一个文件夹,如shifone-test,进入文件夹执行:
npm init -y
修改package.json里面对应字段为你的信息,比如name就是你将要上传的包名,main是你的入口文件。
{
"name": "shifone-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
(2) 创建README.md
### shifone-test
This is my first npm package!
It is just for learning.
(3) 创建入口文件index.js
module.exports = {
hello: function () {
console.log('hello, this is message from shifone-test !');
}
}
最终的目录结构
└── shifone-test
├── README.md
├── index.js
└── package.json
(4) 发布
首先执行 npm login 登陆上面你注册的账号:
执行 npm publish 发布包:
此时去npm官网已经能够搜到你发布的包了,此时就可以按照平常使用其他包一样使用 npm install shifone-test 来安装了。
2.2 发布一个scope 包
假设此时心血来潮,我的包也想叫 babel ,这时候第一反应是不是改 package.json 里面的name字段,当满怀兴奋的敲入 npm publish的时候,啪啪啪的打脸就开始了,因为 babel 已经存在,并且你不是babel的发布者。但是我就想用 babel 怎么办,这时候就需要发布一个 scope 包。
npm ERR! publish Failed PUT 401
npm ERR! code E401
npm ERR! This package requires that publishers enable TFA and provide an OTP to publish. For more info, visit: https://go.npm.me/2fa-guide : babel
(1) 第一步,加作用域
npm init --scope=@shifone -y
@符号后面的是你注册npm账户时的username,如果不记得可以通过npm whoami查询。
这时候package.json 就是这样的:
{
"name": "@shifone/babel",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
(2)再次发布
npm publish
怎么又炸了。。。。
npm ERR! publish Failed PUT 402
npm ERR! code E402
npm ERR! You must sign up for private packages : @heihei/babel
原因:
看开头scope的介绍发现 npm publish 发布 scope包时候默认是私有发布的,但是呢,你又没交保护费,不想花钱,只能发布public。在这里插入代码片
npm publish --access public
至此,npm发布过程已经介绍结束,此时发布的scope包可以跟正常包一样使用。
下一篇介绍一下怎么迭代包的版本、废弃、删除一个包。
注:部分内容来自网络,侵权删除。