包管理器来源
代码共享方案
1.官网/github 比较麻烦,新版本维护困难
2.npm registry 本仓库被npm工具管理 版本更新方便
npm的基本使用及配置文件package.json
npm的基本使用大家都应该很熟了,接下来就介绍配置文件:
配置文件常见属性
name:name 是指软件包名
version:指发布包版本号,x.x.x的形式。
注意:遵守semver版本规范 x.y.z
description:项目描述
keywords:项目关键字
scripts:运行命令集合(字典)
dependencies:生产依赖关系对象,对象内的所有依赖在正式发布打包时包含在内
devDependencies:本地开发环境依赖、项目构建、和测试依赖的存放目录
生产依赖/开发依赖都用到的依赖放在dependencies
比如为了对项目进行打包用到的只在生产环境的依赖放在devdependencies ,eg:webpack
或者-D 缩写
npm install的基本流程
npm install
的核心流程大致分为四步:
-
依赖解析:首先读取项目的
package.json
和package-lock.json
(如果有),确定依赖树。package-lock.json
会锁定具体版本,确保环境一致性;若无lock
文件,则按语义化版本规则(SemVer)选择最新兼容版本。 -
缓存检查:npm会优先检查本地缓存(
~/.npm
目录),若缓存中存在所需版本的包,则直接复用,减少下载开销。 -
依赖下载与扁平化:从npm仓库下载缺失的包,并按“扁平化”规则安装到
node_modules
,即相同依赖的顶层版本会被共享,冲突版本会嵌套在子目录中。 -
脚本执行与lock更新:安装完成后,执行包内预定义的生命周期脚本(如
postinstall
),并更新package-lock.json
以确保后续安装的一致性。
整个过程旨在保证依赖树的准确性和安装效率,同时通过lock
文件避免“在我的机器上能跑”的问题。
npx
本来在全局下载某个包之后,在本文件夹中的moudle文件夹中下载的包,查找时只能查找到全局中的包版本,想解决这个问题就需要在命令前加npx
这个工具就会在你找包时,优先从文件夹的node_modules文件夹中找
但是webpack是特殊的会自己从依赖文件夹里面找
yarn,cnpm,pnpm等
yarn:npm的竞争对手
cnpm:
由于国外服务器原因,npm依赖下载失败
使用taobao镜像服务器 https://registry.npmmirror.com(国内)或者 vpn
注意:部分企业私有包需切换回官方源或其他私有仓库
pnpm(重要)
先来介绍一个操作系统概念;
硬连接和软连接:
pnpm的优点就在快,节省磁盘空间
为什么呢?
同时pnpm利用软硬连接设置不同建立非扁平化的依赖文件夹,防止项目误引用非正常引入的包,进而产生幻影依赖问题
幻影依赖
在开发中使用的开发依赖中的依赖被项目使用后,在打包之后开发依赖不会被打包,项目中所使用的开发依赖的依赖就会导致幻影依赖的生成
或者你使用了依赖的依赖,原本的依赖更新后那个依赖无法使用了,你就很难debug
使用的包在扁平化的依赖文件夹中所依赖的库被项目中使用
pnpm使用软硬连接建立的非扁平化的依赖文件夹,防止项目误引用非正常引入的包,产生报错,同时通过硬链接节省磁盘空间