Bagaimana untuk mendapatkan direktori AppData yang dipramuat?
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 }, }) } [...]
pramuat.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 } }
Jika saya menjalankan ini, saya mendapat ralat ini.
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
Saya rasa ini berlaku kerana "apl" dimulakan kemudian.
Matlamat utama saya ialah membaca konfigurasi json daripada direktori AppData.
Jika ada cara yang lebih baik untuk melakukan ini, sila beritahu saya.
Pengguna tidak perlu boleh menukar konfigurasi semasa runtime. Tetapi saya harus dapat menulis nilai lalai dalam defaultConfig
ke dalam fail konfigurasi.
app.getPath()
方法仅在应用程序“就绪”后才可用。使用app.on('ready' () => { ... });
Kesan acara 'sedia'. Untuk maklumat lanjut, lihat acara Electron: 'bersedia'.Mengenai anda
preload.js
脚本,直接在其中包含函数有时会使内容难以阅读和理解(即使它仅由require
实现)。目前,该文件没有关注点分离。 IE:您的“配置”功能混合在preload
脚本中。如果您希望分离问题,那么您应该从preload.js
文件中重构您的“配置”代码,并将其放在自己的文件中。这样,您的preload.js
fail hanya digunakan untuk mengkonfigurasi saluran IPC dan memindahkan data yang berkaitan (jika ada).Baiklah, mari kita lihat bagaimana untuk menyelesaikan masalah
app.getPath('appData')
.Dalam
main.js
文件中,检测您的应用程序何时“就绪”,然后通过您的config-manager.js
文件获取appData
direktori anda.main.js
(benang utama)di luar skop fungsi
config-manager.js
文件中,我已将您的“路径”变量移至loadConfig()
函数范围,因为它们仅由该函数使用。如果您需要将它们公开以供文件中其他位置使用,则需要将它们移回loadConfig()
anda.Saya mengalihkan rujukan kepada
ElectronApp.getPath('appData')
ke dalam fungsiloadConfig()
kerana fungsi ini dipanggil daripadaElectronApp.getPath('appData')
的引用移至loadConfig()
函数中,因为在应用程序“就绪”后从main.js
selepas aplikasi "sedia".Saya menambah fungsi pembantu
pathExists()
kerana pelaksanaannya digunakan beberapa kali.Akhirnya, saya menambah
getConfig()
函数,以便在需要时从应用程序主线程中的任何位置轻松获取配置对象(只要将其包含在需要使用它的文件中即可)。IE:let appConfig = require('config-manager')
.config-manager.js
(benang utama)Skrip
preload.js
tipikal kelihatan seperti ini.Jika anda memerlukan bantuan memahami pelaksanaan saluran IPC dan cara menghantar/menerimanya dalam utas utama atau render thread, cuma tanya soalan baharu.