在 ElectronJS (asar) 中写入 JSON 个文件
Writing JSON files in ElectronJS (asar)
问题
FrameWork - ElectronJS
我的程序使用 .json
文件来保存用户输入的数据。在开发环境下这些文件写的很完美,但是用electron-packager
打包后JSON的文件就不再写了,这让我的程序完全失效了。
我主要使用那些 JSON
文件来编写我的程序,因此完全删除它们将再次从头开始编写程序。有没有办法让程序像在开发环境中一样在客户端 PC 中写入 JSON
文件。
示例程序
这只是一个示例程序,但我所有的代码都是这种格式。
//JavaScript
//This Javascript catches user inputs and send them to jsonWriter function
document.getElementById("save").addEventListener('click', async function(e) {
e.preventDefault()
var userData = document.getElementById('username').value
var acctData = document.getElementById('account').value
var formData = {
username: userData,
account: acctData
}; // create JS object
await writer.jsonLC(formData);
});
// This is my json Writer function
async function jsonForAuth(data){
let element = JSON.stringify(data);
fs.writeFileSync(__dirname + '\data\auth.json', element)
//All my directory for 'fs' are written in such format with a '__dirname'
}
module.exports.jsonLC = jsonForAuth;
// All of this works perfectly on dev-environment (VS-Code)
现在我用electron-packager
打包
// Here is my package.json for reference
{
"name": "electron_app",
"productName": "Test App",
"version": "1.0.0",
"description": "",
"main": "main.js",
"dependencies": {
"asar": "^3.0.3",
"axios": "^0.20.0",
"fs-extra": "^9.0.1",
"jwt-decode": "^3.0.0-beta.2",
"keytar": "^6.0.1",
"node-fetch": "^2.6.1",
"puppeteer-core": "^5.3.0"
},
"devDependencies": {
"electron": "^10.1.2",
"electron-packager": "^15.1.0"
},
"scripts": {
"start": "electron .",
"package-mac": "electron-packager . --overwrite --platform=darwin --arch=x64 --icon=assets/icons/mac/icon.icns --prune=true --out=release-builds",
"package-win": "electron-packager . electron_app --overwrite --asar --platform=win32 --arch=x64 --icon=assets/img/icons/win/icon.ico --prune=true --out=release-builds --version-string.CompanyName=CE --version-string.FileDescription=CE --version-string.ProductName=\"Test App\"",
"package-linux": "electron-packager . electron-tutorial-app --overwrite --asar=true --platform=linux --arch=x64 --icon=assets/icons/png/1024x1024.png --prune=true --out=release-builds"
},
"keywords": [],
"author": "",
"license": "ISC"
}
包装码与This guide here完全一样。
结论
现在打包应用程序后,一些不需要 json files
的脚本可以正常工作。但是现在上面的 sample program
变得毫无用处,因为不再创建 json 文件。
** 如何使这项工作? **
Note: I have NOT used ipcRenderer() anywhere in my program.
更新
我发现 asar
是只读文件。
那么有没有办法将我的 json 保存位置更改为 Local/Appdata?
谢谢您,如果解释太大,我们深表歉意。
是的,写入应用程序位置不是一个好主意,而且通常被禁止。使用通常用于应用程序设置等的appdata文件夹应该就足够了
app.getPath(name)
是您要查找的函数。
然后做类似的事情:
fs.writeFileSync(app.getPath("appData") + "/auth.json", element);
或者更好,使用 path
:
fs.writeFileSync(path.join(app.getPath("appData"), "auth.json"), element);
问题
FrameWork - ElectronJS
我的程序使用 .json
文件来保存用户输入的数据。在开发环境下这些文件写的很完美,但是用electron-packager
打包后JSON的文件就不再写了,这让我的程序完全失效了。
我主要使用那些 JSON
文件来编写我的程序,因此完全删除它们将再次从头开始编写程序。有没有办法让程序像在开发环境中一样在客户端 PC 中写入 JSON
文件。
示例程序
这只是一个示例程序,但我所有的代码都是这种格式。
//JavaScript
//This Javascript catches user inputs and send them to jsonWriter function
document.getElementById("save").addEventListener('click', async function(e) {
e.preventDefault()
var userData = document.getElementById('username').value
var acctData = document.getElementById('account').value
var formData = {
username: userData,
account: acctData
}; // create JS object
await writer.jsonLC(formData);
});
// This is my json Writer function
async function jsonForAuth(data){
let element = JSON.stringify(data);
fs.writeFileSync(__dirname + '\data\auth.json', element)
//All my directory for 'fs' are written in such format with a '__dirname'
}
module.exports.jsonLC = jsonForAuth;
// All of this works perfectly on dev-environment (VS-Code)
现在我用electron-packager
// Here is my package.json for reference
{
"name": "electron_app",
"productName": "Test App",
"version": "1.0.0",
"description": "",
"main": "main.js",
"dependencies": {
"asar": "^3.0.3",
"axios": "^0.20.0",
"fs-extra": "^9.0.1",
"jwt-decode": "^3.0.0-beta.2",
"keytar": "^6.0.1",
"node-fetch": "^2.6.1",
"puppeteer-core": "^5.3.0"
},
"devDependencies": {
"electron": "^10.1.2",
"electron-packager": "^15.1.0"
},
"scripts": {
"start": "electron .",
"package-mac": "electron-packager . --overwrite --platform=darwin --arch=x64 --icon=assets/icons/mac/icon.icns --prune=true --out=release-builds",
"package-win": "electron-packager . electron_app --overwrite --asar --platform=win32 --arch=x64 --icon=assets/img/icons/win/icon.ico --prune=true --out=release-builds --version-string.CompanyName=CE --version-string.FileDescription=CE --version-string.ProductName=\"Test App\"",
"package-linux": "electron-packager . electron-tutorial-app --overwrite --asar=true --platform=linux --arch=x64 --icon=assets/icons/png/1024x1024.png --prune=true --out=release-builds"
},
"keywords": [],
"author": "",
"license": "ISC"
}
包装码与This guide here完全一样。
结论
现在打包应用程序后,一些不需要 json files
的脚本可以正常工作。但是现在上面的 sample program
变得毫无用处,因为不再创建 json 文件。
** 如何使这项工作? **
Note: I have NOT used ipcRenderer() anywhere in my program.
更新
我发现 asar
是只读文件。
那么有没有办法将我的 json 保存位置更改为 Local/Appdata?
谢谢您,如果解释太大,我们深表歉意。
是的,写入应用程序位置不是一个好主意,而且通常被禁止。使用通常用于应用程序设置等的appdata文件夹应该就足够了
app.getPath(name)
是您要查找的函数。
然后做类似的事情:
fs.writeFileSync(app.getPath("appData") + "/auth.json", element);
或者更好,使用 path
:
fs.writeFileSync(path.join(app.getPath("appData"), "auth.json"), element);