如何在Ionic+Cordova+Electron项目中不修改主进程提前修改userData目录
解决方案
下面提供两个合规实现方案,无需手动修改Cordova官方生成的主进程文件:
方案1:使用Cordova Hook自动注入代码
Cordova的钩子机制支持在编译流程的指定阶段自动执行自定义脚本,你可以通过钩子在每次编译时自动向生成的cdv-electron-main.js中注入路径修改代码,避免手动修改官方主进程文件:
- 在项目根目录的
hooks文件夹下新建before_compile_electron.js脚本,逻辑如下:
const fs = require('fs'); const path = require('path'); module.exports = function(context) { const mainPath = path.join(context.opts.projectRoot, 'platforms/electron/cdv-electron-main.js'); let mainContent = fs.readFileSync(mainPath, 'utf8'); // 在app导入后、ready事件注册前注入代码 const injectCode = ` const path = require('path'); app.setPath('userData', path.join(path.dirname(process.execPath), 'data')); `; mainContent = mainContent.replace(/const \{ app \} = require\('electron'\);/, `$&${injectCode}`); fs.writeFileSync(mainPath, mainContent); }
- 在项目
config.xml中注册钩子,指定仅Electron平台触发:
<hook type="before_compile" src="hooks/before_compile_electron.js" platform="electron" />
该方案完全符合Cordova开发规范,后续升级Cordova Electron平台版本也不会冲突。
方案2:在自定义Electron配置文件中监听提前事件
你提到已在config.xml中配置了自定义Electron配置文件,该配置文件的加载时机早于主进程ready事件触发,你可以在其中监听Electron的will-finish-launching事件完成路径修改,该事件触发时机远早于ready事件:
const { app } = require('electron'); const path = require('path'); app.on('will-finish-launching', () => { const installDir = path.dirname(process.execPath); app.setPath('userData', path.join(installDir, 'data')); });
该方案不需要修改任何官方生成的主进程代码,完全基于Cordova官方提供的自定义配置能力实现,适配你当前的项目配置,且兼容Electron v4版本。
验证方法:修改完成后可在主进程
ready事件回调中打印app.getPath('userData'),确认路径已修改为你指定的安装目录下的data文件夹即可。
内容的提问来源于stack exchange,提问作者Wojdakoman
相关产品推荐
相关产品推荐

