npm从入门到精通一篇全

发布于:2025-08-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

npm能帮我们高效管理项目依赖,还能规范开发流程、提升协作效率。本文将从基础到进阶,全面讲解 npm 的使用方法。

一、npm 是什么?

npm 是随同 Node.js 一起安装的包管理工具,全称为 Node Package Manager。主要功能是管理项目所需的第三方代码,称为“包”或“模块”,同时也是全球最大的开源软件注册表,托管了超过 200 万个包,涵盖从前端框架到后端工具的各类开发资源。

简单来说,npm 就像一个“代码超市”:

  • 开发者可以从“超市”免费获取别人写好的代码(安装包);
  • 也可以把自己写的代码放到“超市”供他人使用(发布包);
  • 还能通过它记录项目需要哪些“商品”,确保在任何环境都能复现相同的依赖配置。

二、npm 能做什么?

npm 的核心价值在于解决开发中的依赖管理流程标准化问题,具体功能包括:

1. 依赖管理:清晰记录项目所需包

通过 package.json 文件记录项目依赖的包及其版本,避免“代码在我电脑上能运行,在你那却报错”的问题。安装的包会统一存放在 node_modules 目录中,无需手动下载和管理文件。

2. 版本控制:语义化版本确保稳定性

采用 SemVer(语义化版本) 规范管理包版本,格式为 主版本号.次版本号.修订号(如 4.17.21):

  • 主版本号(Major):不兼容的 API 变更(如 1.0.0 → 2.0.0);
  • 次版本号(Minor):新增功能但兼容旧版本(如 4.17.0 → 4.18.0);
  • 修订号(Patch):仅修复 bug 且兼容旧版本(如 4.17.20 → 4.17.21)。

3. 锁文件:锁定依赖版本

安装依赖后会生成 package-lock.json 文件,精确锁定每个依赖的具体版本、安装路径和依赖树结构。无论在开发环境、测试环境还是生产环境,只要有锁文件,安装的依赖版本就完全一致,避免版本差异导致的兼容性问题。

4. 脚本运行:标准化开发流程

package.json 中定义自定义脚本(如启动项目、构建、测试等),通过 npm run <脚本名> 执行,统一团队开发命令。例如:

  • npm start 启动项目;
  • npm test 运行测试;
  • npm run build 打包代码。

5. 包发布与共享:成为开源贡献者

支持将自己开发的包发布到 npm 注册表,与全球开发者共享代码。也可搭建私有仓库,管理公司内部专用的包,保障代码安全。

三、npm 基础使用

使用 npm 前需先安装 Node.js,以下是基础操作流程:

1. 安装 Node.js 与 npm

  • 访问 Node.js 官网 下载对应操作系统的安装包(推荐 LTS 长期支持版);
  • 安装完成后,打开终端/命令行,输入以下命令验证安装:
    node -v  # 查看 Node.js 版本,如 v20.10.0
    npm -v   # 查看 npm 版本,如 v10.2.3
    
    若返回版本号,说明安装成功。

2. 初始化项目:生成 package.json

package.json 是项目的“身份证”,记录项目名称、版本、依赖等核心信息。初始化步骤:

  1. 新建项目文件夹(如 my-npm-project),并在终端进入该文件夹:
    mkdir my-npm-project && cd my-npm-project
    
  2. 执行初始化命令:
    npm init  # 交互式初始化,需手动输入项目信息
    # 或使用默认配置快速初始化(推荐)
    npm init -y
    
  3. 生成的 package.json 结构如下(默认配置示例):
    {
      "name": "my-npm-project",  // 项目名称(小写,无空格)
      "version": "1.0.0",        // 版本号(遵循 SemVer)
      "description": "",         // 项目描述
      "main": "index.js",        // 入口文件
      "scripts": {               // 自定义脚本
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],            // 项目关键词(用于 npm 搜索)
      "author": "",              // 作者
      "license": "ISC"           // 开源协议(默认 ISC)
    }
    

四、核心操作

安装依赖是 npm 最常用的功能,根据依赖用途不同,分为生产依赖开发依赖,安装方式略有差异。

1. 安装生产依赖(项目运行必需)

生产依赖是项目运行时必须的包(如 React、Vue 等框架,Express 等后端库),安装命令:

npm install <包名>
# 简写:npm i <包名>

示例:安装 Express 框架(用于 Node.js 后端开发):

npm install express

执行后,会发生三件事:

  • 包被下载到项目的 node_modules 文件夹;
  • package.json 中新增 dependencies 字段,记录包名和版本:
    "dependencies": { "express": "^4.18.2" }
    
  • 生成/更新 package-lock.json,锁定具体版本和安装路径。

2. 安装开发依赖(仅开发时需要)

开发依赖是开发阶段使用的工具(如代码检查工具 ESLint、测试工具 Jest、打包工具 Webpack 等),项目运行时不需要。安装命令:

npm install <包名> --save-dev  # 完整写法
# 简写(推荐)
npm install <包名> -D

示例:安装 ESLint 作为开发依赖:

npm install eslint -D

执行后,package.json 中新增 devDependencies 字段:

"devDependencies": { "eslint": "^8.56.0" }

3. 安装指定版本的包

默认安装最新版本,若需指定版本,格式为 包名@版本号

# 安装 4.17.21 版本的 lodash
npm install lodash@4.17.21
# 安装 18.x 系列的 React(主版本号固定为 18)
npm install react@18

4. 安装全局包(跨项目使用)

部分工具需要全局安装(如 Vue 脚手架、PM2 进程管理工具),使用 -g 参数:

# 全局安装 Vue CLI
npm install @vue/cli -g
# 全局安装后可直接在终端使用命令
vue --version

5. 卸载依赖

不再需要的包可以卸载,命令:

# 卸载生产依赖
npm uninstall express
# 卸载开发依赖
npm uninstall eslint -D
# 卸载全局包
npm uninstall @vue/cli -g

卸载后,package.jsonpackage-lock.json 会自动移除该包的记录。

6. 批量安装依赖

当我们从 Git 克隆项目或复制他人项目时,通常没有 node_modules 文件夹,此时只需执行:

npm install  # 简写:npm i

npm 会读取 package.jsonpackage-lock.json,自动安装所有依赖到 node_modules,快速复现开发环境。

五、npm 脚本:自动化开发流程

npm 脚本是定义在 package.jsonscripts 字段的命令,用于自动化重复操作(如启动服务、打包、测试等),是团队协作的“统一命令规范”。

1. 定义脚本

package.jsonscripts 中添加键值对,键是脚本名,值是要执行的命令:

{
  "scripts": {
    "start": "node server.js",  // 启动服务
    "dev": "nodemon server.js", // 开发环境热更新(需先安装 nodemon)
    "test": "jest",             // 运行测试
    "build": "webpack",         // 打包代码
    "lint": "eslint src/**/*.js" // 代码检查
  }
}

2. 运行脚本

通过 npm run <脚本名> 执行,部分简写脚本(如 starttest)可省略 run

npm run dev       # 执行 dev 脚本
npm start         # 等价于 npm run start
npm test          # 等价于 npm run test
npm run build     # 执行 build 脚本

3. 脚本进阶:生命周期钩子

npm 提供了特殊的“生命周期钩子”脚本,会在特定命令执行前后自动运行。例如:

  • pre + 脚本名:在目标脚本前执行;
  • post + 脚本名:在目标脚本后执行。

示例:定义 build 脚本的前后钩子:

{
  "scripts": {
    "prebuild": "echo '开始打包...'",  // build 前执行
    "build": "webpack",
    "postbuild": "echo '打包完成!'"   // build 后执行
  }
}

执行 npm run build 时,会自动按顺序运行:prebuild → build → postbuild

4. 常用场景

  • 开发环境热更新:用 nodemon 监听文件变化,自动重启服务:
    npm install nodemon -D  # 先安装开发依赖
    
    "scripts": { "dev": "nodemon app.js" }
    
  • 并行执行多个脚本:用 && 串行执行,& 并行执行(Windows 需用 start 命令):
    "scripts": {
      "lint:js": "eslint src",
      "lint:css": "stylelint src/**/*.css",
      "lint": "npm run lint:js && npm run lint:css"  // 先检查 JS 再检查 CSS
    }
    

六、npm 常用命令速查表

命令 作用 示例
npm init 初始化项目,生成 package.json npm init -y(默认配置)
npm install <包名> 安装生产依赖 npm i express
npm install <包名> -D 安装开发依赖 npm i eslint -D
npm install <包名> -g 全局安装包 npm i @vue/cli -g
npm uninstall <包名> 卸载依赖 npm uninstall lodash
npm update <包名> 更新依赖到最新版本(遵循语义化版本) npm update express
npm run <脚本名> 执行自定义脚本 npm run dev
npm start 执行 start 脚本(简写) npm start
npm test 执行 test 脚本(简写) npm test
npm list 查看已安装的依赖列表 npm list --depth 0(只看顶层依赖)
npm info <包名> 查看包的详细信息(版本、作者等) npm info react
npm outdated 检查哪些依赖有更新 npm outdated
npm cache clean --force 清空 npm 缓存(解决安装异常时使用) npm cache clean --force
npm login 登录 npm 账号(发布包前使用) npm login
npm publish 发布包到 npm 注册表 npm publish

七、进阶技巧:提升 npm 使用效率

1. 语义化版本符号详解

package.json 中依赖版本前的符号代表版本范围规则,确保依赖更新的安全性:

  • ^4.17.21:允许更新次版本和修订号(如 4.17.21 → 4.18.0);
  • ~4.17.21:只允许更新修订号(如 4.17.21 → 4.17.22);
  • 4.17.21:固定版本,不允许任何更新;
  • *:始终安装最新版本(不推荐,风险高)。

2. 使用 .npmrc 配置 npm

通过项目根目录的 .npmrc 文件自定义 npm 配置,如切换镜像源(解决国内下载慢问题)、配置私有仓库等:

# 使用淘宝镜像源(国内加速)
registry=https://registry.npmmirror.com/
# 配置公司私有仓库(仅 @yourcompany 前缀的包使用)
@yourcompany:registry=https://npm.yourcompany.com/

3. 本地包开发:npm link

开发自己的包时,可通过 npm link 实现本地调试,无需反复发布和安装:

  1. 在自己开发的包目录下执行:
    npm link  # 将包链接到全局
    
  2. 在需要使用该包的项目目录下执行:
    npm link <包名>  # 关联本地包
    
  3. 调试完成后,解除关联:
    # 项目中解除关联
    npm unlink <包名>
    # 包目录中移除全局链接
    npm unlink
    

4. 多包管理:npm 工作区(Workspaces)

适用于 Monorepo 项目(一个仓库管理多个关联包),通过工作区统一管理依赖和脚本:

  1. 在根目录 package.json 中配置工作区:
    {
      "name": "my-monorepo",
      "workspaces": ["packages/*"]  // 包存放路径
    }
    
  2. 项目结构:
    my-monorepo/
    ├── package.json
    └── packages/
        ├── pkg1/  # 子包 1
        └── pkg2/  # 子包 2
    
  3. 安装依赖到指定子包:
    npm install lodash --workspace=pkg1  # 仅给 pkg1 安装 lodash
    
  4. 运行所有子包的脚本:
    npm run build --workspaces  # 执行所有子包的 build 脚本
    



← 上一篇 AngularJS知识快速入门(上)
记得点赞、关注、收藏哦!
下一篇 Ajax——在OA系统提升性能的局部刷新 →

网站公告

今日签到

点亮在社区的每一天
去签到