文章目录
说明:
原谅参考自sf社区文章,这里只是做总结提炼,原谅链接:npm发布包教程
关于npm的基本认知
是什么?(node package manager)
基本认识
- 是一个辅助前端开发的包管理工具
- 管理对象:包(package)
- 管理方式:
- 增(发布
npm publish
, 安装:npm install
) - 删(废弃:
npm deprecate
|npm unpublish xx --force
;卸载:npm uninstall
) - 改(更新:
npm update
) - 查(搜索:
npm info xxx
)
- 增(发布
- npm中涉及到的主体主要有两种:
package
(含有pakcage.json描述文件并发布到npm仓库的文件或文件夹)和module
(在node_modules中,可以被Node.js的require方法加载的任何文件或文件夹)- 两者关系:`一个JavaScript程序,从本地发布到npm仓库时是package,从npm仓库下载到本地时就变成了module
package(包)
- 主要两个重要属性:
- Scope(作用域,范围)
一旦注册个人或者团体账户,就获得了与个人或者团体名相匹配的scope,可以用这个scope作为包的命名空间,例如@yuyy、@58。
分类:
- unscoped: 如babel
- scoped:
- user:如@test/babel
- org: @babel/parser
- 作用:为你自己发布的包提供命名空间,防止与他人的包名冲突
- Accessibility(可访问性)
属性值有:
- private: 私有,仅作者本人或者团队成员可见
- public: 公有,所有人可见
module(模块)
下载到本地的module主要是用于在node环境中被引用,为了能被 require方法加载,module必须是下列情况之一:
- 包含package.json,且package.json中有
main
字段的文件夹 - 含有index.js的文件夹
- JS文件
发布包
- 前提条件:注册一个npm账户
npm官方建议规范的包至少包含:
- package.json(包的基本信息)
- README.md(文档)
- index.js(入口文件)
发布一个unscoped包
- 创建必要的文件
# 创建项目
mkdir test && cd test
# 创建package.json
npm init
# 创建README.md(随便的测试内容)
# 创建index.js
module.exports = {
printMsg: function () {
console.log('this message is from yuyy-test-pkg!');
}
}
- 发布
npm publish
- 可能报的错
- 未登录:
need auth auth required for publishing
, 解决办法:npm adduser
- 仓库地址错误:
npm ERR! code E409 registry returned 409 for put
,原因:可能本地使用的仓库是cnpm不是npm, 解决办法:用nrm切换到npm仓库,执行命令nrm use npm
- 未登录:
- 在npm官网搜索查看(个人账号下的packages中可查)
发布一个scoped包
- 如@sophieu/test
- 创建项目及文件
mkdir test && cd test
# 创建package.json
npm init
# 创建README.md
# 创建index.js
- 加作用域
npm init --scope=@sophiewu -y
@符号后面的是你注册npm账户时的username,如果不记得可以通过
npm whoami
查询。上面的命令其实是在重新生成package.json,只是会给包增加了作用域
- 公共发布
由于使用
npm publish
发布scoped包默认是私有发布的需要收费,这里使用公共发布
npm publish --access public
- 以上发布我,项目名是test,最终发布的包名是
@sophiewu/test
,可见发布的包名可以和项目名不一致,包名取决于package.json中的name字段。
过滤部分文件
npm publish 的时候会把项目目录里面所有的文件都publish到npm仓库中, 但是往往有一部分目录和文件不想发布上去,比如项目的源码、编译脚本等等信息。
只发布用户需要使用的相关文件:
- 方法一: 使用
.gitignore
设置忽略哪些文件 - 方法二: 使用
.npmignore
设置忽略哪些文件 - 方法三:使用
package.json 的 files
字段选择发布哪些文件
npm包的迭代
npm包的每次迭代都要涉及到两个方面:
- 内容的变更
- 版本的变更
npm的版本管理
npm采用语义化版本,共三位,以’.’隔开,从左至右依次代表:主版本(major)、次要版本(minor)、补丁版本(patch)。
- 变更版本号的命令:
npm version <major|minor|patch>
npm version minor
# 执行结果: v1.1.0, package.json中的version从原来的v1.0.0--->v1.1.0
- 查看版本
npm view xxx versions
- 安装更新
npm up xxx
废弃/删除
npm包发布后可以对包进行废弃或删除操作,废弃和删除的区别在于:
- 废弃不会将包或版本从npm仓库删除,仍然可以继续下载安装,并在安装的时候会有警示
- 删除会将包从npm彻底删除,无法被下载安装
无论是废弃还是删除,都包含两个层面:
- 版本的废弃/删除
- 包的废弃/删除
废弃
# 废弃指定版本
npm deprecate yuyy-test-pkg@1.1.0 'test deprecate'
# 安装废弃版本
npm i yuyy-test-pkg@1.1.0
删除
npm不鼓励任何形式的删除,主要因为我们发布的包可能已经被其他人引用,如果我们删除了此包,其他人在重新安装含有我们包的依赖的工程时,出现找不到包问题。
基于此,npm做了相关的删除限制:
- 删除的版本24小时后方可重发!
- 只有发布72小时之内的包可以删除!
# 删除
npm unpublish yuyy-test-pkg --force
npm unpublish @yuyy/babel --force
nrm源管理工具
nrm(npm registry manager )是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换
- 安装
npm install -g nrm
- 使用:
# 查看所有源(带*的是当前使用的源)
nrm ls
# 切换源
nrm use taobao
# 增加源
nrm add registry http://registry.npm.frp.trmap.cn/
# 删除源
nrm del <registry>
# 测试源速度
nrm test npm