MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Node.js NPM 基础入门与常用命令

2022-12-187.7k 阅读

Node.js NPM 基础入门与常用命令

什么是 NPM

NPM(Node Package Manager)是 Node.js 的默认包管理器,它允许开发者安装、分享和管理 Node.js 项目中使用的代码包。这些代码包可以是别人开发并开源的库,也可以是你自己创建并希望分享给他人的代码集合。

NPM 不仅仅是一个包管理器,它还是一个庞大的生态系统,拥有数以百万计的开源包,涵盖了从 Web 开发、数据处理到机器学习等各个领域。通过 NPM,开发者能够快速引入所需的功能,而无需从头编写所有代码,极大地提高了开发效率。

NPM 的安装与初始化

在开始使用 NPM 之前,需要确保已经安装了 Node.js。因为 NPM 是随 Node.js 一同安装的,所以只要成功安装了 Node.js,NPM 也就安装好了。可以通过以下命令检查 NPM 是否安装成功及查看其版本:

npm -v

当你创建一个新的 Node.js 项目时,首先要做的就是初始化项目。在项目目录下,运行以下命令:

npm init

这条命令会引导你完成项目的初始化过程,它会询问一系列问题,比如项目名称、版本号、描述、入口文件等。你可以根据项目实际情况进行填写,填写完成后,会在项目根目录生成一个 package.json 文件。

package.json 文件是项目的核心配置文件,它记录了项目的基本信息、依赖的包及其版本、项目脚本等重要内容。如果你觉得一步步回答问题太繁琐,也可以使用 npm init -y 命令,它会使用默认值快速生成 package.json 文件。

安装包

  1. 安装项目依赖包 假设你正在开发一个 Web 服务器项目,需要使用 Express 框架。Express 是一个流行的 Node.js Web 应用框架。要安装 Express,在项目目录下运行以下命令:
npm install express

这条命令会从 NPM 仓库下载 Express 及其所有依赖包,并将它们安装到项目目录下的 node_modules 文件夹中。同时,package.json 文件中的 dependencies 字段会自动更新,记录 Express 及其版本号。

如果你想指定安装的版本,可以在包名后加上 @版本号,例如:

npm install express@4.17.1
  1. 安装开发依赖包 有些包仅在开发过程中使用,比如用于测试的 Mocha 和 Chai 包,它们不需要在生产环境中存在。对于这类包,可以使用 --save-dev-D 标志进行安装:
npm install mocha chai --save-dev

安装完成后,这些包会被记录在 package.json 文件的 devDependencies 字段中。

常用的 NPM 命令

  1. npm install 除了前面提到的安装单个包的用法,npm install 还有其他用途。当你在一个已经初始化且有 package.json 文件的项目目录下运行 npm install 时,它会根据 package.json 文件中的 dependenciesdevDependencies 字段,自动安装所有项目所需的包。这在项目克隆到新环境时非常有用,能够快速恢复项目的依赖环境。

  2. npm update 随着时间推移,包的作者会发布新的版本,这些版本可能包含了错误修复、性能提升或新功能。npm update 命令用于更新项目中已安装的包到最新版本(在 package.json 中指定的版本范围允许的情况下)。运行以下命令可以更新所有依赖包:

npm update

如果你只想更新某个特定的包,可以指定包名:

npm update express
  1. npm uninstall 当你不再需要某个包时,可以使用 npm uninstall 命令将其从项目中移除。例如,如果你决定不再使用 Express:
npm uninstall express

该命令会从 node_modules 文件夹中删除 Express 包,并从 package.json 文件的 dependencies 字段中移除相应的记录。如果是开发依赖包,同样会从 devDependencies 字段中移除。

  1. npm list npm list 命令用于列出项目中已安装的包及其依赖关系。运行以下命令可以查看项目的依赖树:
npm list

这会以树形结构展示项目的依赖关系,让你清楚了解每个包的依赖情况。如果只想查看顶层依赖(即直接安装的包),可以使用 --depth=0 选项:

npm list --depth=0
  1. npm run package.json 文件中的 scripts 字段允许你定义一些自定义脚本,然后通过 npm run 命令来运行它们。例如,在 package.json 中添加以下脚本:
{
  "scripts": {
    "start": "node app.js",
    "test": "mocha"
  }
}

现在,你可以使用以下命令来启动项目和运行测试:

npm run start
npm run test

npm run 命令非常灵活,通过定义各种脚本,可以方便地执行诸如构建、测试、部署等各种项目任务。

  1. npm publish 如果你开发了一个包并希望分享到 NPM 仓库,让其他人可以使用,可以使用 npm publish 命令。在发布之前,需要确保已经在 NPM 网站上注册了账号,并通过 npm adduser 命令登录。

发布包时,要注意 package.json 文件中的 nameversion 等字段的正确性。每次发布新版本时,需要更新 version 字段。运行以下命令即可发布包:

npm publish

深入理解 NPM 包版本管理

package.json 文件中,依赖包的版本号有多种表示方式,每种方式都有其特定的含义。

  1. 精确版本号 直接指定包的具体版本号,例如 "express": "4.17.1",这种方式会始终安装指定的精确版本,不会因为包的更新而改变,适合对稳定性要求极高的项目,不希望引入新版本可能带来的兼容性问题。

  2. 波浪号(~) 使用波浪号表示允许安装指定版本号的最新补丁版本。例如 "express": "~4.17.1",这意味着会安装 4.17.x 系列中最新的 x 版本(x 表示补丁版本号)。如果有 4.17.24.17.3 等版本发布,npm install 时会自动安装最新的 4.17.x 版本,这样可以获取到该系列版本的错误修复,但不会引入可能影响兼容性的较大变动。

  3. 插入号(^) 插入号表示允许安装指定版本号的最新次要版本。例如 "express": "^4.17.1",这会安装 4.x.x 系列中最新的版本,只要主版本号 4 不变。所以如果有 4.18.04.19.0 等版本发布,npm install 时会安装最新的 4.x.x 版本。这种方式可以获取到新功能和错误修复,但需要注意可能会因为次要版本的更新引入兼容性问题。

  4. 大于号(>)、小于号(<)、大于等于号(>=)、小于等于号(<=) 这些符号用于指定版本范围。例如 "express": ">=4.17.1 <4.18.0",表示安装 4.17.1 及以上,但小于 4.18.0 的版本。

NPM 包的工作原理

  1. NPM 仓库 NPM 包存储在 NPM 官方仓库中,这个仓库是一个巨大的代码包集合,包含了各种开源项目。当你使用 npm install 命令安装包时,NPM 会从这个仓库下载相应的包及其依赖。除了官方仓库,也可以使用私有的 NPM 仓库,这在企业开发中比较常见,用于管理内部开发的包,保证代码的安全性和隐私性。

  2. package - lock.json 当你安装包时,NPM 会生成一个 package - lock.json 文件(如果项目中还没有的话)。这个文件记录了项目依赖的所有包的精确版本信息,包括每个包的依赖关系树。它的作用是确保在不同环境中安装项目依赖时,能够得到完全一致的包版本组合。例如,在开发环境中安装了某个包及其依赖,生成了 package - lock.json 文件,当在测试环境或生产环境中运行 npm install 时,NPM 会根据 package - lock.json 文件中的精确版本信息进行安装,避免因版本差异导致的兼容性问题。

  3. node_modules 文件夹 node_modules 文件夹是存放项目安装的所有包的地方。当你运行 npm install 时,NPM 会将包及其依赖下载到这个文件夹中。Node.js 在运行时会从这个文件夹中查找所需的模块。node_modules 文件夹的结构与包的依赖关系相对应,每个包都有自己的文件夹,并且包含了包的代码、文档等内容。

NPM 配置

  1. 配置文件 NPM 有多个配置文件,其中最常用的是用户级别的 .npmrc 文件,通常位于用户主目录下(如 C:\Users\你的用户名\.npmrc 在 Windows 系统中,~/.npmrc 在 Linux 和 macOS 系统中)。此外,项目目录下也可以有一个 .npmrc 文件,用于设置项目特定的配置。

  2. 常用配置项

  • registry:指定 NPM 仓库的地址。默认情况下,NPM 使用官方仓库 https://registry.npmjs.org/。如果你想使用其他仓库,比如淘宝的 NPM 镜像仓库 https://registry.npm.taobao.org/,可以通过以下命令设置:
npm config set registry https://registry.npm.taobao.org/

这会修改用户级别的 .npmrc 文件中的 registry 配置项。要查看当前的 registry 配置,可以使用以下命令:

npm config get registry
  • prefix:指定全局安装包的目录。默认情况下,全局包安装在 Node.js 的安装目录下的 node_modules 文件夹中。如果你想改变这个位置,可以设置 prefix 配置项。例如,将全局安装目录设置为 ~/my - global - npm
npm config set prefix ~/my - global - npm

然后需要将 ~/my - global - npm/bin 添加到系统的 PATH 环境变量中,这样全局安装的包的可执行文件才能在任何位置被调用。

解决 NPM 安装问题

  1. 网络问题 由于 NPM 官方仓库在国外,有时可能会遇到网络连接不稳定或下载速度慢的问题。此时可以考虑使用国内的 NPM 镜像,如前面提到的淘宝 NPM 镜像。除了通过 npm config set registry 命令临时设置,也可以使用 nrm(NPM Registry Manager)工具来管理 NPM 镜像。首先全局安装 nrm
npm install -g nrm

然后可以使用 nrm 列出可用的镜像源,并切换到需要的镜像源,例如切换到淘宝镜像:

nrm use taobao
  1. 版本冲突问题 当多个包依赖同一个包的不同版本时,可能会出现版本冲突问题。NPM 会尽量解决这种冲突,但有时可能无法完美处理。在这种情况下,可以尝试手动调整依赖包的版本,使其兼容。例如,如果包 A 依赖 lodash@1.0.0,包 B 依赖 lodash@2.0.0,可以查看是否能找到一个中间版本(如 lodash@1.5.0),既满足包 A 的需求,又能被包 B 接受。同时,也可以查看包的文档或 GitHub 仓库,看是否有关于版本兼容性的说明或解决方案。

  2. 权限问题 在某些系统中,特别是 Linux 和 macOS 系统,可能会因为权限问题导致 NPM 安装失败。如果在安装全局包时遇到权限不足的错误,可以尝试使用 sudo 命令(不推荐,因为可能会带来安全风险),或者更好的方法是将 NPM 的全局安装目录设置为用户有写权限的目录,如前面提到的设置 prefix 配置项。

实例:使用 NPM 构建一个简单的 Node.js 项目

  1. 项目初始化 首先,创建一个新的项目目录,例如 my - node - project,然后进入该目录:
mkdir my - node - project
cd my - node - project

接着运行 npm init -y 初始化项目,生成 package.json 文件。

  1. 安装依赖包 假设我们要构建一个简单的 Web 服务器,使用 Express 框架。运行以下命令安装 Express:
npm install express
  1. 编写代码 在项目根目录下创建一个 app.js 文件,编写以下代码:
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello, World!');
});

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});
  1. 定义脚本并运行项目package.json 文件的 scripts 字段中添加以下脚本:
{
  "scripts": {
    "start": "node app.js"
  }
}

然后运行 npm run start 启动项目,在浏览器中访问 http://localhost:3000,就可以看到 Hello, World! 的输出。

  1. 添加开发依赖并进行测试 假设我们要为这个项目添加测试功能,使用 Mocha 和 Chai 包。运行以下命令安装开发依赖:
npm install mocha chai --save-dev

在项目根目录下创建一个 test 文件夹,并在其中创建一个 app.test.js 文件,编写以下测试代码:

const { expect } = require('chai');
const request = require('supertest');
const app = require('../app');

describe('GET /', () => {
  it('should return 200 and "Hello, World!"', (done) => {
    request(app)
    .get('/')
    .expect(200)
    .expect('Hello, World!', done);
  });
});

package.json 文件的 scripts 字段中添加测试脚本:

{
  "scripts": {
    "start": "node app.js",
    "test": "mocha"
  }
}

运行 npm run test 即可执行测试,查看项目是否正常工作。

通过这个简单的实例,我们展示了如何使用 NPM 来初始化项目、安装依赖包、编写代码、定义脚本以及进行测试,希望能帮助你更好地理解和使用 NPM 在 Node.js 项目开发中的作用。