如何发布 Node 包到 npm?
· 5 min read
npm 发包的核心流程 10 年没变,但 撤销规则 和 版本工具 换了 3 轮。
- 登录:
npm login+ 2FA OTP(2023 年起强制) - files:
package.json白名单 +.npmignore兜底 - 版本号:
npm version自动 bump,禁手改 - 撤销:24h 后禁止 unpublish
- 废弃:
npm deprecate比 unpublish 安全 - 工具:changesets 取代 standard-version
登录认证:起点仍然是 npm login
2016 年这节的 npm adduser 命令今天已经被标为 npm login 的别名,二者效果完全一样,直接用 npm login 就行:
npm login
Username: YOUR_USER_NAME
Password: YOUR_PASSWORD
Email: YOUR_EMAIL@domain.com
# One-time Password (OTP) ← 2023 年起强制
登录成功后凭据存 ~/.npmrc,验证当前身份:
npm whoami
注意:2023 年起 npm 给所有账户强制开启 2FA,登录和首次发包都需要 OTP(一次性密码)。这不是可选项,npm 会在第一次 npm publish 之前强制引导你配置。
files 字段控制发布范围
默认行为:npm 读 .npmignore,没有就 fallback 到 .gitignore。但 .gitignore 通常会忽略 dist/、lib/ 这些应该发出去的目录——继续 fallback 下去就 publish 不出能用的包。
正确做法是在 package.json 用 files 字段白名单声明:
{
"files": ["dist", "lib", "es"]
}
files 数组支持 minimatch glob,lib/**/*.js 也合法。node_modules/ 默认不打包,要发依赖请用 bundledDependencies。
.npmignore 写法跟 .gitignore 一致,但优先级高于 files——写在 .npmignore 里的文件即使在 files 里声明了也会被排除。
调试技巧:拿不准到底发了什么文件,用 npm pack --dry-run 列出 tarball 内容,比反复 publish + 安装调试快得多。