Comment obtenir le répertoire AppData préchargé ?
background.js
[...] async function createWindow() { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__static, "preload.js"), nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION, contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION }, }) } [...]
preload.js
const { contextBridge } = require('electron') contextBridge.exposeInMainWorld( 'configManager', require("../src/utils/config-manager") )
config-manager.js
const app = require("electron").app const fs = require("fs") const resourcePath = app.getPath('appData').replaceAll("\", "/") + "my-custom-path" // <--- const configPath = resourcePath + "config.json" const defaultConfig = [ ... ] let config; function createFilesIfNotExists(){ if (!fs.existsSync(resourcePath)) fs.mkdirSync(resourcePath) if (!fs.existsSync(configPath)){ fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 4)) return true } return false } module.exports = { loadConfig() { createFilesIfNotExists() [...] return config } }
Si j'exécute ceci, j'obtiens cette erreur.
TypeError: Cannot read property 'getPath' of undefined at Object.<anonymous> (VM77 config-manager.js:3) at Object.<anonymous> (VM77 config-manager.js:65) at Module._compile (VM43 loader.js:1078) at Object.Module._extensions..js (VM43 loader.js:1108) at Module.load (VM43 loader.js:935) at Module._load (VM43 loader.js:776) at Function.f._load (VM70 asar_bundle.js:5) at Function.o._load (VM75 renderer_init.js:33) at Module.require (VM43 loader.js:959) at require (VM50 helpers.js:88) (anonymous) @ VM75 renderer_init.js:93
Je pense que cela se produit parce que "app" est initialisé plus tard.
Mon objectif ultime est de lire la configuration json à partir du répertoire AppData.
S'il existe une meilleure façon de procéder, n'hésitez pas à me le faire savoir.
L'utilisateur n'a pas besoin de pouvoir modifier la configuration au moment de l'exécution. Mais je dois pouvoir écrire la valeur par défaut dans defaultConfig
dans le fichier de configuration.
Les fichiersapp.getPath()
方法仅在应用程序“就绪”后才可用。使用app.on('ready' () => { ... });
Détecter l'événement « prêt ». Pour plus d'informations, consultez l'événement Event: 'ready' d'Electron.À propos de vous
preload.js
脚本,直接在其中包含函数有时会使内容难以阅读和理解(即使它仅由require
实现)。目前,该文件没有关注点分离。 IE:您的“配置”功能混合在preload
脚本中。如果您希望分离问题,那么您应该从preload.js
文件中重构您的“配置”代码,并将其放在自己的文件中。这样,您的preload.js
ne sont utilisés que pour configurer le canal IPC et transférer les données associées (le cas échéant).D'accord, voyons comment résoudre le
app.getPath('appData')
problème.Dans votre
main.js
文件中,检测您的应用程序何时“就绪”,然后通过您的config-manager.js
文件获取appData
annuaire.main.js
(thème principal)en dehors du cadre de votre
config-manager.js
文件中,我已将您的“路径”变量移至loadConfig()
函数范围,因为它们仅由该函数使用。如果您需要将它们公开以供文件中其他位置使用,则需要将它们移回loadConfig()
fonction.J'ai déplacé la référence à
ElectronApp.getPath('appData')
dans la fonctionloadConfig()
puisque cette fonction est appelée depuisElectronApp.getPath('appData')
的引用移至loadConfig()
函数中,因为在应用程序“就绪”后从main.js
une fois que l'application est "prête".J'ai ajouté la fonction d'assistance
pathExists()
car son implémentation est utilisée plusieurs fois.Enfin, j'ai ajouté
getConfig()
函数,以便在需要时从应用程序主线程中的任何位置轻松获取配置对象(只要将其包含在需要使用它的文件中即可)。IE:let appConfig = require('config-manager')
.config-manager.js
(thème principal)Un script
preload.js
typique ressemble à ceci.Si vous avez besoin d'aide pour comprendre l'implémentation des canaux IPC et comment les envoyer/recevoir dans le fil de discussion principal ou le fil de rendu, posez simplement une nouvelle question.