记落地 vite 到项目中的遇到一个 bug, 最终被 vite 官方 merge pr

文章讲述了作者在使用Vite时遇到的依赖更新异常,通过查看GitHubissue、代码调试,发现fs.rmSync可能导致误删整个.vite目录。作者提出解决方案,在删除目录前增加存在性检查,并提交了PR到Vite项目,最终PR被合并,问题得到解决。
摘要由CSDN通过智能技术生成

大厂技术  高级前端  Node进阶

点击上方 程序员成长指北,关注公众号

回复1,加入高级Node交流群

我最近在落地vite时,发现启动vite --force时会可能会遇到下面的异常

下午4:45:45 [vite] error while updating dependencies:
Error: ENOENT: no such file or directory, rename '/Users/Documents/bm_outside_manage/node_modules/.vite/deps_temp' -> '/Users/Documents/bm_outside_manage/node_modules/.vite/deps'
    at renameSync (fs.js:797:3)
    at Object.commit (file:///Users/Documents/bm_outside_manage/node_modules/.pnpm/vite@3.2.5_g7xnoo4unxki5ajrpjb2aszkje/node_modules/vite/dist/node/chunks/dep-5605cfa4.js:41746:19)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async commitProcessing (file:///Users/Documents/bm_outside_manage/node_modules/.pnpm/vite@3.2.5_g7xnoo4unxki5ajrpjb2aszkje/node_modules/vite/dist/node/chunks/dep-5605cfa4.js:41220:17)
    at async runOptimizer (file:///Users/Documents/bm_outside_manage/node_modules/.pnpm/vite@3.2.5_g7xnoo4unxki5ajrpjb2aszkje/node_modules/vite/dist/node/chunks/dep-5605cfa4.js:41258:17)
复制代码

从字面的意思大概就是.vite/deps_temp 目录没有被找到。

然后我就打开vite github 试着找寻答案,其中找到类似的这个issue github.com/vitejs/vite…[1]

c7447af8559f207dc77042d0cc365e4a.jpeg

经过查看这个issue的评论,可以看出问题是没有解决的。

这时我开始用vscode debugger一下,排查vite代码,说不定还能解决, 提交个pr呢。

说干就干!!

然后新建了一个launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "debug vite",
      "request": "launch",
      "runtimeArgs": ["run-script", "vite"],
      "console": "integratedTerminal",
      "runtimeExecutable": "npm",
      "skipFiles": ["<node_internals>/**"],
      "type": "node"
    }
  ]
}
复制代码

然后在

9c3cbebceedf58f6b1e4b895f201e6e4.jpeg

报错的地方打了一个断点

启动vscode debug vite 断点在文件断住:

经过调试发现

depsCacheDir'/Users/Documents/manage/node_modules/.vite/deps' 这个目录

processingCacheDir'/Users/Documents/manage/node_modules/.vite/deps_temp'

大概从代码上可以看出,先删除deps目录,然后再把deps_temp命名为deps。

本来.vite下会有个deps_temp目录

90b536bda106cb9179fe16a0d3256768.jpeg

然后继续往下调试,发现一个神奇的问题

await removeDir(depsCacheDir);

这行代码执行完毕,.vite什么都没了。

b0a5a1555b96d611aa201f9359bd9418.jpeg

removeDir这个很可疑,本来这个方法应该是删除deps目录的,结果把.vite下的所有目录都干掉了。

export const removeDir = isWindows
  ? promisify(gracefulRemoveDir)
  : function removeDirSync(dir: string) {
        fs.rmSync(dir, { recursive: true, force: true })
    }
复制代码

查看发现在mac 上其实只调用了 fs.rmSync 函数, 然后就是开始调查rmSync是不是有问题呢?

bff0fe8eb4376eb816877d1e7443a16f.jpeg

这个方法是node14.14 去年刚引入的,说不定真有问题。

抱着试试看的态度,我就开始调试rmSync,发现fs.rmSync 进入不到node源码中,后来排查发现

26260b2f929c8ba08cbdb3e5032445e7.jpeg

这个给过滤掉了,修改之后重新调试。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "debug vite",
      "request": "launch",
      "runtimeArgs": ["run-script", "vite"],
      "console": "integratedTerminal",
      "runtimeExecutable": "npm",
      "skipFiles": [],
      "type": "node"
    }
  ]
}
复制代码

发现可以进入node源码了

c64b70e9e7975fa2001b4b4a37c1bc7e.jpeg

经过一阵调试发现

c360e8e63de46f0ddfb5fa453d07fb1f.jpeg

进入到这个文件之后就看不懂了。

后来想了想能不能删除目录之前先判断目录存在不存在呢?

c39b70457560d276173e7fde1f012e77.jpeg

经过多次测试,发现这种方法是可以避免这个问题的。然后就开始fork vite代码,提交pr。

github.com/vitejs/vite…[2]

最后经过对此问题的交流和修改,这个pr得以被merge.

总结:

在遇到问题时,首先去官方issue下搜索问题,如果没有找到解决方案,可能就需要自己去提pr解决了,我们可以利用vscode npm scripts 调试的方式,一步步接近真相。

关于本文

作者:jerome han

https://juejin.cn/post/7184730074497679415

Node 社群



我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

   “分享、点赞、在看” 支持一波👍
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值