惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cyberwarzone
Cyberwarzone
S
Securelist
S
Schneier on Security
V
Vulnerabilities – Threatpost
Latest news
Latest news
G
GRAHAM CLULEY
C
CERT Recently Published Vulnerability Notes
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
S
SegmentFault 最新的问题
Jina AI
Jina AI
A
About on SuperTechFans
GbyAI
GbyAI
F
Full Disclosure
T
Tenable Blog
博客园 - 聂微东
P
Privacy International News Feed
Recorded Future
Recorded Future
PCI Perspectives
PCI Perspectives
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
Microsoft Security Blog
Microsoft Security Blog
C
Check Point Blog
The GitHub Blog
The GitHub Blog
IT之家
IT之家
S
Secure Thoughts
Cloudbric
Cloudbric
S
Security @ Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园_首页
N
News | PayPal Newsroom
有赞技术团队
有赞技术团队
I
Intezer
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
大猫的无限游戏
大猫的无限游戏
The Register - Security
The Register - Security
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
Martin Fowler
Martin Fowler
小众软件
小众软件
人人都是产品经理
人人都是产品经理
C
Cyber Attacks, Cyber Crime and Cyber Security
宝玉的分享
宝玉的分享
Schneier on Security
Schneier on Security

kshao-blog-前端知识记录

win or mac clash 无 TUN 让 Antigravity、Chrome 强制 proxy(解决 Antigravity 无法加载选择 model、自动更新无法登录、跳转) 在 html 中直接使用 Esm、Jsx 脚本快速调试和使用 React@19 和 Vue@3 源码,解决 React19 UMD 构建等问题 一键在本地批量检测并升级更新 package.json 中的模块依赖,ncu(npm-check-updates)在 npm、pnpm 或 workspace 项目中的使用教程 解决 Mac Docker Desktop 中启动出现的问题合集 通过阿里云、腾讯云无服务器搭建自定义的企业域名邮箱,实现在 QQ邮箱 收发等功能(附腾讯 SMTP 和 IMAP) 解决使用代理(clash 等)进行 SSH 连接(如 Github ssh key clone/push)出现 kex_exchange_identification 错误 静态文件资源 cdnjs, jsdelivr 抖音字节国内快速 CDN 镜像推荐【2025】- 仍在使用 bootcdn 和 staticfile CDN 请注意验证资源的完整性(SRI) pnpm monorepo 中管理依赖的最佳实践,与 Catalogs(目录)协议的使用(monorepo 中统一版本管理) Web 安全中的 Secure Contexts(安全上下文)- 解决在本地中使用 clipboard 或 Crypto 等 API 限制或关闭上下文限制 使用 serve 配合 openssl 或 mkcert 创建本地自签名可信任的证书 - 创建本地 TLS\SSL https 协议服务 利用 Github Actions 和 Acme 自动申请、更新和部署至阿里云、腾讯云 CDN Lets Encrypt SSl\TLS ECC RSA 双证书 【CSS】解决在 flex 容器中使用 align-content 或 justify-content 属性 center 居中时的溢出滚动和截断问题 - 理解 safe 关键字 在线工具 - 一键获取下载抖音无水印视频、抖音去水印解析工具、下载抖音无水印高清图集【2025 最新】 【React Router】v6 data router 在非组件(或工具方法)中如何优雅的跳转路由 【React】为什么路由跳转时页面滚动高度不会被重置(保留上个页面高度)?理解 history scrollRestoration 的场景与使用,以及如何使用 React Router 重置和跳转前保留滚动高度 【React】在本地 Html 中快速 debug(调试)React 源码 【React】结合源码和 EventLoop 分析 - 为什么 useLayoutEffect 会阻止 DOM 重绘(而 useEffect 闪烁)?为什么其内部 useState 会“同步”执行? React Compiler - 解放在函数中编程时的性能焦虑(React Conf 2024)附 Next 在线演示 在 github actions 中获取时间,并转换为中国标准时间(中国时区) 【npm】npm ci - npm clean install,在 CI、CD 中保持构建的一致性和可重复性 eslint 9.x 升级或使用指南,eslint.config.js 配置,包含 react、typescript、prettier 等常用配置升级迁移 使用 Spicetify 自定义 Spotify - 歌词翻译、全屏展示、主题替换 在 node 中快速代理请求(Proxy),解决跨域或请求转发问题 - http-proxy-middleware 修改请求体和返回 在 Hexo 中使用 AI(Gemini、deepseek、Azure)生成文章摘要,支持自定义模板。hexo-ai-summaries 插件文档(默认适配主题 Butterfly) 解决在 webstorm 或 idea 等 jetbrains 工具中遇到 Git 无法 force push,或 force push 灰色禁用无法点击(protected branches) hexo-seo-submit,Hexo 博客 SEO 优化插件 - 每日定时自动或手动提交链接至百度、Bing、Google,支持 Github Actions 和 Coding Jenkins 等CI(Hexo 插件编写) 一文吃透 pnpm 如何使用 workspace 构建 monorepo,与 npm、yarn 的用法对比(pnpm 9.x 内部安装依赖问题 link-workspace-packages) 【Node】Corepack - 解决 pnpm 或 yarn 的多版本管理、解决本地版本与 packageManager 中的版本一致性问题 解决 npm、cnpm 或 pnpm install 遇到 certificate has expired (证书已过期) npm、yarn、pnpm 设置最新国内镜像源(附官方镜像源和最新阿里源),以及 nrm 的使用教程【2025】 解决从 docker desktop 内镜像 linux 创建的容器,启动就停止、无法启动等问题(无进程容器) docker(docker desktop)中设置国内镜像源加速(阿里云、中科大),以及代理和容器代理设置,解决桌面端无法登陆就退出问题 【CSS】解决外边距重叠(重合)引起的 margin 垂直方向(top、bottom)不生效,无作用的问题 【CSS】CSS-Nesting:CSS 嵌套写法 —— 有望替代 less sass 的原生嵌套 【CSS】解决移动端(高清方案)下在谷歌浏览器中出现 字体大小布局异常,和设置的 font-size 不符(Text Autosizer、Font Boosting) 【CSS】主流 UI 库都在用的逻辑伪类选择器 not、where、is、has 【windows 11】使用 wePe 纯净 制作pe启动盘 安装\重装\升级 windows 11(windows 10)详细教程,附 windows 11 跳过联网、分区等教程 【webpack】Externals(外部扩展)浅析 - webpack 5 【Windows】一句话(一键、一分钟、一段代码)清除 Windows 11(10) 快捷方式角标(小箭头) 【Git】cherry-pick 使用场景介绍,如何在 WebStorm 中使用 cherry-pick;(从分支中提取 commit 功能) 【message-channel】了解频繁出现在框架的 Message Channel,及在事件循环(Event Loop)中的表现 【web-worker】浅析 useWorker 库如何只需函数方法即可在 worker 内运行;如何区分 Web Socket、Web Worker和Service Worker? 【React】理解学习 React 17中的批处理 与 18 批处理 为何用谷歌(Chrome)浏览器下载PDF时有时预览有时下载? 【less】Parent Selectors & 和 &&(多个父选择器的用法及回顾) 【React Router】在非组件(或工具方法)中如何优雅的跳转路由 - 理解 HashHistory 和 BrowserHistory 处理谷歌浏览器(google Chrome)https 站点将 http 资源自动转成 https - 附全站资源强制转 https vscode 国内直链接下载,提升(加速)下载速度 【css-tricks】从 flex 子元素超出父级(容器)宽度,探其原理 flex:1 时 width 的作用 linux,mac 终端(Terminal)上使用代理(http/https/socks5)提升速度,给 git 一键设置代理提升速度 修复 Win 11或10 Xbox Game Bar 录屏截屏打不开灰色等 ios,Windows 网页皆可平滑、惯性滚动(Smooth-scroll.js)- 博客、网站、web、JavaScript 【2022年】apple 苹果(ios)注册美服区(日区)ID教程(附免税地区及身份信息生成器)-时效:2022年2月 javaScript 文件上传 - input 上传 和 webAPi 上传(解决上传对 input 的依赖) Git 解决 pull 操作出现:不建议在没有为偏离分支指定合并策略时执行pull操作 一行代码解决谷歌浏览器出现:"您的连接不是私密连接" Nginx 中使用 cookie 灰度或分流 css 指定方向模糊 - 鸿蒙开机效果(animation 事件) PE 升级 windows11 解决不满足限制(绕开 TPM),顺带 surface pro 一键升级 windows11(无需 PE) 在 Hexo 中一键部署 github page 并同步 push 变更文件到指定分支(hexo-deployer-git) z390 + i79700 + rx560(讯景转蓝宝石) 双显卡双系统 - openCore 0.6x 黑苹果 BigSur 11.4(20F71) Progressive JPEG - Web 前端 渐进(模糊)加载图片 z390+英伟达1060+i7 9700 安装黑苹果教程(避坑)- MAC OS 10.13.6 饿了么外卖红包-百亿补贴(每天都可免费领),来自内部的优惠! Google AdSense 添加付款方式-使用银行外汇(招行外汇) ECMAScript2021 可用新特性 客户端或服务端 cookie 的设置、读取、携带问题 css 文字渐入效果,css 变量的进一步使用 setProperty Css 模拟赛博朋克 故障风格 按钮 Fetch、Ajax 请求遇到301或302时 记录前后端不同域名 携带 cookie,及如何处理 Chrome SameSite Mac下 Nginx、openssl,配置本地 Localhost Https 测试环境 在线生成短链接,新浪短链接 t.cn webStorm 开发,配置 ts(TypeScript)的 FileWatchers 微信小程序 - typeScript 的配置与热加载 win10 重装系统,电脑出现:"由于最近更改电脑硬件而无法正常启动",或重装卡在:"海内存知己"等问题解决方法 算法- js 二叉树,二叉查找树的基本实现及递归与循环的版本 异或运算符 ^ 理解与应用 面试 - js 在指定数组中找出不重复的两数之和为 target
【大杂烩】在 pnpm 中直接修改 node_modules(.pnpm) 中的依赖项,项目中持久化 - pnpm 中的依赖处理、幽灵依赖、寻址规则等
kshao · 2025-05-14 · via kshao-blog-前端知识记录

TL;DR:

本篇关于 pnpm patch 内容不多,若只需要 patch 使用的相关内容:降落链接

pnpm patch 的使用场景

当你需要持久化的修改 node_modules 中的依赖时,如在本地修改依赖进行测试,希望其他人使用的也是修改后的依赖,此时可以使用 pnpm patch 进行依赖修改,将相关变更提交即可

理论上 pnpm patch 修改的依赖可以在任何环境中使用(如 CICD),应用生产前需谨慎使用!

vite 中如何使用 pnpm patch

patch 前的知识 1 - pnpm 的依赖管理

三层寻址、缓存、isolate(依赖隔离)

1. 默认情况下,pnpm 会先将依赖安装到全局 store 中,后续通过 软硬链接 或 clone or copy 复用 Store 中的内容

2. 在每个 workspacenode_modules 中都会有一个 .pnpm 文件目录,来平铺每个依赖,其中通过 硬链接 连接 Store 中源码(仅文件部分,如 index.js

3. workspacepackage.json 声明的相关依赖会平铺在 node_modules 中,其通过 软链接 连接 .pnpm 目录下的依赖,如:node_modules/package-a > 软链接 node_modules/.pnpm/package-a@1.0.0/node_modules/package-a

# 获取全局 Store 的路径
pnpm store path

如图,在 pnpm 中,依赖不会全部提升并平铺在 node_modules 中,仅存储当前项目的直接依赖隔离,不提升),这将有效防止出现 幽灵依赖分身问题

硬链接和软链接

索引节点(inode):存储文件元数据的区域,每个文件或目录都有唯一的 inode

在硬盘中,扇区(Sector)是最小的物理存储单元,以前是 512 字节,现大部分 4KBmacwindows 中基本都为 4KB),块(block or 簇 Cluster)是逻辑存储单元,通常为 4KB,是扇区的整数倍(0、2048、4096),若扇区 4KB 那一个 4KB 的块对应一个扇区,和扇区的关系类似于 物理像素和逻辑像素

操作块 可以理解为连续操作多个扇区,文件数据都存储在 块 中,文件的元信息如 文件的创建日期、大小、权限等存储的区域称之为 索引节点(inode),每一个文件或目录都有对应的唯一 inode,其包含:文件类型(普通文件、目录)、权限(读、写、执行权限)、文件大小时间戳(创建、修改、访问时间)、指向数据块(block)的指针(文件的存储位置)、链接数(指向该文件的硬链接数)

文件名与 inode 的映射关系存储在 目录项 中,通过文件名访问文件时,会先通过 目录项 获取对应文件的 inode,再通过 inode 访问文件的元数据和数据

文件名(包括后缀)在系统层面上只是目录中的一个目录项,对于文件系统来说,文件名只是一个字符串,后缀影响的是其他程序如何处理该文件,如 txt 文件会被 文本编辑器 打开,exe 文件会被 系统 执行等

  • 4k 对齐:将逻辑块与物理扇区的起始对齐(是扇区大小的整数倍),减少跨扇区操作和冗余的 I/O 操作,优化存储效率和硬盘寿命。
  • 更大的 块 可以提高文件的读写性能,小的 块 可以减少碎片,提高文件的存储密度。
  • 目录文件:在 Linux 中,目录(directory) 也是一种文件,其包含了目录项的列表,每个目录项包含文件名和对应的 inode

硬链接(hard link):同一文件(inode)的多个入口

  • 多个目录项(文件)共享同一个 inode数据块,具有相同 inode 的文件互为硬链接文件(所以硬链接中没有原始文件的概念,或都是原始文件
  • 硬链接不能跨文件系统不能对目录创建硬链接(避免循环引用)
  • 每个文件的初始硬连接数为 1,每个互相硬链接增加 1,只有当所有硬链接文件被删除时,链接树为 0 时,文件的 inode数据块 才会被释放
  • 不额外占用磁盘空间,仅在目录中新增一个条目

硬链接的文件,因为 inode数据块 是共享的,在文件系统中,可以理解为同一个文件,如图中的修改、创建时间等信息

软链接 or 符号链接(symbolic link): 源文件的快捷方式,独立文件,内容为源文件的路径

  • 软链接的文件与源文件是不同的文件
  • 软链接的文件有自己的 inode数据块(存储的源文件路径),其至少占用一个数据块(如常见的 4KB)
  • 软链接可以跨文件系统除了文件,也可以对目录创建软链接
  • 大部分系统中,修改软链接的文件等同于修改源文件,虽然存储是源文件的路径,在访问时会根据路径找到源文件
  • 删除软链接不会影响源文件,但删除源文件后,软链接会变成断链,因为通过路径找不到源文件,所以软链接的文件无法被访问,恢复被删除的源文件后,软链接的文件又可以被访问
# 源文件被删除的场景
cat symbolic-link.js2
# cat: symbolic-link.js2: No such file or directory

软硬链接的文件都可以编辑,互相硬链接的文件可以理解为对应同一个 inode 和 数据块,所以编辑一个等于编辑全部文件

软链接的文件拥有独立的 inode 和 数据块,虽然也可以编辑,但编辑的是源文件的内容,所以其 inode 的相关信息并不会改变

创建软链接和硬链接

ln A B      # 创建硬链接 B
ln -s A C   # 创建软链接 C

获取文件的 inode

ls -i A B C # 获取 A B C 的 inode

# 84913976 hard-link.js   84913976 index.js

st_nlink 为硬链接的数量,默认 1

stat -s A B C # 获取 A B C 的 inode

# st_dev=16777227 st_ino=84913976 st_mode=0100644 st_nlink=2 st_uid=501 st_gid=20 st_rdev=0 st_size=16 st_atime=1747304799 st_mtime=1747304711 st_ctime=1747304798 st_birthtime=1747304697 st_blksize=4096 st_blocks=8 st_flags=0

# st_dev=16777227 st_ino=84913976 st_mode=0100644 st_nlink=2 st_uid=501 st_gid=20 st_rdev=0 st_size=16 st_atime=1747304799 st_mtime=1747304711 st_ctime=1747304798 st_birthtime=1747304697 st_blksize=4096 st_blocks=8 st_flags=0

查看当前文件软链接对应的源文件

# 对应的是软链接的文件名称,不是任何路径
ls -l A B C # 查看 A B C 的链接信息
# lrwxr-xr-x  1 a666  staff  8 May 15 18:47 symbolic-link.jsx -> index.js

# 不含路径
readlink symbolic-link.jsx
# index.js

# 不含路径
file symbolic-link.jsx
# symbolic-link.jsx: broken symbolic link to index.js

如何解决的幽灵依赖?

幽灵依赖(Phantom dependencies):使用了 package.json 中没有声明的依赖

因为 workspacerepo 中的 node_modules 只会安装 package.json 中声明的直接依赖,并不会有其他未知的依赖提升,在 模块寻址 的过程中(👇🏻有说明),只能找到当前 repo 的直接依赖,

如下所示的结构,无论是原生 Node 还是 webpack@latestvite@latest 的寻址规则,你都无法 requireimport lodash,因为项目根目录中的 node_modules 中没有 lodash 模块,但在 react.pnpm/react@18.2.0/node_modules/react)中却可以,因为向上寻址可以找到 lodash这就是 pnpm 的方案

node_modules/
├── .pnpm/
│   ├── react@18.2.0/
│   │   └── node_modules/
│   │       ├── react/             # 实际的 React 包内容
│   │       └── lodash -> ../../lodash@4.17.21/node_modules/lodash/
│   └── lodash@4.17.21/
│       └── node_modules/
│           └── lodash/            # 实际的 lodash 包内容
└── react -> .pnpm/react@18.2.0/node_modules/react/    # 指向 React 的符号链接

npmyarn@1 中依赖默认是 提升扁平化 安装的,pnpm 也可通过下面配置实现:

  • shamefullyHoist: 平铺但是仍会软硬链接全局 store
  • nodeLinker: hoisted:和 npm 策略一致,适合在不支持链接的环境中使用,如 React NativeMetro
# 平铺但有软硬链接
shamefullyHoist: true
# 同样平铺,但不会有软硬链接
nodeLinker: hoisted

依赖中的幽灵依赖

其实完整的 pnpm 依赖结构如下所示,默认情况下会在 .pnpm/node_module 中提升并平铺所有相关子依赖(这里逻辑类似 npm,同包不同版本会在此处维护最接近 latest 的版本,在冲突的地方维护对应的版本)。“目前,仍有部分 packages 使用了未在 packages.json 中声明的依赖项”,所以 pnpm 为了这类依赖和 npm 迁移等问题做了向下兼容。

从模块寻址规则中,这种结构在 workspace 中的文件无法引入这些模块,但在 .pnpm 中的依赖可以,所以若子依赖中存在幽灵依赖如 lodash,但其他依赖中未依赖 lodash 或版本与之不兼容,则会出现问题

there is a node_modules folder under the .pnpm folder, What is the purpose of this node_modules

Unfortunately, many packages in the ecosystem are broken — they use dependencies that are not listed in their package.json. To minimize the number of issues new users encounter, pnpm hoists all dependencies by default into node_modules/.pnpm/node_modules. To disable this hoisting, set hoist to false.

node_modules/
├── .pnpm/
│   ├── node_modules # pnpm 内部平铺的依赖
│   │   ├── lodash/
│   │   ├── antd/
│   │   └── react/
│   ├── react@18.2.0/
│   │   └── node_modules/
│   │       ├── react/
│   │       └── lodash
│   ├── ui-component@latest/ # 一个 UI 组件,其中依赖了 antd 但没有在 package.json 中声明
│   └── lodash@4.17.21
└── react -> .pnpm/react@18.2.0/node_modules/react/

umi 框架中如何处理不同的 React Version

题外话,umi 作为一个 React 相关的框架,其在内部会固定一个相对稳定的版本,若你需要使用 latest 版本的 React,你可以在项目中的 package.json 中声明 reactreact-dom 的版本,这样 umi 会优先使用你声明的版本。

Umi 内部通过配置不同路径的 alias 来统一 React 版本(若项目中包含相关依赖,则优先匹配项目中声明的版本),此方法可以解决 React 多实例问题,但也会影响依赖的 peerDependencies 中的声明,如 antdpeerDependencies react^18,但项目中的为 ^19,虽然不会造成多实例问题,但 antd 可能会出现兼容性的问题

resolveProjectDep:解析当前项目的 package.json 中的依赖是否包含 react
require.resolve:从当前文件的目录的 node_module 开始逐级向上解析,最终找到 react 模块的路径

const configDefaults = {
  alias: {
    react:
      resolveProjectDep({
        pkg: api.pkg,
        cwd: api.cwd,
        dep: 'react',
      }) || dirname(require.resolve('react/package.json')),
    ...(isLT18
      ? {
          'react-dom/client': reactDOMPath,
        }
      : {}),
    'react-dom': reactDOMPath,
  },
};

存储使用策略

pnpm 在安装依赖时默认使用全局 store 缓存,虽然是通过软硬链接到 node_modules 中,但当你编辑时,并不会直接修改 store 中的内容,这是因为默认情况下 pnpm 根据多个配置对全局 store 进行编辑保护和完整性校验,以确保 store 中的内容是正确的。

相关配置如下(均为 pnpm-workspace.yaml 中,版本:pnpm@10):

- verifyStoreIntegrity(true, boolean):默认情况下,如果存储中文件已经被修改,则在将其链接到项目的 node_modules 之前会检查该文件的内容(integrity)。若设置为 false,则在 install 时跳过检查

该配置可在安装前确保依赖的完整性,防止依赖篡改等问题。

store 中的依赖的 integritypnpm-lock.json 中的 integrity 不一致时重新安装依赖(安装 integrity 不同的依赖),lock 文件不存在时不处理(表现如同 false

- packageImportMethod:控制从存储中(store)导入包的方式

  • auto(默认):从存储中 clone 包,如果不支持 clone 则从存储中硬链接包,若都不支持,则复制。
  • hardlink:从存储中硬链接包
  • clone-or-copy:尝试从存储中 clone 包,如果不支持 clone 则回退到复制
  • copy:从存储中复制包
  • clone:从存储中 clonecopy-on-write)包

该配置控制项目中 node_modules 中的包如何从 store 中导入,默认是 auto(clone),这样修改依赖时不会影响到 store

pnpm-workspace.yaml

packageImportMethod: hardlink verifyStoreIntegrity: false

patch 前的知识 2 - 依赖查找

目前大多数项目中基本都使用 webpackvite 来进行模块的解析,但构建工具们并非完全按照 Node 的模块解析规则来解析模块,如通过 resolvetarget 等来配置模块解析。找到模块后,如何确定模块的入口文件也略有差异

寻址规则

Node 中三方模块的寻址规则:

  1. 确定是否为三方模块:当路径非 相对路径、绝对路径、文件路径、核心模块时,则为外部模块
  2. 遍历 node_modules 目录:从当前文件目录开始,向上逐级查找 node_modules 目录,直到找到根目录(/node_modules),同名模块优先加载离调用者最近的
  3. 入口文件:当在 node_modules 目录中找到对应模块时,先检查 type 字段,若为 module 则优先加载 esm 模块,否则加载 cjs 模块,再根据 exports 字段来确定入口文件,若无 exports 字段,则查找 main 字段,若无 main 字段,最后找 index 文件(后缀根据 type 决定,如 mjscjsjs
  4. 包名/子路径:若 exports 中有相关子路径定义,则以 exports 中的定义为准,否则直接在对应路径中查找入口文件(规则同上)
  5. 查找失败:若以上步骤都无法找到入口文件,则抛出异常 “Cannot find module

require.resolve.paths:返回 Node.js 实际搜索的路径列表

require.resolve.paths('lodash');

// [
//   '当前文件所在目录的 node_modules',
//   '当前文件所在目录的上一级目录的 node_modules',
//   '以此类推,直到根目录',
//   '/node_modules',
// ]

webpack 中三方模块的寻址规则:

默认情况下,未配置 alias 和下面的 resolve 的相关配置,则和 Node 差不多。在解析模块时,webpack 会从 resolve.modules 定义的目录中检索,当找到对应模块时,优先通过 resolve.exportsFields 字段来确定入口文件,若无 exportsFields 字段,则查找 mainFields 字段,若都不存在,则根据 mainFiles 确定文件,最后通过 resolve.extensions 来确定文件后缀

package.json

{ "main": "./lib/index.js", "module": "./es/index.js", "browser": "./dist/index.js", "exports": { ".": { "import": "./es/index.js", "require": "./lib/index.js" }, "./lib": { "import": "./lib/index.js", "require": "./lib/index.js" } } }

模块解析(Module Resolution)

Vite 中的寻址规则: vite@6.3.x 在生产构建时使用 rollup,其依赖 @rollup/plugin-node-resolve 插件解析模块,其默认规则和 Node 一致,所以没有复杂的其他配置

pnpm patch 使用

废话那么多,目的只是为了知道 模块 对应的 入口文件 是哪一个,避免改半天却搞错了对象~

  1. 创建指定 依赖patch 副本:通过 pnpm patch <pkg name>@<version> 命令,在 node_modules/.pnpm_patches/pkgname@version 中生成依赖的副本,可在该文件中修改相关内容(注意,该命令会返回副本的路径,用于后续提交变更)。
  2. 提交 diff 持久化变更:通过 pnpm patch-commit <path>pathpatch 命令返回),执行后将在 workspace 的 根目录 中生成 patches 目录,该目录下会生成 .patch 文件,用于记录变更,diff 格式(在 Jetbrains IDE 中如 webstorm 查看文件如同 git diffvscode 需要对应插件)。

[{"url":"https://static.ksh7.com/post/pnpm-patch/patch-diff.webp?imageMogr2/thumbnail/!50p","dataset":{"originPic":"https://static.ksh7.com/post/pnpm-patch/patch-diff.webp","thumbnail":""}},{"url":"https://static.ksh7.com/post/pnpm-patch/patch-result.webp?imageMogr2/thumbnail/!50p","dataset":{"originPic":"https://static.ksh7.com/post/pnpm-patch/patch-result.webp","thumbnail":""}}]

相关链接