Skip to content

包管理工具学习

包管理工具 npm

  • Node Package Manager,也就是 node 包管理器
  • 但是目前已经不仅仅是 Node 包管理器了,在前端项目中我们也在使用它的管理依赖的包
  • 比如 express、koa、react、react-dom、axios 等等
  • npm 管理的包可以再官网查看搜索:
  • npm 管理的包是存放在哪里:
    • 我们发布自己的包其实是发布到 registry 上面的额
    • 当我们安装一个包时其实是 registry 上面下载的包

项目配置文件 package.json

  • 实际上,我们每一个项目都会有一个对应的配置文件,无论是前端项目还是后端项目
    • 这个配置文件会记录这你项目的名称、版本号、项目描述
    • 也会记录着你项目所依赖的其他库的信息和依赖库的版本号
  • 这个配置文件在 Node 中就是 package. json

常见的属性

  • 必须填写的属性:name、version
    • name 是项目的名称
    • version 是当前项目的版本号
    • description 是描述信息,很多时候是作为项目的基本描述
    • author 是作者相关的信息(发布时用到)
    • license 是开源协议(发布时用到)
  • private 属性:
    • private 属性记录当前的项目是否是私有的
    • 当值为 true 时,npm 是不能发布发的,这是防止私有项目或模块发布出去的方式
  • main 属性
    • 设置程序的入口
    • 很多人会有疑惑,webpack 不是会自动找到程序的入口?
      • 这个入口和 webpack 打包的入口并不冲突
      • 他是在你发布一个模块的时候会用到的
      • 比如我们使用 axios 模块 const axios=require ('axios')
      • 实际上是找到对应的 main 属性查找文件的
  • scripts 属性
    • scripts 属性用于配置一些脚本命令,以键值对的形式存在
    • 配置后我们可以通过 npm run 命令的 key 来执行这个命令
    • npm start 和 npm run start 的区别是什么呢?
      • 他们是等价的
      • 对于常用的 start/test/stop/restart 等可以省略掉 run 直接通过 npm start 等方式运行
  • dependencies 属性
    • dependenies 属性是指定无论开发环境还是生成环境都需要依赖的包
    • 通常是我们项目实际开发用到的一些库模块
    • 与之对应的是 devDependencies
  • devDependencies 属性
    • 一些包在生产环境是不需要的,比如 webpack、babel
    • 这个时候我们会通过 npm install webpacl --save-dev,将他安装到 devDependencies 属性中
  • 那么在生产环境如何保证不安装这些包呢?
    • 生成环境不需要安装时,我们需要通过 npm nstall --production 来安装文件的依赖
  • engines 属性
    • engines 属性用于制定 Node 和 NPM 的版本号
    • 在安装的过程中,会先检查对应的引擎版本,如果不符合就会报错
    • 事实上也可以制定所在的操作系统 os:[darwin, linux], 只是很少用到
  • browserslist 属性
    • 用于配置打包后的 JavaScript 浏览器的兼容情况
    • 否则我们需要手动的添加 polyfills 来支持某些语法
    • 也就是说它是为 webpack 等打包工具服务的一个属性

npm install 命令

项目安装

  • 安装 npm 包分两种情况
    • 全局安装 (global install):npm install yarn -g
    • 项目 (局部) 安装 (local install):npm install
  • 全局安装
    • 全局安装是直接将某个包安装到全局
    • 比如 yarn 的全局安装 npm install yarn -g
  • 但是很多人对全局安装有一些误会
    • 通常使用 npm 全局安装的包都是一些工具包:yarn、webpack 等
    • 并不是类似于 axios、express、koa 等库文件
    • 所以全局安装了之后并不能让我们在所有的项目中使用 axios 等库
  • 项目安装会在当前目录下生产一个 node_modules 文件夹
  • 局部安装分为开发时依赖和生产依赖

npm install 原理

  • 执行 npm install 它背后帮助我们完成了一系列的操作
  • 我们还会发现生成了一个 pacage-lock. json 的文件
  • 从 npm 5 开始,npm 支持缓存策略(来自 yarn 的压力)

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

npm 其他命令

  • 卸载某个依赖包:
    • npm uninstall package
    • npm uninstall package --save-dev
    • npm uninstall package -D
  • 强制重新 build
    • npm rebuild
  • 清除缓存
    • npm cache clean
  • npm 的其他命令:

包管理工具 yarn

  • yarn 是由 Fackbook、Google、Exponent 和 Tilde 联合退出了一个新的 JS 包管理工具
  • yarn 是为了弥补 npm 的一些缺陷而出现的
  • 早起的 npm 存在很多的缺陷,比如安装依赖速度很慢,版本依赖混乱等等一系列的问题
  • 虽然从 npm 5 版本开始,进行了很多的升级和改进,但是依然很多人喜欢使用 yarn

cnpm 工具

  • 由于一些特殊的原因,某些情况下我们没办法很好的从 https://registry.npmjs.org 下载下来一些需要的包
  • 查看 npm 镜像
    • npm config get registry # npm config get registry
  • 设置 npm 的镜像
  • 但是对于大多数来说。并不希望将 npm 镜像修改了
    • 第一:不太希望随意修改 npm 原本从官方下来包的渠道
    • 第二:担心某天淘宝的镜像挂了或者不维护了,又要改来改去
  • 这个时候,我们可以使用 cnpm,并且将 cnpm 设置为淘宝的镜像

npx 工具

  • npx 是 npm 5.2 之后自带的一个命令
    • npx 的作用非常多,但是比较常见的是使用它来调用项目中某个模块的指令
  • 我们以 webpack 为例
    • 全局安装的是 webpack 5.1.3
    • 项目安装的是 webpack 3.6.0
  • 如果我在终端执行 webpack --verson 使用的是哪一个命令呢?
    • 显示结果会是 webpack 5.1.3,事实上使用的是全局的,为什么呢?
    • 原因非常简单,在当前目录下找不到 webpack 时,就会去全局找,并且执行命令
  • 那么如何使用项目的 webpack,常见的是两种方式:
    • 方式一:明确查找到 node_modules 下面的 ebpack
    • 方式二:在 scripts 定义脚本,来执行 webpack
  • 方式一:在终端中使用如下命令(在项目根目录下)
    • ./node_modules/. bin/webpack --version
  • 方式二:修改 package. json 中的 scripts
    • webpack: webpack --version
  • 方式三:使用 npx
    • npx webpack --version
  • npx 的原理非常简单,他会到当前目录的 node_modules/. bin 目录下查找对应的命令