前端工程化<npm、cnpm、yarn、npx、pnpm等包管理工具>

news2024/11/19 9:23:30

平时工作中,像npm、cnpm、yarn等一些工具都是经常经常用的,但可能对里面的一些细节都没太在意,所以这篇就来总结一下加深印象和理解。另外还有pnpm的使用,以及它的优势

1. npm包管理工具

包管理工具npm 

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

如何下载和安装npm工具 

  • npm属于node的一个管理工具,所以我们需要先安装Node
  • node管理工具:https://nodejs.org/en/ ,安装Node的过程会自动安装npm工具

npm管理的包查看搜索<官网>

  •  https://www.npmjs.com/
  • 这是我么安装相关的npm包的官网

npm管理的包存放位置 

  • 我们发布自己的包其实是发布到registry上面的
  • 当我们安装一个包时,其实是从registry上面下载的包 

npm的配置文件 

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

2. package.json配置文件 

首先这个文件如何得到 

  • 方式一:就是手动从零创建项目,npm init -y 
  • 方式二:通过脚手架创建项目,脚手架会帮助我们生成package.json,并且里面有相关的配置信息

常见的属性 

  • name是项目的名称
  • version是当前项目的版本号
  • description是描述信息,很多时候是作为项目的基本描述
  • author是作者相关的信息(发布时用到)
  • license是开源协议(发布时用到)
  • private是记录当前项目是否为私有的,当值为true时,npm是不能发布它的,这是防止私有项目或模块发布出去的方式

 main属性 

  • 设置程序的入口
  • 比如我们使用axios模块的时候,const axios = require('axios')(或者使用import一样的)
  • 它会先去node_modules下找到axios的包下的package.json文件中的main属性来进行查找文件,如果没有main属性再去找index

 scripts属性 

  • scripts属性用于配置一些脚本命令,以键值对的形式存在
  • 配置后我们可以通过npm run 命令的key来执行这个命令
  • npm run statr 和 npm start的区别是什么

        他们是等价的;
        对于常用的start、test、stop、restart可以省略掉run直接通过npm start等方式运行 

 dependencies属性 

  • dependencies属性是指无论开发环境还是生产环境都需要依赖的包
  • 通常是我们项目实际开发用到的一些库模块vue、vue-router、vuex、axios等等
  • 与之对应的是devDependencies属性 

 devDependencies属性  

  • 一些包在生产环境下是不需要的,比如webpack,babel等
  • 这个时候我们可以通过npm install webpack --save-dev(npm i webpack -D),将它安装到 devDependencies属性中

 peerDependencies属性  

  • 这种表示项目依赖关系是对等依赖,也就是你依赖的一个包,它必须是以另外一个宿主包为前提的;
  • 比如:element-plus依赖于Vue3.x

依赖的版本管理 

 我们会发现在package.json安装的依赖版本中出现:^2.0.3或~2.0.3,这到底是个啥意思

npm的包通常需要遵从semver版本规范 

semver :https://semver.org/lang/zh-CN/

npm semver: https://docs.npmjs.com/misc/semver 

semver版本规范是X.Y.Z 

X主版本号(major):当你做了不兼容的API修改(可能不兼容之前的版本) 

Y次版本号(minor):当你做了向下兼容的功能性新增(新功能增加,但是兼容之前的版本) 

Z修订号(patch):当你做了向下兼容的问题修正(没有新功能,修复了之前版本的bug) 

^和~的区别 

x.y.z:表示一个明确的版本号 

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

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

3. package-lock.json文件

除了package.json配置文件,我们发现还有个package-lock.json文件。这个文件也是自动生成的,就是相当于我们的缓存文件,一般是不需要我们自己维护的,里面记录着我们安装的每个依赖的确定版本,我们先npm install安装依赖,下载下来压缩包然后解压到node_modules下,然后再生成package-lock.json文件,记录着每个依赖具体的版本号

pack-lock.json文件解析 

  • name:项目的名称
  • version:项目的版本
  • lockfileVersionlock文件的版本(更新了几次package-lock.json文件)
  • requires:追踪模块的依赖关系
  • dependencies项目的依赖
  • integrity用来从缓存中获取索引,再通过索引去获取压缩包文件

我们安装的依赖都是有缓存的,那么在什么地方呢,我们可以通过以下命令来获取缓存的位置

npm config get cache

 4. npm install 原理图

5. npm 其他命令 

 这里再介绍一些其他常用的命令

卸载某个依赖包 

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

强制重新build 

npm rebuild

清除缓存 

npm cache clean

 更多命令可查阅官方文档

6. yarn工具 

另一个包管理工具 

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

其实使用起来都是一样的,跟npm一样,不要把它想象的很高大上 ,yarn也属于npm下的一个库所以也是通过npm来安装yarn如下:

npm i -g yarn
NpmYarn
npm installyarn install
npm install [package]yarn add [package]
npm install --save [package]yarn add [package]
npm install --save-dev [package]yarn add [package] [--save-dev]
npm rebuildyarn install --force
npm uninstall [package]yarn remove [package]
npm uninstall --save [package]yarn remove [package]
npm uninstall --save-dev [package]yarn remove [package]
npm uninstall --save-optional [package]yarn remove [package]
npm cache cleanyarn cache clean
rm -rf node_modules && npm installyarn upgrade

7. cnpm工具

由于某些特殊原因,某些情况下我们可能没办法从 https://registry.npmjs.org上下载下来一些需要的包,就像github似的,我们有时候可以访问,有时候却进不去,道理一样,原因有很多。所以这时候就有了cnpm工具,淘宝有个镜像服务器,它会定时(好像是10分钟一次,具体也不太清除了)从国外的registry同步到国内来,我们使用cnpm就可以直接从国内下载了,速度会提升很多,但是也有弊端,使用cnpm下载的包有可能不是最新的

本身npm是有镜像的, 默认就是https://registry.npmjs.org/

我可以通过npm config set registry https://registry.npm.taobao.org修改npm的镜像,让它指向国内,但是大多数人都不会去修改npm自身的镜像,而是去下载cnpm

查看npm镜像 

npm config get registry //https://registry.npmjs.org/

我们可以直接设置npm的镜像 (不推荐)

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

不太希望随意修改npm原本从官方下来包的渠道

防止以后改来改去的混乱 

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

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

查看cnpm的镜像 

cnpm config get registry

8. npm发布自己的包 

注册npm账号 

  1. https://www.npmjs.com/
  2. 选择sign up

在命令行登录 

npm login

修改package.json配置文件 

发布到npm registry 

npm publish

更新仓库 

  1. 修改版本号(最好遵循semver规范)
  2. 重新 npm publish 发布 

 删除发布的包

npm unpublish

让发布的包过期 

npm deprecate

9. npx的使用 

这里跟大家举个例子,我们在全局安装了 yarn或babel或less或其他的一些工具等,然后我们在某个项目下打开终端又在局部安装了一下yarn或babel或less(跟全局安装的一样),但是版本有所差别,比如全局安装的版本是 5.x.x,而在局部安装的是 3.x.x.,这里假设安装的是babel,那么当我们在该项目下执行babel --version的时候是用的全局的?还是用的局部的呢?答案是全局的,这时候npx就派上用场了,通过npx babel 就可以以局部版本为准。

其他的一些工具包等都是如此,但webpack 却是个例外,我们使用webpack命令的时候,他会优先从项目中去找,也就是项目下的node_modules/webpack/bin 下,如果找到了就直接用该版本,找不到就使用全局的

10. pnpm的使用

pnpm是后来又新出的包管理工具,还是满强大的。我们要知道,每个新技术的出现到流行,都是为了解决原来技术的痛点的。那么pnpm的优势在哪?核心应该分为两点

1. 首先,我们每个人的电脑上肯定都会又很多的项目,几十个甚至几百个几千个都是有可能的,有时候我们自己写个小demo都会新建一个项目,每个项目我们都得安装一次依赖,但是像依赖包vue、vue-router、vuex、axios、pinia、element等等这些都是特别常用的依赖库,我们都要每个项目安装一次,即便是和其他项目依赖的库一样,我们也还得安装一次,同样的依赖包我们要重复安装无限次,随着时间的累积,这些包的大小将会变得超级大,占用了很多没必要的磁盘,有人说没用的时候删掉就可以了,当然是可以的,但是那么多的项目,一个个的小demo,说实话我自己都不知道也不确定哪个将来一定用不到,这个时候,pnpm就诞生了,它就可以帮助解决我们这个问题,我们使用pnpm,它就相当于有个专门的地方存储我们的依赖包,而这个地方的依赖包不会重复,也就是每个依赖包都只会安装一次,这样多个项目用到同一个依赖包的时候,它其实会直接硬链接到我们的pnpm Store中去的,如果是用到同一个依赖包,但是版本不一样,他们pnpm只会去下载一些版本之间不同的文件。

2. 还有个就是,在早期的时候,咱们安装依赖的时候,会将依赖包安装到node_modules下,是非扁平化的,比如我们安装依赖包A,A又依赖于B、C,这个时候我们有需要一个依赖包D,而D也同样依赖C,因为是非扁平化,D拿不到A中的包C,只能再去下载,这样导致同一项目中的依赖包C等等很多被重复下载,造成包体积变大,所以才有了现在npm、yarn、cnpm都是扁平化的,不会去下载重复的包,可以重复利用,但是也有弊端,比如我们我们安装了包A,A又依赖于B、C,那么B、C也会在node_modules下,我们 const B = require("B")也是可以使用B的,但是我们压根就没下载B,我们如果将来把包A卸载,那么B也用不了了,严格来将这也是有点儿问题的,所以现在出了pnpm,它也是创建的非扁平化的,但是跟原来的大不相同,我们pnpm安装的时候,也确实是会在node_modules下的,但是该包实则不在这里,它会软连接到我们.pnpm Store中去的。

pnpm官方解释 

  • 我们可以理解成performant npm缩写

        pnpm 速度快、节省磁盘空间的软件包管理器

  • 快速:pnpm比其他包管理器快2倍
  • 高效:node_modules中的文件链接自特定的内容寻址存储库
  • 支持monorepos:pnpm内置支持单仓多包
  • 严格:pnpm默认创建了一个非平铺的node_modules,因此代码无法访问任意包

软链接和硬链接的概念 

先通俗的跟大家说一下,首先我们的copy,我们copy一个文件之后,我们修改两个文件之间任一个文件都不会影响到另一个文件

然后是硬链接,就是我们硬链接一个文件之后,看似和copy差不多,但实则他们两个的数据源还是同一个,也就是我们修改一个文件同样另一个文件也会跟着改的

然后是软链接,相信大家对发送到桌面快捷方式都不陌生吧,我们下载一个工具,然后会发送快捷方式到桌面,会有一个小的箭头符号,这个其实就相当于软链接,我们点击的是桌面上的,但实则他会软链接到我们的下载的路径去找的,鼠标右键打开文件所在路径,也会去我们对应的磁盘的位置,这其实就是软链接

硬链接(hard link)

  • 硬链接是电脑文件系统中的多个文件平等的共享同一个文件存储单元
  • 删除一个文件名字后,还可以用其他名字继续访问该文件 

符号链接(软链接、soft link、Symbolic link)

  • 符号链接是一类特殊的文件
  • 其包含一条以绝对路径或者相对路径的形式指向其他文件或者目录的引用 

pnpm到底做了什么 

当使用 npm 或者 Yarn 是,如果你有100个项目,并且所有的项目都有一个相同的依赖包,那么,你在硬盘上就需要保存10份相同依赖包的副本

如果是使用的pnpm,依赖包将被存放在一个统一的位置,因此:

  • 如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件
  • 如果你对同一依赖包需要使用不同的版本,则仅有 版本之间不同的文件会被存储起来
  • 所有文件都保存在硬盘的统一的位置 

        当安装软件包时,其包含的所有文件都会硬链接到此位置,而不会占用额外的硬盘空间

        这让你可以在项目之间方便的共享相同版本的依赖包

pnpm创建非扁平的node_modules目录 

当使用 npm 或 Yarn Classic安装依赖包时,所有软件包都将被提升到node_modules的根目录下,其结果就是,源码可以访问本不属于当前项目所设定的依赖包

pnpm的安装和使用 

官网提供了很多方式来安装pnpm:https://www.pnpm.cn/installation 

使用npm安装

npm install -g pnpm

npm 与 pnpm 等价对照表 

npmpnpm
npm installpnpm install
npm install <package>pnpm add <package>
npm uninstall <package>pnpm remove <package>
npm run <cmd>pnpm <cmd>

更多命令和用法可以参考pnpm官网: https://pnpm.io/zh/

pnpm的存储store 

在pnpm7.0之前,统一存储位置时 ~/.pnpm-score中的 

在pnpm7.0之后,统一存储位置进行了更改 

我们可以通过一些终端命令来获取这个目录(获取当前活跃的store目录)

pnpm store path

另外一个非常重要的store命令是prune(修建):

从 store 中删除当前未被引用的包来释放store的空间

pnpm store prune

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『Halcon与C#混合编程』011_工业相机的SDK介绍

这里以淘宝上的显微精工店铺的相机为例(支持SDK) 一、相机的SDK简单介绍 第一步:安装好驱动,并能正常打开相机 第二部:找到相机的安装目录,查看厂家提供的Demo和开发手册 在Demo中找到C#的Demo,运行Demo.sln 第三步

基于Matlab使用粒子滤波器和高斯滤波器跟踪单个对象(附源码)

此示例说明了如何使用粒子滤波器和高斯和滤波器来跟踪使用仅范围测量的单个对象。 一、介绍 只能观察范围信息的传感器无法通过单次检测提供对物体状态的完整了解。此外&#xff0c;当以笛卡尔坐标系表示时&#xff0c;仅范围测量的不确定性是非高斯的&#xff0c;并产生凹形…

python作业8

目录 1.输入一个整数判断奇数偶数 2.判断一个数是否能被7或11整除但不能同时整除 3.判断某一年是否为闰年&#xff1a;能被4整除但不能被100整除&#xff0c;或者能被400整除 4.《车辆驾驶人员血液、呼气酒精含量阈值与检验》标准中规定&#xff1a;驾驶员血液酒精小于20mg/…

基于Hi3861的听话的狗子

听话的狗子一、项目介绍二、硬件介绍&#xff08;1&#xff09;Hi3861最小系统电路&#xff08;2&#xff09;电源管理电路&#xff08;3&#xff09;USB转串口电路烧录电路&#xff08;4&#xff09;外设接口电路三、PCB设计四、软件部分简介&#xff08;1&#xff09;代码整体…

在 ESP 开发板上开发 UI 不再复杂

如果您尝试过在没有图形库的情况下开发 UI&#xff0c;那么您一定知道这有多困难。幸运的是&#xff0c;由乐鑫芯片驱动的屏幕&#xff0c;可支持用户使用多种图形库来开发 UI&#xff0c; LVGL 就是其中之一。通常情况下&#xff0c;在使用 LVGL 或类似的图形库前&#xff0c;…

SPI、RS232、485、IIC通信协议详细总结

通信协议大全 文章目录通信协议大全前言一、异步通信和同步通信二、RS232和RS4851.RS2322.RS4853.RS232和RS485的区别4.RS232、485与普通串口的区别&#xff1f;三、SPI协议四、IIC协议1.IIC的时序介绍2.IIC传输数据的格式总结前言 通信协议是每一个嵌入式工程师必备的技能。下…

几道简单的Linux驱动相关面试题,你看你会几题?

一、Linux基础 1、任意3种网络操作的Linux命令,并说明他们的含义 1. ifconfig 命令 ifconfig 用于查看和配置 Linux 系统的网络接口。 查看所有网络接口及其状态&#xff1a;ifconfig -a 。 使用 up 和 down 命令启动或停止某个接口&#xff1a;ifconfig eth0 up 和 ifconfi…

WEB渗透扫描与加固

WEB渗透扫描与加固 1.通过PC2中渗透测试平台BackTrack5中的httprint工具对服务器场景Server2003检测HTTP服务器(调用signatures.txt), 并将该操作显示结果“Banner Reported:”之后的字符串作为FLAG提交; 切换路径至/pentest/enumeration/web/httprint下 使用命令./httpr…

阿里巴巴面试题- - -多线程并发篇(二十九)

前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪公司的Offer~~ 内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elast…

网络安全:技术趋势

下面列出了GlobalData确定的影响网络安全的关键技术趋势。 维护IT系统的安全性是各种类型组织的一项长期任务。网络攻击频繁且越来越复杂&#xff0c;由那些推动地缘政治事业的人或意图赚钱的攻击者实施。2021年&#xff0c;由于员工在疫情期间远程工作&#xff0c;企业在网络…

直流信号隔离采样

前言 最近在做一个案子&#xff0c;这个案子中的一点是高压电压信号隔离采样&#xff1b; 常见的隔离有&#xff1a; 光隔离&#xff08;光耦&#xff09; 磁隔离&#xff08;霍尔&#xff0c;变压器&#xff09; 等等。 那么要测量直流电压线性隔离如何实现&#xff1f;…

C语言中程序的环境和预处理简述

文章目录程序是如何执行的?翻译预编译条件编译文件的包含嵌套引用不同的引用方式预定义符号编译汇编链接运行程序是如何执行的? 有时候会问自己&#xff0c;程序的运行是那么简单的事情吗&#xff1f; 我鼠标点到 visual studio 上,程序就跑起来了&#xff0c;然后在界面就能…

项目管理:如何使用甘特图制定项目计划

甘特图能够很直观地显示项目任务、进度随着时间推进的进展情况。 横轴为时间&#xff0c;纵轴为项目事项&#xff0c;用条形图的方式直观地展现项目中所有任务的时间及进度。 它可以直观地表明项目中有哪些任务&#xff1f;任务计划在什么时候进行&#xff0c;及实际进展与计划…

基于Vue+node的图书馆座位预约选座管理系统

目 录 一、绪论 1 &#xff08;一&#xff09;选题背景简介 1 &#xff08;二&#xff09;目的和意义 2 &#xff08;三&#xff09;基本内容及目标 2 二 技术简介 4 &#xff08;一&#xff09; React 4 &#xff08;二&#xff09;Vue 4 &#xff08;三&#xff09;Egg.js 5 …

生产者消费者模型

什么是生产者消费者模型&#xff1f; 生产者和消费是操作系统中一种重要的模型&#xff0c;它描述的是一种等待和通知的机制。一、概念引入 日常生活中&#xff0c;每当我们缺少某些生活用品时&#xff0c;我们都会去超市进行购买&#xff0c;那么&#xff0c;你有没有想过&am…

Node.js之Hello World

目录 简介 1.安装 2.安装后的效果 3.准备尝试运行的代码 4.运行JS代码 5.访问正在运行的代码(Hello World) 简介 Node.js 是一个基于"Chrome V8 引擎" 的JavaScript "运行环境"&#xff1b; NodeJS不是一门编程语言, NodeJS是一个运行环境&#xff…

C语言题解 | 消失的数字轮转数组

… &#x1f333;&#x1f332;&#x1f331;本文已收录至&#xff1a;C语言题解系列 更多知识尽在此专栏中&#xff01; &#x1f389;&#x1f389;&#x1f389;欢迎点赞、收藏、关注 &#x1f389;&#x1f389;&#x1f389;文章目录&#x1f349;前言&#x1f349;正文&…

这才是使用ps命令的正确姿势

这才是使用ps命令的正确姿势 前言 在linux系统当中我们通常会使用命令去查看一些系统的进程信息&#xff0c;我们最常使用的就是 ps (process status)。ps 命令主要是用于查看当前正在运行的程序&#xff0c;以及他们相关的的信息&#xff0c;我们可以通过不同的选项进行查看…

全球名校AI课程库(12)| CMU卡内基梅隆 · 数据库系统进阶课程『Advanced Database Systems』

&#x1f3c6; 课程学习中心 | &#x1f6a7; 计算机基础课程合辑 | &#x1f30d; 课程主页 | &#x1f4fa; 中英字幕视频 | &#x1f680; 项目代码解析 课程介绍 CMU 15-721 是 CMU 卡内基梅隆大学开放的数据库方向进阶课程&#xff0c;讨论了很多数据库方向新的技术研究方…

基于Matlab使用跟踪筛选器跟踪机动目标仿真(附源码)

此示例演示如何使用各种跟踪筛选器跟踪机动目标。该示例显示了使用单个运动模型和多个运动模型的滤镜之间的差异。 一、定义方案 在此示例中&#xff0c;定义了一个目标&#xff0c;该目标最初以 200 m/s 的恒定速度行进 33 秒&#xff0c;然后输入 10 度/秒的恒定转弯。转弯…