Electron-Vue项目中遇到fs.rm is not a function问题的解决过程

Electron-Vue项目中遇到fs.rm is not a function问题的解决过程

结论

  1. 不同版本的electron使用的node版本不同;
  2. 不同版本的node所提供的API不同;

问题描述

  1. 主进程和渲染进程中引入fs模块后,可以正常读文件;
  2. 使用fs.rmdirSync(path, {recursive:true})并不能正常删除文件;
  3. 使用fs.rmSync(path)报错:fs.rmSync is not a function;

问题起源

程序中创建了临时文件夹,完成功能后希望删除文件夹,但是rmdirSync删除文件夹时报无法删除空文件夹的错误,虽然设置recursive为true;那干脆我自己先删除文件,然后再删除文件夹好了,结果就遇到rmSync不是函数的错误。就这样开启了问题的解决之旅;

问题分析

  1. 可以使用readFileSync读文件,但是不能删文件,会不会是electron中通过require引入的fs模块和普通node中的fs模块不一样呢?
  2. webpack打包的时候是不是改变了什么呢?

问题思考

  1. 因为前面遇到过webpack中导出只能使用export而无法使用module.exports的问题,所以第一感觉是webpack做了一些事情导致了这个问题;
  2. 百度和谷歌出的相关文章,如[CSDN博文](TypeError: fs.existsSync is not a function | import { ipcRenderer } from ‘electron’)、stackoverflow的提问github上的issue,提到了webpack打包主要针对浏览器端,可能用不了node,这让我继续认为应该和webpack有关;可是有个问题就是主进程中照样报错啊;另外,博文里提到,可以分别配置主进程和渲染进程的webpack配置中target属性为electron-main和electron-renderer;查看了相关配置,是ok的;那么,到底是什么问题呢?难道electron引入的fs模块和node的不一样?

问题解决

  1. 既然fs可以读文件,说明fs对象的readFileSync方法是可以使用的,那干脆断点看看fs到底有哪些属性,结果就发现了unlink函数,这里就恍然大悟,因为当时看fs的api文档时,rm和unlink和功能很像,那么为啥提供两个函数呢?当时也就这么一想,没有深究,应该是rm属于新增的api,可能更加方便使用了吧;回到文档确认了下,rm函数Added in: v14.14.0。果然,应该是electron使用的node版本并不是最新的,所以有些新增函数无法识别,即is not a function;

在这里插入图片描述

  1. 查看electron信息,electron版本为12.8.1,node版本为12.8.1;这也就解释了为什么rmdirSync使用了recursive,还是未能正常删除文件夹,因为:

在这里插入图片描述

问题反思

  1. 首先是思维一点固化,因为前面遇到过webpack导致的module.exports无法导出功能的问题,所以下意识觉得问题在webpack;另外,对于webpack本身我也不是很熟悉;
  2. 再者,没有SDK版本的意识,History这里在文档中是默认折叠的,另外由于安装环境时基本上会选择最新的版本,所以算是逃避了版本号的问题,于是这次就掉到坑里了;
  3. 答案属于问题,如果问题定位错误了,那么答案就失去了意义,即南辕北辙;
  4. 通过断点查看fs的属性,最后能发现问题所在,算是误打误撞吧;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值