一、你真的需要发包吗?
不是所有代码都值得发 npm。
一般适合发包的情况是:
- 通用工具函数 / SDK
- 多个项目都会用到的逻辑
- 希望别人能直接
npm install用 - 公司内部的私有包
如果只是单项目用的小工具,放在仓库里反而更省事。
二、npm 账号
如果你已经有账号,可以直接跳过。
1 | npm login |
按提示输入:
- username
- password
登录成功后确认一下:
1 | npm whoami |
能看到用户名,说明 OK。
三、项目配置
重点关注 package.json,字段说明:
1 | { |
坑点一:name
- 不能有大写字母
- 不能和 npm 上已有的包重名
- 强烈建议使用 scope:
@scope/name
scope 是为了防撞名。
坑点二:version
npm 的规则很简单粗暴:
版本号不变,绝对发不了包
推荐用 npm 自带命令管理版本:
1 | npm version patch # 修 bug |
它会自动:
- 修改
package.json - 打 git tag(如果是 git 仓库)
四、控制发布内容
npm 默认会把几乎所有文件都发上去。
如果你不控制,可能会把这些一起发布:
- src
- test
- 各种配置文件
- 本地脚本
推荐方式:使用 files
1 | "files": ["dist"] |
这是白名单机制,最安全、最直观。
发布前一定做的一步
1 | npm pack |
它会生成一个 .tgz 文件,相当于发布预览。
解压看一眼,确认里面真的是你想让别人安装的内容。
五、构建
如果你用的是:
- TypeScript
- Babel
- 打包工具
那基本流程一定是:
1 | npm run build |
确保:
dist/真实存在main / types指向的文件真的在包里
npm 不会自动 build,你不 build,它就发“空气”。
六、发布
普通包
1 | npm publish |
scope 包
1 | npm publish --access public |
如果不加这个参数,十有八九会遇到权限或 private 相关报错。
七、验证
别半场开香槟,验证下:
1 | npm view your-package-name |
或者新建目录测试安装:
1 | npm install your-package-name |
能装、能用,才算真的完成。
八、坑点回顾
❌ 忘了改 version
解决方案只有一个:
改版本号,再发。
❌ main / types 写对了,但文件不存在
表现是:安装成功,一 import 就炸。
排查思路:
- 文件路径是否真实存在
npm pack后包里有没有这个文件
❌ 不该发布的文件被发上去了
解决方案:
- 用
files控制范围 - 每次发包前
npm pack
❌ 二级认证(2FA)导致发布失败 / CI 发不了包
很多人第一次开 2FA,是在“安全感”里翻车的。
常见报错/表现:
- 本地
npm publish要求输入一次性验证码(OTP) - CI 里
npm publish直接失败(因为没人能交互式输入 OTP) npm login/npm publish提示你需要--otp=xxxxxx- 使用了 token 但仍然提示 2FA 或权限不足
排查与解决思路:
- 先确认你账号的 2FA 策略
在 npm 官网的账户安全设置里,2FA 常见有两种:
- 仅对“发布/修改包”启用 2FA(推荐,且对自动化更友好)
- 对“登录”也启用 2FA(更严格,但会让 CI/脚本更麻烦)
如果你把 2FA 开在“登录”,那 CI 里用用户名密码登录基本走不通。
- 本地发布:按需加
--otp
当提示 OTP 时,直接带上:
npm publish --otp=123456
OTP 有时间窗口,输慢了就会失效。
- CI/自动化发布:不要用交互式登录,改用 Token
正确姿势是:
- 在 npm 创建 Automation Token(或者至少是 Publish 权限的 token)
- 在 CI 里写入
NPM_TOKEN,通过.npmrc使用 token
关键点:CI 需要的是“非交互式凭证”,而不是 OTP。
- 注意:2FA + Token 不是“随便一配就行”
- 如果你启用了“对登录也 2FA”,某些流程下 token 仍可能被限制/需要额外配置
- 确保 token 具备发布范围(scope)的权限
- scope 包发布仍可能需要
--access public
- 强烈建议保存 Recovery Codes(恢复码)
手机丢了/验证器没了,恢复码是你找回发布权限的最后一根绳。
总结:本地发布可以
--otp,自动化发布要用 token;2FA 开在“发布”通常比开在“登录”更符合实际工程流程。