NPM 快速入门指南

引言
自 2009 年 5 月 28 日发布至今,Node.js 的包管理器 npm 已然成为全球最大的软件注册机构。
它不仅帮你安装第三方库,还承包了依赖管理、自动化脚本甚至项目构建,几乎贯穿现代前端与 Node.js 项目的整个生命周期,堪称开发的“命脉”之一。
本指南将带你从零开始快速掌握 npm 的核心用法,轻松上手项目开发 🚀 。
环境安装
首先,要使用 npm 包管理器,就需要安装 Node.js 环境,没安装的话可前往 Node.js 官网自行下载安装。
安装成功后,打开终端,执行以下命令确认是否成功:
node -v && npm -v
如果控制台成功打印出了两个版本号,恭喜你 🎉 ,环境已就绪!
搜索包
想查找某类相关库时,可以通过关键词搜索:
npm search [keyword]
它会列出相关包的简介和版本,方便你快速筛选。
查看包
想了解包的描述、作者、依赖、版本等详情,可使用:
npm view [package-name]
默认只显示当前最新版本,如果你想看所有历史版本,可以加上参数:
npm view [package-name] version
除此之外,如果你只想确认一个包是否存在,这个命令也能帮上忙。
安装包
最基础的安装方式如下:
npm install [package-name]
如果该包只在开发阶段用到,可以作为开发依赖安装:
npm install [package-name] --save-dev
全局安装方式如下,让所有项目都能访问这个包:
npm install [package-name] --global
需要某个特定版本的包,可以在包名后指定版本号:
npm install [package-name]@[version]
想确保使用的是最新稳定版,这样写就对了:
npm install [package-name]@latest
可能有人会好奇,这种安装方式和 npm install [package-name] 有什么区别?
- 【场景一】项目中首次安装该包,两者的表现一致,都是将最新的稳定版本安装到项目中:
npm install axios
# 等同于
npm install axios@latest
- 【场景二】更新已存在的包
如果在 package.json 中已有版本约束,例如 axios: ^1.0.0,那么这两者区别如下:
npm install axios # 只会更新到符合 ^1.0.0 约束的最新版本,例如是 1.6.2
npm install axios@latest # 强制更新到最新版本,可能是 2.0.0,会突破原有约束
无论哪种方式,最终都会更新 package.json 和 node_modules,确保项目依赖一致可控。
版本范围符号
在 package.json 中,版本号前常见的符号含义如下:
| 符号 | 含义 | 示例 | 允许的版本范围 |
|---|---|---|---|
^ | 兼容版本更新,不允许主版本号变化 | ^1.2.3 | 1.2.3 ≤ 版本 < 2.0.0 |
~ | 补丁版本更新,不允许次版本号变化 | ~1.2.3 | 1.2.3 ≤ 版本 < 1.3.0 |
| 无符号 | 严格锁定版本 | 1.2.3 | 仅 1.2.3 |
>= | 大于等于指定版本 | >=1.2.3 | 1.2.3 及以上所有版本 |
已安装包的列表
想查看当前项目安装了哪些包,可以使用:
npm list
如果想查看全局安装的包:
npm list --global
只查看顶级依赖(不显示嵌套依赖):
npm list --depth=0
更新包
要升级现有依赖包,可以使用:
npm update [package-name]
卸载包
不再需要的包可以这样卸载:
npm uninstall [package-name]
卸载后会从 package.json 和 package-lock.json 中移除对应记录。
发布包
既然可以下载并使用别人写的包,那么自然也可以发布你写的包,供别人使用。接下来,就让我带你从零构建一个包,并将它发布到 npm 吧。
登录账号
第一步,你需要拥有一个 npm 账号,若还没有,可以 前往注册 。
若有账号,在终端执行登录命令:
npm login
根据提示依次输入用户名、密码和邮箱地址,登录成功后会看到提示:
Logged in on https://registry.npmjs.org/.
创建项目
假如我们要发布一个叫做 package_name 的包,可以创建一个项目目录,并初始化:
mkdir package_name
cd package_name
npm init -y
执行完成后,我们的项目根目录下会出现 package.json 文件,内容大致如下:
{
"name": "package_name",
"version": "1.0.0",
"main": "./dist/index.js",
"module": "index.js",
"scripts": {},
"keywords": [],
"author": "demigodliu",
"license": "MIT",
"description": "desc"
}
TIP
main 字段表示的是 CommonJS 规范的入口文件,module 字段表示的是 ES6 规范的入口文件。
功能编写
在功能编写的时候,建议使用 ES6+ 语法,发布时再进行编译为 ES5 语法即可。这样子你的包就可以同时兼容现代环境和传统环境了。
如果你使用的是 ES Module,别忘了在 package.json 中配置:
"type": "module"
发布项目
功能编写完成后,执行以下命令进行发布:
npm publish
发布成功后,其他开发者就可以搜索,并且安装你的包了!
更新版本
如果你更新了包并且希望再次发布,那你必须将 package.json 中的 version 值更新,否则 npm 会阻止你重复发布同一版本号的包。
删除项目
假如你想删除这个包项目,不希望别人再使用,那么可以执行以下命令将其从 npm 中删除:
npm unpublish package_name
WARNING
仅能删除发布 72 小时以内的包,并且操作是不可逆的,需要谨慎操作。
常用配置速查
在 package.json 文件中,它记录了当前项目的元信息和依赖,是 npm 项目的核心文件,下面是一些基础字段的作用说明:
| 字段 | 说明 | 示例 |
|---|---|---|
| name | 包名称,必须唯一,建议小写无空格 | "my-utils" |
| version | 当前包的版本,需符合语义化版本规范 | "1.0.0" |
| description | 包的简要描述 | "A lightweight utility library" |
| main | CommonJS 环境下的入口文件路径 | "./dist/index.js" |
| module | ESModule 环境下的入口文件路径 | "./dist/index.mjs" |
| types | 类型声明入口(用于 TypeScript 支持) | "./types/index.d.ts" |
| scripts | 自定义命令脚本 | { "build": "vite build", "test": "vitest" } |
| dependencies | 项目运行时依赖 | { "vue": "^3.4.0" } |
| devDependencies | 项目开发时依赖 | { "vite": "^5.0.0" } |
| peerDependencies | 对等依赖,要求使用者项目同时安装 | { "vue": "^3.0.0" } |
| keywords | npm 搜索关键字 | [ "utils", "npm", "toolkit" ] |
| author | 作者信息 | "demigodliu demo@example.com" |
| license | 许可证类型 | "MIT" |
| repository | 代码仓库地址 | "git+https://github.com/yourname/repo.git" |
| files | 发布到 npm 的文件列表 | [ "dist", "types" ] |
| engines | 限定支持的 Node 或 npm 版本 | { "node": ">=16.0.0" } |
| private | 是否私有,防止被发布 | true |
尾声
本文带你快速掌握了 NPM 的基础用法,涵盖了从依赖安装到包发布的核心操作。
如果想深入了解如何在大型项目中高效使用 NPM,欢迎继续阅读:《高级 NPM 使用技巧:构建大型项目的实践经验》。
学会用刀只是入门,学会挥刀才是关键,高级用法里,我们不见不散 👋🏻 。