Nodejs基础之包管理工具npm

Posted 生命是有光的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs基础之包管理工具npm相关的知识,希望对你有一定的参考价值。

🔥Nodejs冲浪笔记地址
🔥Nodejs基础之javascript模块化(一)https://blog.csdn.net/Augenstern_QXL/article/details/119941988
🔥nodejs基础之包管理工具npm(二)https://blog.csdn.net/Augenstern_QXL/article/details/119990575
🔥Nodejs基础之常用模块(三)https://blog.csdn.net/Augenstern_QXL/article/details/119942024
🔥Nodejs基础之Express框架和art-template引擎(四)https://blog.csdn.net/Augenstern_QXL/article/details/119942262

1、包管理工具npm

包管理工具npm

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

npm管理的包可以在哪里查看、搜索呢?

完全符合 CommonJs 规范的包目录一般包含如下这些文件

  • package.json :包描述文件
  • bin:用于存放可执行二进制文件的目录
  • lib:用于存放 JavaScript 代码的目录
  • doc:用于存放文档的目录

1.0、npm init 生成package.json

package.json 定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)

我们这里以引入并使用 MD5加密包来举例 package.json 的用法

  1. 首先在项目根路径下创建 package.json
npm init  或者 npm init --yse
  1. www.npmjs.com 搜索我们 MD5加密包

  1. 在我们的根目录下打开 cmd 下载

    我们使用 npm install md5 --save 下载,将 md5 写入 package.json

  1. 使用 MD5
// 加密 123456

var md5 = require('md5');

// 实现 md5 加密的功能
console.log(md5('123456'));

  • 这样我们就实现了导模块并使用模块,此时查看我们的package.json 文件
{
  "name": "mytest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \\"Error: no test specified\\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "md5": "^2.3.0"
  },
  "devDependencies": {
      
  }  
}
  • dependencies -> 配置当前程序所依赖的其他包
  • devDependencie -> 配置当前程序所依赖的其他包,比如一些工具之类的配置在这里

dependencies 与 devDependencies 之间的区别?

  • 使用 npm install node_module --save 会自动更新 dependencies 字段值
  • 使用 npm install node_module --save -dev 会自动更新 devDependencies 字段值

1.1、package.json

  • package.json 是项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等。

    • 锁定包的版本,确保再次下载时不会因为包版本不同而产生问题

    • 加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作

    • 每次创建新项目,记得先 npm init 生成package.json

1.2、package.json常见属性

必须填写的属性:name、version

  • name 是项目的名称
  • version 是当前项目的版本号
  • description是描述信息,很多时候是作为项目的基本描述
  • author是作者相关信息(发布时用到)
  • license是开源协议(发布时用到)

private 属性

  • private属性记录当前的项目是否是私有的
  • 当值为true时,npm是不能发布它的,这是防止私有项目或模块发布出去的方式

main 属性

  • 设置程序的入口。

scripts 属性

  • scripts 属性用于配置一些脚本命令,以键值对的形式存在
  • 配置后我们可以通过 npm run 命令的key来执行这个命令
  • npm start和npm run start的区别是什么?
    • 它们是等价的
    • 对于常用的start、test、stop、restart可以省略掉run直接通过npm start等方式运行

dependencies 属性项目依赖

  • dependencies 属性是指定无论开发环境还是生成环境都需要依赖的包
  • 使用npm install 包名命令下载的文件会默认被添加到 package.json 文件的 dependencies 字段中
  • 与之对应的是devDependencies

devDependencies 属性开发依赖

  • 一些包在生成环境是不需要的,比如webpack、babel等
  • 这个时候我们会通过npm install webpack --save-dev,将它安装到devDependencies属性中
  • 那么在生成环境如何保证不安装这些包呢?
  • 生成环境不需要安装时,我们需要通过npm install --production 来安装文件的依赖

1.3、版本管理的问题

我们会发现安装的依赖版本出现:^2.0.3或~2.0.3,这是什么意思呢?

我们这里解释一下^和~的区别:

  • ^x.y.z:表示x是保持不变的,y和z永远安装最新的版本
  • ~x.y.z:表示x和y保持不变的,z永远安装最新的版本

1.4、npm install 命令

安装npm包分两种情况:

  • 全局安装(global install): npm install ModuleName -g
  • 项目(局部)安装(local install): npm install

全局安装:

  • 全局安装是直接将某个包安装到全局

但是很多人对全局安装有一些误会:

  • 通常使用npm全局安装的包都是一些工具包:yarn、webpack等
  • 并不是类似于axios、express、koa等库文件
  • 所以全局安装了之后并不能让我们在所有的项目中使用axios等库

  1. npm -v 查看 npm 版本

  2. 使用 npm 命令安装模块 npm install ModuleName

    我们推荐安装模块后面加上 --save,这样可以安装模块并把模块写入 package.json

// 如安装 jq 模块
npm install jquery --save
  1. 卸载模块 npm uninstall moduleName

  2. 查看当前目录下已安装的 node 包 npm list

  3. 查看 模块 的版本 npm info 模块

// 如查看 jquery 的版本
npm info 模块
  1. 指定版本安装 npm install jquery@1.8.0 --save 🔥

1.5、项目安装

项目安装会在当前目录下生产一个node_modules 文件夹

局部安装分为开发时依赖和生产时依赖

1.6、npm install 原理

执行npm install它背后帮助我们完成了什么操作?

我们会发现还有一个成为package-lock.json的文件,它的作用是什么?

从npm5开始,npm支持缓存策略(来自yarn的压力),缓存有什么作用呢?

npm install会检测是有package-lock.json文件:

  • 没有lock文件
    • 分析依赖关系,这是因为我们可能包会依赖其他的包,并且多个包之间会产生相同依赖的情况
    • 从registry仓库中下载压缩包(如果我们设置了镜像,那么会从镜像服务器下载压缩包)
    • 获取到压缩包后会对压缩包进行缓存(从npm5开始有的)
    • 将压缩包解压到项目的node_modules文件夹中
  • 有lock文件
    • 检测lock中包的版本是否和package.json中一致
      • 不一致,那么会重新构建依赖关系,直接会走顶层的流程
    • 一致的情况下,会去优先查找缓存
      • 没有找到,会从registry仓库下载,直接走顶层流程
      • 查找到,会获取缓存中的压缩文件,并且将压缩文件解压到node_modules文件夹中

1.7、package-lock.json

package-lock.json文件解析:

  • name:项目的名称
  • version:项目的版本
  • lockfileVersion:lock文件的版本
  • requires:使用requires来跟着模块的依赖关系
  • dependencies:项目的依赖

1.8、npm其他命令

卸载某个依赖包:

  • npm uninstall package
  • npm uninstall package --save-dev
  • npm uninstall package -D

强制重新build

  • npm rebuild

清除缓存

  • npm cache clean

1.9、cnpm工具

查看npm镜像

npm config get registry

我们可以直接设置npm的淘宝镜像

npm config set registry https://registry.npm.taobao.org

但是对于大多数人来说),并不希望将npm镜像修改了

  • 第一,不太希望随意修改npm原本从官方下来包的渠道
  • 第二,担心某天淘宝的镜像挂了或者不维护了,又要改来改去

这个时候,我们可以使用cnpm,并且将cnpm设置为淘宝的镜像

npm install -g cnpm --registry=https://registry.npm.taobao.org

查看cnpm镜像

cnpm config get registry

以上是关于Nodejs基础之包管理工具npm的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs基础之JavaScript模块化

Nodejs基础之Express框架和art-template引擎

Node.js之包命令(npm和yarn)

nodejs学习笔记 -- npm介绍

vue.js项目构建基础

Nodejs 入门基础知识点