# pnpm
performant npm 快速的,节省磁盘空间的包管理工具
# 原理
软链
# 扩展
文件的本质是什么:是一个指针,不过不是指向内存地址,而是指向外部存储的地址
删除也是删除指针 无论多大的文件都可以很快删掉(数据恢复)
# 文件
# ext4 文件系统
ps:为啥不选ntfs(不熟呀)
ext 文件系统中柱面结构

三个重要的概念:
superblock: 记录有关封闭文件系统的各种信息,例如块计数、inode 计数、支持的功能、维护信息等(比较复杂 不做过多讨论)
inode: 默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号。每个文件需要占用一个inode(不记录文件名)
block: 大小可以是 1KB、2KB、4KB,默认为 4KB。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。(例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的)
# 硬链接&软链接
# ln命令
# ln [选项] 源文件 目标文件
# 软链接的源文件必须写绝对路径
选项:
-s:建立软链接文件 如果不加-s选项,则建立硬链接文件
-f:强制 如果目标文件已经存在,则删除目标文件后再建立链接文件
查找过程(以/www/README.md为例):
- 首先找到根目录的
inode,然后判断用户是否有权限访问跟目录的block - 如果有权限,则可以在跟目录的
block中访问到/www目录对应的inode号 - 通过
/www目录的inode号,可以查找到/www目录的inode信息,再走权限判断(www目录的block) - 如果有权限,则可以在
www目录的block中访问到README.md文件对应的inode号 - 通过
README.md文件的inode号,可以查找到README.md文件的inode信息,再次权限判断(README.md文件的block) - 如果有权限,就读取
README.md文件的block中的数据
硬链接过程(简化):
假设 源文件硬链接的目录是/Users/wangdongdong/Downloads/readme.md
- 建立硬链接后,
Downloads目录的block中建立一个inode(其它内容忽略),它的编号跟www/目录的block中README.md文件的inode编号一样 - 既然编号一样 按照查找过程 最终读写的是同一个文件内容

硬链接的特点:
- 不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会发生改变
- 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode号相同的文件)都可以被访问
- 硬链接不会建立新的
inode信息,也不会更改inode的总数 - 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,
inode号是重新计算的 - 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的Linux来讲过于复杂
正是硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除inode号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用
ln -s /Users/wangdongdong/Downloads/React/readme.md /Users/wangdongdong/Downloads/React/other/Readme.md
# lrwxr-xr-x "l"就代表软链接文件
# 在文件的后面通过 "->" 显示出源文件的完整名字

软连接过程(简化):
假设 源文件软链接的目录是/Users/wangdongdong/Downloads/React/other/Readme.md
- 省略前面的路径
- 访问
/other/目录的inode信息,判断用户是否有权限访问/other目录的block。 - 如果有权限,就会在
block中读取到软链接文件Readme.md的inode号。(因为软链接文件会真正建立自己的inode索引和block,所以软链接文件和源文件的inode号是不一样的)。 - 通过软链接文件的
inode号,找到了Readme.md文件inode信息,判断用户是否有权限访问block。 - 如果有权限,就会发现
Readme.md文件的block中没有实际数据,仅有源文件readme.md的inode号。 - 接着通过源文件的
inode号,访问到源文件readme.md的inode信息,判断用户是否有权限访问block。 - 如果有权限,就会在
readme.md文件的block中读取到真正的数据,从而完成数据访问

软链接(类似快捷方式)的特点:
- 不论是修改源文件,还是修改软链接文件,另一个文件中的数据都会发生改变
- 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在
- 软链接会新建自己的
inode信息和block,只是在block中不存储实际文件数据,而存储的是源文件的文件名及inode号 - 软链接可以链接目录
- 软链接可以跨分区
# 解决了哪些问题
# 还有哪些未解决
# monorepo
默认你已经了解 lerna, yarn workspace
# pnpm workspace
# 开始
pnpm init
添加配置文件pnpm-workspace.yaml (opens new window) 在项目根目录
packages:
# all packages in subdirs of packages/
- 'packages/**'
# exclude packages that are inside test directories
- '!**/test/**'
新建packages文件夹, 所有的包都放在这个文件夹内
新建几个空包 web,web2, web3
每个项目进行pnpm init初始化(注意name 后面要用到)
公共的依赖安装在根目录下 例如reactpnpm i react -w
子包中的依赖安装 例如moment pnpm i moment -r --filter YouPackagesName
包跟包之间的依赖 例如web1依赖web2 pnpm i web1 -r --filter web2
根文件依赖包 例如index.tsx依赖web2 pnpm i web2 -w
卸载根依赖包 pnpm uninstall web2 -w
卸载包依赖包 pnpm uninstall web2 -r --filter YouPackagesName
--filter 将命令限制为特定的包子集 (opens new window)
# rush
版本控制
# 开始
npm install -g @microsoft/rush
初始化
rush init # 空文件下夹执行
在.vscode文件夹下面建立settings.json并添加如下内容 (解决json文件注释红线问题)
{
"files.associations": {
"*.json": "jsonc"
}
}
# rush add
# rush update
作用:
- rush 检查/应用有时会更新
common/config下的文件的各种策略 - rush 将您的所有项目
package.json文件与存储库的通用收缩包文件进行比较,以查看它是否有效 - 如果它已经过时,包管理器都会更新
shrinkwrap文件 - 无论哪种方式,包管理器都会将所有依赖安装到
common/temp/node_modules文件夹中 - 最后,rush通过将符号链接设置为
common/temp/node_modules为每个项目构建一个本地node_modules文件夹(与rush link命令相同)
# 命令
# 问题
包版本管理呢 ? https://pnpm.io/workspaces (opens new window)
为什么要monorepo:
- 统一技术栈(降低团队成员之间的backup成本)
- 可以在业务开发中,灵活地将代码抽出作为公共模块
- 省去了在多个repo情况下,给团队新成员开通repo权限的时间
# 其它
POSIX,全称为可移植性操作系统接口 (opens new window)
ext4 文件系统 wiki (opens new window)
ext4 文件系统 介绍 (opens new window)