Npm是随同Node.js一起安装的包管理工具,能解决Node.js代码部署上的很多问题

  • 包管理工具NPM
    • Node Package Manager,也就是Node包管理器
    • 但是目前已经不仅仅是Node包管理器了,在前端项目中我们也在使用它来管理依赖的包
    • 比如vue、vue-router、vuex、express、koa、react、react-dom、axios、babel、webpack等等

      使用场景

  1. 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  2. 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  3. 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

    安装 NPM

    由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 npm -v 来测试是否成功安装。
    命令如下,出现版本提示表示安装成功:
    image.png

    更新 NPM

    1. npm i npm -g

    淘宝镜像 cnpm

    设置完成后,后续我们使用 npm 下载插件时就可以直接从淘宝的地址下载,比从外网下载更快。
    1. npm config set registry https://registry.npmmirror.com
    查看当前npm镜像命令:
    1. npm config get registry

    项目的npm配置 package.json

  • 那么对于一个项目来说,我们如何使用npm来管理这么多包呢?
    • 事实上,我们每一个项目都会有一个对应的配置文件,无论是前端项目(Vue、React )还是后端项目( Node )
    • 这个配置文件会记录着你项目的名称、版本号、项目描述等
    • 也会记录着你项目所依赖的其他库的信息和依赖库的版本号

      生成

      方式一︰手动创建项目,npm init -y

      在项目文件夹路径下,打开命令行工具(如windows 的CMD、PowerShell等),输入以下代码,会自动生成在该文件夹内
      1. npm init #创建时填写信息
      2. npm init -y #所有信息使用默认的
      手动创建时,会询问你的项目信息 ``` This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults.

See npm help json for definitive documentation on these fields and exactly what they do.

Use npm install <pkg> --save afterwards to install a package and save it as a dependency in the package.json file.

Press ^C at any time to quit.

下面内容会询问你,你可以不断回车用默认的

name: (node_modules) test # 你的模块名 version: (1.0.0) # 你模块的版本号 description: Node.js 测试模块(www.runoob.com) # 描述 entry point: (index.js) # 主入口js test command: make test git repository: https://github.com/test/test.git # Github 地址 keywords: author: license: (ISC) About to write to ……/node_modules/package.json: # 生成地址

{ “name”: “test”, “version”: “1.0.0”, “description”: “Node.js 测试模块”, # 你模块的描述 …… }

Is this ok? (yes) yes # 是否完成

  1. <a name="CPOuJ"></a>
  2. ### 方式二︰通过脚手架创建项目
  3. 脚手架会帮助我们生成package.json,并且里面有相关的配置,如webpack、Vue Cli、Vite等
  4. <a name="VvSuY"></a>
  5. ## 属性说明
  6. 生成的文件是json格式的,里面是类似一个对象<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639471453715-8d447333-54f7-48a8-88d3-ca355a93620f.png?x-oss-process=image%2Fresize%2Cw_368%2Climit_0#crop=0&crop=0&crop=1&crop=1&from=url&id=zrq2U&margin=%5Bobject%20Object%5D&originHeight=382&originWidth=368&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
  7. | **name** | 包名。 |
  8. | --- | --- |
  9. | **version ** | 包的版本号。 |
  10. | **description** | 包的描述。 |
  11. | **homepage** | 包的官网 url 。 |
  12. | **author** | 包的作者姓名。 |
  13. | **contributors** | 包的其他贡献者姓名。 |
  14. | **license** | 开源协议,你如果想在GitHub等开源网站发布自己的代码,别人想使用你的代码,需要遵循什么协议,不同协议规定不一样。 |
  15. | **private** | 这个项目是否私有的,如果是true,在发布到GitHub等平台时是发布不上去的 |
  16. | **epository** | 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。 |
  17. | **main** | main 字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639475704258-ef954e49-c93c-4cf0-bac3-dc3a3f66b366.png?x-oss-process=image%2Fresize%2Cw_514%2Climit_0#crop=0&crop=0&crop=1&crop=1&from=url&id=pbQak&margin=%5Bobject%20Object%5D&originHeight=360&originWidth=514&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) |
  18. | **keywords** | 关键字,你想别人在npm官网输入什么可以搜索到你,这个就是关键字。 |
  19. | **scripts** | 可以执行的脚本,左边的key ( 如例子里面的test ),可以通过npm run key 来执行(如 npm run test),相当于运行右边的value里面的内容。<br />这里可以你自己定制的,很多脚手架都会往这里加自己的命令<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639471697979-b7c21fa1-e76f-4e26-b4a7-27991b86b149.png#crop=0&crop=0&crop=1&crop=1&from=url&id=Oc34Z&margin=%5Bobject%20Object%5D&originHeight=192&originWidth=338&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)<br />(这是Vue Cli创建的,用的就是Vue Cli的一些命令)<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639478679839-a29c0e1f-7b1d-4948-9aaa-919d880feebe.png#crop=0&crop=0&crop=1&crop=1&from=url&id=zGufO&margin=%5Bobject%20Object%5D&originHeight=110&originWidth=848&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) |
  20. | **dependencies** | 依赖包(模块 / 依赖库)列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639478698368-134da66e-2264-41d8-8f05-004b86cfde0f.png#crop=0&crop=0&crop=1&crop=1&from=url&id=P6qQ3&margin=%5Bobject%20Object%5D&originHeight=113&originWidth=948&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)<br />只要是在src文件下里写代码用到的,都要放这里 |
  21. | **devDependencies** | 只需要在开发写代码期间用到的库,比如Mock模拟数据、vite打包工具等,这些开发完后打包上线后,不需要用到。<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639478714717-d46edbf6-1a6e-4b5e-84a4-324b4c2c528f.png#crop=0&crop=0&crop=1&crop=1&from=url&id=opRiD&margin=%5Bobject%20Object%5D&originHeight=74&originWidth=898&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) |
  22. | **peerDependencies** | ![image.png](https://cdn.nlark.com/yuque/0/2021/png/725902/1639478741736-4f7811a8-e8e7-40db-99b4-a90b70735c8d.png#clientId=uf95a6c35-bfed-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=76&id=u47ad2b97&margin=%5Bobject%20Object%5D&name=image.png&originHeight=76&originWidth=891&originalType=binary&ratio=1&rotation=0&showTitle=false&size=28347&status=done&style=none&taskId=u4150a812-c65a-4785-91cb-feeba54f87f&title=&width=891)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/725902/1639479312872-1c1ea60d-0758-4437-beb9-67c91c7037e8.png#clientId=uf95a6c35-bfed-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=53&id=u27b99d48&margin=%5Bobject%20Object%5D&name=image.png&originHeight=53&originWidth=186&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10581&status=done&style=none&taskId=u8e4aa859-43f7-4886-a91d-3d1138b381b&title=&width=186)<br />如果检测到你没有安装这里面要求的依赖,会有个提示<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/725902/1639479338683-e240e325-8940-474c-b323-a1ed2f7e4a6b.png#clientId=uf95a6c35-bfed-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=80&id=u47108825&margin=%5Bobject%20Object%5D&name=image.png&originHeight=80&originWidth=1236&originalType=binary&ratio=1&rotation=0&showTitle=false&size=96099&status=done&style=none&taskId=ua4e1415f-9e92-4dc5-9002-157466ff65e&title=&width=1236) |
  23. | **engines** | ![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639498579058-99777572-16a6-4cde-8ded-a9f51610cff0.png#crop=0&crop=0&crop=1&crop=1&from=url&id=sEGoa&margin=%5Bobject%20Object%5D&originHeight=166&originWidth=992&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) |
  24. | **browserslist** | ![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639498610394-6bc46e92-9b9a-4920-a9b1-05a6f3538fbd.png#crop=0&crop=0&crop=1&crop=1&from=url&id=nZtk1&margin=%5Bobject%20Object%5D&originHeight=214&originWidth=1350&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) |
  25. <a name="Ov7XA"></a>
  26. ## 依赖版本管理
  27. 会发现安装的依赖版本出现:个2.0.3或~2.0.3,这是什么意思呢?<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639479601821-1d82c53c-4dee-422e-917e-d8fbc92eb242.png#crop=0&crop=0&crop=1&crop=1&from=url&id=hppej&margin=%5Bobject%20Object%5D&originHeight=133&originWidth=370&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
  28. - **npm的包通常需要遵从semver版本规范**
  29. - semver : [https://semver.org/lang/zh-CN/](https://semver.org/lang/zh-CN/)
  30. - npm semver : [https://docs.npmjs.com/misc/semver](https://docs.npmjs.com/misc/semver)
  31. - **semver版本规范是X.Y.Z**
  32. - X主版本号( major ):当你做了不兼容的API修改(可能不兼容之前的版本)
  33. - Y次版本号( minor ):当你做了向下兼容的功能性新增(新功能增加,但是兼容之前的版本)
  34. - Z修订号( patch ) :当你做了向下兼容的问题修正(没有新功能,修复了之前版本的bug )
  35. ![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639479648021-9cfe1e46-4260-48f6-9747-72aba8a09f85.png#crop=0&crop=0&crop=1&crop=1&from=url&id=pQ8E3&margin=%5Bobject%20Object%5D&originHeight=104&originWidth=735&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
  36. <a name="HGvk3"></a>
  37. ## 锁定版本
  38. 而真实的版本,在lock这个文件里面,这个文件是执行npm install的时候自动生成的,然后锁定版本号,防止你和你同事开发的时候使用的版本不一致。<br />如果要更新依赖的版本,要删掉这个文件。<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639480398572-ed3a136b-e959-48d9-99e5-c190142683b3.png#crop=0&crop=0&crop=1&crop=1&from=url&id=DE7H5&margin=%5Bobject%20Object%5D&originHeight=61&originWidth=246&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639505716830-29e67b59-8814-41ba-9fe9-72e2065af9e4.png?x-oss-process=image%2Fresize%2Cw_828%2Climit_0#crop=0&crop=0&crop=1&crop=1&from=url&id=R7MVA&margin=%5Bobject%20Object%5D&originHeight=376&originWidth=828&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
  39. <a name="HeZdZ"></a>
  40. # 查找模块
  41. [https://www.npmjs.org/](https://www.npmjs.org/)<br />这是我们安装相关的npm包的官网,上面的包都可以通过npm工具安装<br />![](https://cdn.nlark.com/yuque/0/2021/png/725902/1639470521874-4e570833-0e99-4e22-a8db-b7d6bdf8b4b5.png#crop=0&crop=0&crop=1&crop=1&from=url&id=orIPm&margin=%5Bobject%20Object%5D&originHeight=132&originWidth=672&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
  42. <a name="9BICk"></a>
  43. # 安装模块
  44. <a name="YgUCl"></a>
  45. ## 安装当前 所有模块
  46. npm 会根据当前项目文件夹中的 package.json 配置文件,中的依赖配置 dependencies 属性 和 devDependencies 属性,下载安装属性里面的所有模块和模块的依赖。
  47. ```bash
  48. npm install
  49. npm i

全局安装 单个模块

  1. npm i 模块名 -g
  2. npm i 模块名 -global

全局默认安装位置:C:/Users/xxx/AppData/Roaming/npm

全局安装的优势在于,会把该模块的一些命令添加到环境变量里面,然后你在任何位置,打开命令行工具,都能直接使用这个库的命令。

平常不建议全局安装,因为你全局安装的版本,可能和你项目所使用的版本不一致,或者多个项目用不同的版本,从而导致一些问题。

因此你只有把这些模块当做工具使用,比如yarn,不会在你的src中用到的,才会全局安装。

局部安装 单个模块*

  1. # 安装的包将写入package.json里面的dependencies,dependencies:生产环境需要依赖的库,如UI库(element-ui,ant-design-vue)
  2. npm i 模块名
  3. # 或
  4. npm i 模块名 --save
  5. # 或
  6. npm i 模块名 -S
  7. # 安装的包将写入packege.json里面的devDependencies,devdependencies:只有开发环境下需要依赖的库,如EsLint(规范代码格式)
  8. npm i 模块名 --save-dev
  9. # 或
  10. npm i 模块名 -D

局部安装位置,会安装在你项目的node_modules文件夹内,只有你项目里面能够引用使用,平常推荐这样操作

安装指定版本

  1. npm i 模块名@版本号
  2. //如npm i vite@1.0.0-rc.13

查看安装信息

  1. npm list -g

更新模块

  1. npm update 模块名

卸载模块

  1. npm uninstall 模块名

查看模块版本

  1. npm info 模块名
  2. # 如npm info vite

其他命令

https://docs.npmjs.com/cli-documentation/cli

NPM安装原理 *

  • 执行npm install它背后帮助我们完成了什么操作?
  • 我们会发现还有一个成为package-lock.json的文件,它的作用是什么?
  • 从npm5开始,npm支持缓存策略(来自yarn的压力),缓存有什么作用呢?

早期的npm5,没有缓存机制,也没有lock文件,假设你电脑上有3个项目,每个项目都安装Vue,那么每个项目都要从registry仓库下载一遍,相当于同样的代码重复下载了3遍,占用了服务器的带宽,浪费了时间,非常不好用,下载很慢而且容易出问题。

后来出现了yarn,就是为了解决npm这个问题,有逐渐取代npm的趋势。

后来npm自己不断更新,现在和yarn差不多了
image.png

查看缓存存放位置

  1. npm get cache

image.png
Npm - 图4

清除缓存

  1. npm cache clean --force

有时候偶尔缓存可能会被破坏,但是它仍然认为是有缓存的,导致后面一直有问题,此时可以清理缓存。

后面加 —force 是强制,不强制的话会提示你缓存是用于优化,不建议清理。

Npx工具

npx是npm5.2之后自带的一个命令。
npx的作用非常多,但是比较常见的是使用它来调用项目中的某个模块的指令。就是调用项目中,局部安装的某个模块里面的模块命令。

  • 以webpack为例
    • 全局安装的是webpack5.1.3
    • 项目安装的是webpack3.6.0
  • 如果我在终端执行webpack —version使用的是哪一个命令呢?
    • 显示结果会是webpack 5.1.3,事实上使用的是全局的,为什么呢?
    • 原因非常简单,在当前目录下找不到webpack时,就会去全局找,并且执行命令;
  • 那么如何使用项目(局部)的webpack,常见的是两种方式

    • 方式一:明确查找到node_module下面的webpack
      • 在终端中使用如下命令(在项目根目录下)./node_modules/ .bin/webpack --version
    • 方式二:在scripts定义脚本,来执行webpack

      • 修改package.json中的scripts
        1. "scripts": {
        2. "webpack" : "webpack --version"
        3. }
        相当于运行 npm run webpack,用的也是局部模块的
    • 方式三︰使用npx

      • npx webpack --version
      • npx的原理非常简单,它会到当前目录的node_modules/.bin目录下查找对应的命令