1. 准备工作
1.1 创建 npm 账号
- 访问 npm 官网 注册账号。
- 验证邮箱(必须完成验证才能发布包)。
1.2 本地登录 npm
在终端执行:
npm login
按提示输入:
- Username: 你的 npm 用户名
- Password: 密码(输入时不可见)
- Email: 注册时绑定的邮箱
登录成功后会提示:Logged in as <username> on https://registry.npmjs.org/.
1.3 初始化项目
创建一个空目录,并初始化 package.json:
mkdir my-package
cd my-package
npm init -y
根据需要修改 package.json 中的字段(如 name, version, description, main 等)。
2. 编写包代码
2.1 核心代码
- 在项目中编写功能代码(如
index.js)。 - 入口文件需与
package.json中的main字段一致(默认index.js)。
2.2 添加必要文件
README.md: 包的说明文档(必备)。LICENSE: 开源协议(可选但推荐)。tests/: 单元测试(可选但推荐)。
3. 配置 package.json
确保以下字段正确:
{
"name": "my-package", // 包名(全局唯一,需检查是否已被占用)
"version": "1.0.0", // 版本号(遵循语义化版本规范)
"description": "A demo package",
"main": "index.js", // 入口文件
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": ["demo", "example"],
"author": "Your Name",
"license": "MIT"
}
关键注意事项:
-
包名规则:小写字母、数字、连字符(
-),不能有空格或特殊符号。 -
版本号规则:
主版本号.次版本号.修订号(如1.2.3)。 -
唯一性检查:
npm view <package-name>若返回
404表示包名可用,否则需修改包名。
4. 发布包
4.1 执行发布命令
在项目根目录运行:
npm publish
成功后会提示:+ my-package@1.0.0。
4.2 发布范围包(Scoped Package)
若使用组织或私有包,需在 package.json 中添加 scope:
{
"name": "@my-org/my-package",
"version": "1.0.0"
}
发布时需指定访问权限:
npm publish --access public # 公开 Scoped 包
5. 更新包版本
5.1 手动修改版本号
直接修改 package.json 中的 version 字段(如 1.0.1)。
5.2 使用 npm version 命令
自动更新版本并生成 Git Tag:
npm version patch # 1.0.0 → 1.0.1
npm version minor # 1.0.1 → 1.1.0
npm version major # 1.1.0 → 2.0.0
更新后重新发布:
npm publish
6. 撤销已发布的版本
6.1 快速撤销(24小时内)
npm unpublish <package-name>@<version> --force
6.2 弃用某个版本
npm deprecate <package-name>@<version> "Deprecated due to critical bug"
7. 常见问题与解决方案
7.1 包名已存在
- 修改
package.json中的name字段,尝试其他名称。
7.2 未登录或权限不足
- 重新登录:
npm login。 - 检查账号是否为包所有者。
7.3 发布内容包含敏感文件
-
添加
.npmignore文件(类似.gitignore),或使用files字段指定要包含的文件:{ "files": ["dist", "index.js"] }
7.4 检查发布内容(模拟发布)
npm publish --dry-run
完整流程示例
# 1. 初始化项目
mkdir my-package
cd my-package
npm init -y
# 2. 编写代码
echo "console.log('Hello World!');" > index.js
# 3. 登录 npm
npm login
# 4. 发布
npm publish
# 5. 更新版本并重新发布
npm version patch
npm publish