Electron-Vue项目中遇到fs.rm is not a function问题的解决过程
Electron-Vue项目中遇到fs.rm is not a function问题的解决过程结论不同版本的electron使用的node版本不同;不同版本的node所提供的API不同;问题描述主进程和渲染进程中引入fs模块后,可以正常读文件;使用fs.rmdirSync(path, {recursive:true})并不能正常删除文件;使用fs.rmSync(path)报错:fs.rmSync
·
Electron-Vue项目中遇到fs.rm is not a function问题的解决过程
结论
- 不同版本的electron使用的node版本不同;
- 不同版本的node所提供的API不同;
问题描述
- 主进程和渲染进程中引入fs模块后,可以正常读文件;
- 使用fs.rmdirSync(path, {recursive:true})并不能正常删除文件;
- 使用fs.rmSync(path)报错:fs.rmSync is not a function;
问题起源
程序中创建了临时文件夹,完成功能后希望删除文件夹,但是rmdirSync删除文件夹时报无法删除空文件夹的错误,虽然设置recursive为true;那干脆我自己先删除文件,然后再删除文件夹好了,结果就遇到rmSync不是函数的错误。就这样开启了问题的解决之旅;
问题分析
- 可以使用readFileSync读文件,但是不能删文件,会不会是electron中通过require引入的fs模块和普通node中的fs模块不一样呢?
- webpack打包的时候是不是改变了什么呢?
问题思考
- 因为前面遇到过webpack中导出只能使用export而无法使用module.exports的问题,所以第一感觉是webpack做了一些事情导致了这个问题;
- 百度和谷歌出的相关文章,如[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的不一样?
问题解决
- 既然fs可以读文件,说明fs对象的readFileSync方法是可以使用的,那干脆断点看看fs到底有哪些属性,结果就发现了unlink函数,这里就恍然大悟,因为当时看fs的api文档时,rm和unlink和功能很像,那么为啥提供两个函数呢?当时也就这么一想,没有深究,应该是rm属于新增的api,可能更加方便使用了吧;回到文档确认了下,rm函数Added in: v14.14.0。果然,应该是electron使用的node版本并不是最新的,所以有些新增函数无法识别,即is not a function;
- 查看electron信息,electron版本为12.8.1,node版本为12.8.1;这也就解释了为什么rmdirSync使用了recursive,还是未能正常删除文件夹,因为:
问题反思
- 首先是思维一点固化,因为前面遇到过webpack导致的module.exports无法导出功能的问题,所以下意识觉得问题在webpack;另外,对于webpack本身我也不是很熟悉;
- 再者,没有SDK版本的意识,History这里在文档中是默认折叠的,另外由于安装环境时基本上会选择最新的版本,所以算是逃避了版本号的问题,于是这次就掉到坑里了;
- 答案属于问题,如果问题定位错误了,那么答案就失去了意义,即南辕北辙;
- 通过断点查看fs的属性,最后能发现问题所在,算是误打误撞吧;
更多推荐
已为社区贡献1条内容
所有评论(0)