概述

虽然我时不时会使用 npm,但是,其实对于它我是真不熟悉,但是,最近突然想了解一下它具体是什么东西以及有什么用,所以就稍微认真地了解了一下,本文就记录一下我对于 npm 所理解的东西。

什么是 npm

首先,这里我意识到了我的一个错误,那就是 npm 都是小写的,大写是错误的(习惯性全大写),虽然它代表的是 Node Package Manager 的意思,实际上它的含义是包含三个部分:

这些都是在官网首页上说的。但是,一般来说,我们说 npm 都是在说 npm 的命令行工具,所以下面如果没有特别说明,那就表示我在说 npm 这个命令行工具。

安装 npm

安装 npm 其实安装 nodejs 就可以了,安装 nodejs 的时候会顺带安装 npm,我这里提供的是 ubuntu 的安装方式,我安装的是现在的 14.0 LTS(长期维护版本),安装步骤为:

  1. [root@liqiang.io]# curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
  2. [root@liqiang.io]# sudo apt update
  3. [root@liqiang.io]# apt intall nodejs

等待安装完毕即可使用:

  1. [root@liqiang.io]# npm --version
  2. 7.22.0

npm 有什么用

npm 的全称前面已经说过了,是 Node Package Manager,也就是包管理工具的意思,那么它管理的是什么 Package 呢?如果你有使用过 Python,那么你应该知道在 Python 中有 pip 这个工具,它可以根据 requirements.txt 这个文件识别你的这个项目依赖什么其他的库,已经什么版本,那么当你拿到别人的仓库的时候,你就可以从一份源代码下载需要的依赖,然后运行这个项目;同样类似的,在 Go 中有 go mod,Java 有 maven,都是类似的存在。

了解这个之后,其实就是看 npm 是如何保存这个信息的,很简单,使用 npm init,npm 就会创建一个 package.json,在这个文件中,包含了你当前项目的信息,以及你项目所依赖的 package:

  1. [root@liqiang.io]# npm init
  2. [root@liqiang.io]# npm install normalize.css

这里我就通过 npm 添加了一个依赖:normalize.css,然后再看一下 package.json

  1. [root@liqiang.io]# cat package.json
  2. {
  3. "dependencies": {
  4. "normalize.css": "^8.0.1"
  5. },
  6. "name": "npm-learning",
  7. "version": "1.0.0",
  8. "main": "index.js",
  9. "devDependencies": {},
  10. "scripts": {
  11. "test": "echo \"Error: no test specified\" && exit 1"
  12. },
  13. "author": "",
  14. "license": "ISC",
  15. "description": ""
  16. }

这里就将 normalize.css 的依赖添加上去了,并且指定了最低版本,这样,当别人拿到我这个项目,就知道需要安装什么依赖库,然后就可以直接运行了。

安装依赖库的方式为:

  1. [root@liqiang.io]# npm install

这样就会在本项目的当前目录下创建出来一个 node_modules 目录,里面就存放下载下来的依赖的 package:

  1. [root@liqiang.io]# tree
  2. .
  3. ├── node_modules
  4. └── normalize.css
  5. ├── CHANGELOG.md
  6. ├── LICENSE.md
  7. ├── normalize.css
  8. ├── package.json
  9. └── README.md
  10. ├── package.json
  11. └── package-lock.json

ok,就是这么简单。

更多的功能

除了进行包管理之外,npm 还有更多的功能,例如我们都是直接在当前项目中开发的,写前端的同学都知道,当真正发布的时候,都是需要将源代码压缩、混淆以及图片合并之类的一系列操作的,这些都可以通过 npm + 插件的形式完成,最终得到一个 dist 发布文件,这就可以作为发布版本发行出去了,这让前端的代码稍微安全了一点点。

同样的,后端的 node 应用也是可以有类似的过程,这些都可以通过 npm 来完成。

Ref