前端工程化基础(二):前端包管理工具npm/yarn/cnpm/npx/pnpm

前端包管理工具

代码共享方案

  • 创建自己的官网, 将代码放到官网上面
  • 将代码提交到GitHub上面,负责让使用者下载
  • 将代码提交到npm registry上面
    • 下载比较方便,使用npm install xxx即可下载相应的代码
    • npm管理的包

npm配置文件

主要用于存储项目的名称,版本号,描述,用到的依赖等相关信息

  • 初始化一个配置文件
    • 从零开始一个项目,可以通过 npm init -y
    • 通过脚手架进行创建(比如vue的vue create)
//从零开始初始化一个配置文件
{
  "name": "package_demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

package.json常见的属性

{
  // 项目的名称,必填
  "name": "package_demo",
  //项目版本号,必填
  "version": "1.0.0",
  //描述信息,对项目的基本描述
  "description": "",
  //记录当前项目是否是私有的,防止将项目发布到npm仓库中
  "private":true,
  //设置程序入口
  //通过require("axios"),实际上是通过axios文件夹中的package.json文件中的main属性查找文件
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  //作者(发布的时候用到)
  "author": "",
  //开源协议(发布的时候用到)
  "license": "ISC"
}
  • scripts属性
    • scripts属性用于配置一些脚本命令,以键值对的形式存在
    • 配置之后我们可以通过 npm run 命令的key执行这个命令
    • npm start 和 npm run start是等价的,对于常用的 start、test、stop、restart可以省略run 直接通过npm xxx的方式运行
 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  • dependencies属性
    • 里面记录了该项目中安装了哪些依赖,以及依赖的版本
    • 后续的开发者,通过 npm install,查找该属性下面的内容,安装相应的依赖
    • 在开发环境以及生产环境都依赖的库
 "dependencies": {
    "axios": "^1.6.7",
    "dayjs": "^1.11.10"
  }
  • devDependencies属性
    • 该属性安装一些仅用于 开发环境的依赖
    • 诸如 webpack babel等打包工具,因为这些依赖仅用于项目打包,并不用于项目运行
    • npm install babel --save-dev或者npm install babel -D进行安装
 "devDependencies": {
    "babel": "^6.23.0"
  }
  • peerDependencies属性
    • 一种项目依赖关系,这种关系是 对等依赖,也就是该项目运行的前提是,需要有peerDependencies所依赖的包
    • 比如element-plus需要依赖与vue3,若没有安装vue3的依赖,则会进行提示

package-lock.json常见的属性

主要是为了锁定依赖的版本号

  • package.json提供了相应依赖的版本号,这个版本号比较宽泛
  • 而在一些实际开发中,并不希望一些版本依赖的频繁变化,因此在 package-lock.json中会将依赖的版本号固定下来
  • 而在该文件中,也会显示 依赖中依赖其他包的情况:比如axios包,依赖了其余包的情况
{
    //项目的名称
  "name": "package_demo",
    //项目的版本
  "version": "1.0.0",
    //lock文件的版本
  "lockfileVersion": 1,
    //使用requires来跟踪模块的依赖关系
  "requires": true,
    //项目的依赖
  "dependencies": {
      //项目依赖的名称
    "axios": {
        //实际安装的axios版本
      "version": "1.6.7",
        //用来记录下载地址,registry仓库中的位置
      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz",
        //用来从缓存中获取索引
      "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==",
        //记录当前模块所需的依赖,即axios所需要的依赖
      "requires": {
        "follow-redirects": "^1.15.4",
        "form-data": "^4.0.0",
        "proxy-from-env": "^1.1.0"
      }
    },
  }
}

依赖版本的管理

semver版本规范 x.y.z 1.0.0

  • X主版本号:发生了重大改变的时候,可能不会兼容前面的API
  • Y次版本号:在主版本的功能上,增加了新的功能
  • Z修订号:当修正了版本的bug
  • X.Y.Z:此种写法,会安装固定的版本
  • ^X.Y.Z:此种写法,会安装最新的 Y和Z版本,只要YZ发生了变化,就会安装最新的
  • ~X.Y.Z:此种写法,会安装最新的 Z版本,只要Z发生了变化,就会安装最新的

npm install命令

分为局部安装和全局安装

  • 安装 npm包分为两种情况

    • **全局安装(global install):**npm install webpack -g,全局安装后,所有项目都可以使用
    • 项目(局部)安装:npm install axios,仅可以在当前项目中使用
  • 通常使用全局安装的都是一些工具包,比如 yarn、webpack,并不是 axios、express、koa等库文件

  • 而在局部安装的时候,又分为开发依赖和生产依赖

//安装的开发和生产依赖
npm install axios
npm i axios

//安装开发依赖
npm install webpack --save-dev
npm install webpack -D
npm i webpack -D

//根据package.json中安装依赖
npm install 

原理

image.png

  • 在没有 package-lock.json文件的时候,运行npm install命令
    • 首先会构建依赖关系
    • 从registry仓库中下载压缩包,并将压缩包放到缓存文件中
    • 将下载的压缩包解压到node_modules文件夹中,完成安装,同时生成package-lock.json文件
  • 若这时候将 node_modules文件夹删除,但是存在了 package-lock.json文件,运行npm install命令
    • 首先会检查依赖的一致性:比如某个依赖是否在原先版本的基础上增加了别的依赖,若增加了,就会重新构建依赖关系
    • 若依赖一致,则会查找本地的缓存,:若没有查找到缓存,就会去registry仓库中下载
    • 若查找到了缓存,就会将缓存的压缩包下载,并解压到node_modules文件夹中
  • 支持缓存策略主要是从npm5只会开始的,主要是来自yarn的压力

npm 其他命令

可以去查找npm的官网

  • 卸载某个依赖包

npm uninstall xxx

  • 强制重新build

npm run rebuild

  • 清除缓存

npm cache clean

yarn工具

与npm的作用是相同的

  • 早期由 Google FaceBook等多家公司联合推出来的
  • 当时npm存在很多缺点 下载速度慢,依赖管理混乱
  • 在npm的基础上,运行 npm install yarn -g全局安装yarn

image.png

  • 在用法上与npm基本相同,不同的是安装单个依赖时
    • npm使用npm install xxx
    • yarn使用yarn add xxx
  • 在移除某个依赖的时候
    • npm使用npm uninstall xxx
    • yarn使用 yarn remove xxx

cnpm工具

  • 由于一些特殊的原因,某些情况无法很好的从registry中下载一些包
  • 淘宝有相关的镜像地址,我们可以将仓库下载地址,改成淘宝的镜像地址
  • 但是,有些人不希望将npm的仓库地址改掉,所以我们可以安装 cnpm
  • 运行 npm install cnpm -g全局安装 cnpm
  • 运行 cnpm config set registry https://registry.npm.taobao.org更改cnpm的镜像
  • 运行 npm config get registry查看仓库地址

npx工具

npx工具主要是使用一些局部命令

  • 比如我们在项目中安装了 webpack,当我们想查看webpack版本的时候,输入 webpack --version,会出现以下错误

image.png

  • 这是因为,当我们安装了某些工具时候,运行该工具的相关命令,会从全局去查找相关命令,发现没有,就会报错
  • npx工具,就解决了此问题,进入安装了 webpack工具的项目目录中,输入 npx webpack --version即可实现
  • 这是因为 npx工具就是在局部使用命令,会在项目中的node_modules/.bin目录下去查找相应的执行文件

image.png

  • 若不使用npx工具,也可以使用以下两种办法

    • 一是进入到 **node_modules/bin文件夹下面,运行 webpack --version**命令

    • 二是修改 package.json中script中的内容

      "scripts": {
          "start": "node test.js",
          "build": "webpack xxx.js",
          //在package文件中,使用命令,首先会在node_modules目录下查找,而不是去全局查找
          "webpack":"webpack --version"
        },
      

      image.png

npm发布自己的包

  • 首先注册npm账号 注册账号地址

image.png

  • 在自己要发布的代码目录下输入 npm login命令,用于登录自己的npm账号

image.png

  • 修改 package.json文件
  • 输入 npm publish即可完成发布

image.png

  • 之后就可以让所有人都使用你的包了
  • 当我们更新自己的工具包时候
    • 首先在package.json中更改版本号
    • 之后再运行 npm publish即可
  • 删除发布的包 npm unpublish(一般不会主动删除)
  • 让发布的包过期 npm deprecate

pnpm

  • 前面我们学习的包管理工具,存在一个十分大的痛点
  • 比如,我们创建一个项目,需要npm install许多不同的包,我们电脑上可能同时存在几十个项目
  • 而这些项目的包很有可能都是重复的,会占用不小的电脑内存
  • pnpm就解决了这个问题

什么是pnpm

可以理解成performant npm

  • 具有以下特点
    • 快速:比其他的包管理工具快2倍
    • 高效:
    • 支持monorepos
    • 严格

硬链接和软连接的概念

想要弄清楚pnpm的原理,需要理解硬链接和软连接的概念

  • 硬链接
    • 是电脑文件系统中的多个文件平等的共享一个文件存储单元
    • 删除一个文件名字后,还可以用其他的名字继续访问该文件
  • 软连接
    • 符号连接是一类特殊的文件
    • 包含一条以绝对路径或相对路径的形式指向其他文件或目录的引用

image.png

pnpm到底做了什么

  • 其他包管理工具,当创建了几十个项目,就会有几十个包的依赖

image.png

  • 如果是pnpm,依赖包将 存放再一个统一的位置
    • 如果 同一依赖包使用相同的版本,那么 磁盘上只有这个依赖包的一份文件
    • 如果 同一依赖包使用不同的版本,那么仅有版本之间不同的文件会被存储起来
    • 所有文件 都保存再硬盘上的同一位置
      • 当引用依赖时,项目中包含的依赖文件,会硬链接到此位置,不会占用额外的空间

image.png

pnpm创建的非扁平的 node_modules目录

  • 首先,先要了解一下什么是扁平的 node_modules目录
    • 我们在使用npm下载依赖时候,会将这个包地其他依赖,都会存储到 node_modules目录下
    • 比如,我们下载 webpack包,而 webpack有可能依赖了ajv等等很多包,这些包都会被存储到 node_modules目录下
    • 这样做地目的是,为了防止有重复地依赖包
  • 而pnpm创建地是一个 非扁平化地node_modules目录
    • node_modules目录下,实际上是axios的软连接
    • axios实际文件放在了.npm文件夹中

image.png

pnpm的安装和使用

  • pnpm官网
npm命令pnpm等价命令
npm installpnpm install
npm install xxxpnpm add xxx
npm uninstall xxxpnpm remove xxx
npm run xxxpnpm xxx
  • 若又有一些包不再使用,可以使用 pnpm store prune裁剪不使用的包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/370496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视云闪播截图

视云闪播截图 1. 截图设置2. 热键设置3. 视频截取3.1. 保存 -> 完成 References 深度学习图像数据获取工具。 视云闪播 https://www.netposa.com/Service/Download.html 1. 截图设置 视云闪播 -> 系统设置 -> 截图设置 2. 热键设置 视云闪播 -> 系统设置 ->…

洛谷 P3694 邦邦的大合唱站队 【状压DP】

数据约定: N ≤ 1 0 5 , M ≤ 20 N \leq 10^5, M \leq 20 N≤105,M≤20 思路 对于最终排好的状态,如果我们枚举排在最后一位的团队编号 j j j,可以发现:如果这个团队总共有 x x x 人的话,那么 [ n − x 1 , n ] …

计算机设计大赛 深度学习 植物识别算法系统

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核,池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

一篇文章搞懂CNN(卷积神经网络)及其所含概念

目录 1. 什么是卷积神经网络:2. 应用领域:3. 架构:4. 卷积层的参数和名词参数:名词: 5. 注意:6. 经典网络:小结: 当下,计算机视觉在人工智能领域中扮演着至关重要的角色。…

java数组学习

目录 1.数组概念 2.数组的定义 3.数组的静态初始化 4.地址值 5.数组元素访问 6.索引 7.数组的遍历 8.数组的动态初始化 9.数组两种初始化方式的区别 10.数组常见问题 1.数组概念 数组是一种容器,可以同来存储同种数据类型的多个值。但是数组容器在存储数据…

漫漫数学之旅015

文章目录 经典格言数学习题古今评注名人小传 - 亚里士多德 经典格言 首要问题不是我们知道什么,而是我们如何知道的。——亚里士多德(Aristotle) 亚里士多德,这位古希腊的大哲学家,如果今天穿越到现代脱口秀舞台&…

SQL注入:sqli第一关

一、实验设备: 需要下载并安装phpstudy_pro,下载sqli-labs-php7-master解压到/phpstudy_pro/www中。 二、实验步骤: 1、在id1后加入一个闭合符号“ ‘ ”,但是当你输入?id1,是会报错的, http://127.0.…

vue3实现命令式弹窗

效果图 代码区域 首先实现弹窗组件my-modal.vue 这里实现一个极简易弹窗作为示例&#xff0c;其他功能和样式可自行补充和优化&#xff1b; <template><div class"modal-mask"><div class"modal-wrap"><div class"modal"…

Qt之使用Qt内置图标

一效果 二.原理 Qt内置图标封装在QStyle中,共七十多个图标,可以直接拿来用,能应付不少简单程序需求,不用自己去找图标并添加到资源文件了。 下面是内置图标的枚举定义: enum StandardPixmap {SP_TitleBarMenuButton,SP_TitleBarMinButton,SP_TitleBarMaxButton,SP_T…

JVM之Java内存区域

JVM-Java内存区域 Java内存区域是Java虚拟机&#xff08;JVM&#xff09;管理的内存资源的逻辑划分&#xff0c;用于存储程序运行时所需的数据。Java内存区域的合理划分和管理对于程序的性能和稳定性具有重要影响。本文将深入探讨Java内存区域的各个部分&#xff0c;包括方法区…

android inset 管理

目录 简介 Insets管理架构 Insets相关类图 app侧的类 WMS侧的类 inset show的流程 接口 流程 WMS侧确定InsetsSourceControl的流程 两个问题 窗口显示时不改变现有的inset状态 全屏窗口上的dialog 不显示statusbar问题 View 和 DecorView 设置insets信息 输入法显…

图数据库(neo4j)在工业控制中的应用

图模型 事物的模型中&#xff0c;除了它自身的某些特征之外&#xff0c;还包括它与其它事物的关系特征&#xff0c;例如一个学生的属性包括姓名&#xff0c;性别&#xff0c;年龄等属性&#xff0c;同时&#xff0c;他还有许多关系属性&#xff0c;比如他属于哪一个院系&#x…

认识Tomcat (一)

认识Tomcat &#xff08;一&#xff09; 一、服务器 1.1 服务器简介 ​ 硬件服务器的构成与一般的PC比较相似&#xff0c;但是服务器在稳定性、安全性、性能等方面都要求更高&#xff0c;因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 ​ 软件服务器&…

数据分析:当当网书籍数据可视化分析

当当网书籍数据可视化分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&…

便宜寄快递,就选闪侠惠递,帮您省钱!

随着电子商务的发展&#xff0c;物流也越来越发达&#xff0c;人们的生活中有很多地方都与物流快递打交道。网购或者给远方的亲戚朋友寄礼物等等都需要快递。有时候就止步于昂贵的快递的&#xff0c;其实选对方法&#xff0c;寄快递并不贵... 编辑 现在一般寄快递都是选择去菜鸟…

第三百零七回

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中提示错误"相关的内容&#xff0c;本章回中将介绍如何在输入框中处理光标.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在使用TextField组件作为…

OpenCV 配置选项参考

介绍 注意 我们假设您已经阅读了 OpenCV 安装概述教程或具有使用 CMake 的经验。 可以通过几种不同的方式设置配置选项&#xff1a; 命令行&#xff1a;cmake -Doptionvalue ...初始缓存文件&#xff1a;cmake -C my_options.txt ...通过 GUI 进行交互 在本参考中&#xff…

InstantID:一张照片,无需训练,秒级个人写真生成

1. 引言 InstantID是一种基于扩散模型的强大解决方案。设计的即插即用模块仅使用单个面部图像就能熟练地处理各种风格的图像个性化&#xff0c;同时确保高保真度。它的核心是设计了一个新颖的 IdentityNet&#xff0c;通过强加语义和弱空间条件&#xff0c;将面部和地标图像与…

jmeter-04创建请求

文章目录 一、发送请求-查看响应流程二、新建请求三、选择请求方式&#xff0c;填写url1.发送get请求当只有请求方式不一样的时候&#xff0c;参数都填写在参数栏里面&#xff0c;GET请求与POST请求的区别&#xff1f; 2.发送post请求2.1 application/x-www-form-urlencoded2.2…

ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发

需求分析 展示切换动画搜索框输入文字&#xff0c;自动发送请求搜索结果展示搜索状态维护历史搜索展示&#xff0c;点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…