一、背景知识
1.1、nodejs内置的fs文件系统模块
Nodejs--fs文件系统模块 - 简书 (jianshu.com)
1.2、fs 文件系统模块--路径动态拼接的问题
Nodejs--fs 文件系统模块--路径动态拼接的问题 - 简书 (jianshu.com)
1.3、process.cwd()
可以用来获取执行node命令时候的文件夹地址
二、如何动态获取Electron中配置文件的path?
__dirname
Node中的__dirname(前面有两个下划线)是一个全局变量,用来确定当前运行的文件所在的目录。是被执行的js文件的目录。
process.cwd()
process.cwd()是表示当前工作目录,是当前执行node命令时候的目录。
我们先来看下不同环境中的process.cwd()获取的值(__dirname和process.cwd()相比较之下还是选择了process.cwd())
/* 执行node命令时候的文件夹地址 */
const node_serve_path = process.cwd();
// 读取配置文件
export function readFile() {
return new Promise((resolve, reject) => {
console.log("node_serve_path----", node_serve_path);
console.log("__dirname---", __dirname);
});
}
本地运行打印结果
直接运行包里面的exe程序打印结果
安装成功后打印结果
从上面可以看出--这里的文件路径会根据环境不同而变化
我们重点还是放在安装后的打印结果,因为exe肯定都是用来安装到我们的电脑上面的
三、如何让我们项目中的配置文件--打包安装后--仍旧允许我们访问并且读写呢?
3.1、extraResources
这里需要用到electron的打包额外资源配置extraResources
它允许我们打包安装后--仍可以访问并且读写配置中的文件目录
3.2、这是我想要读写的配置文件的位置
image.png3.3、找到vue.config.js--把我的配置文件目录配置为extraResources
extraResources: ["./bin", "./conf"],
pluginOptions: {
electronBuilder: {
// 线上打包环境,静态资源不加载的问题
customFileProtocol: "./",
nodeIntegration: true,
builderOptions: {
productName: "设备互联终端", //项目名,也是生成的安装文件名 桌面应用.exe
/* extraResources在Electron的打包程序安装完成后,
同样可以根据不同的计算机,做一些特殊的配置,
这就需要在Electron中设置一个配置文件,同时赋予程序对文件有读写的权限。
*/
extraResources: ["./bin", "./conf"],
win: {
//win相关配置
icon: "icon.ico", //图标,当前图标在根目录下,注意这里有两个坑
target: [
{
target: "nsis", //利用nsis制作安装程序
arch: [
"x64", //64位
],
},
],
},
},
},
},
四、获取打包后的配置文件路径
node_serve_path是打包安装后的process.cwd()打印的结果
我们顺着这个路径找下去、可以看到有个resources文件夹,这就是electron的额外资源存放的目录了
点开resources发现了我的配置文件目录conf
点开conf就是我的配置文件了
既然目录层级确定了,我们就通过node的path模块组装我们的读写路径吧
这里路径动态判断了下--加以区分一下本地和打包的区别
/* 执行node命令时候的文件夹地址 */
const node_serve_path = process.cwd();
/* 判断是否是生产环境 */
const isDev = process.env.NODE_ENV === "development";
/* 需要读写的文件地址 */
const file_path = isDev
? path.join(node_serve_path, "/conf/11application.properties")
: path.join(node_serve_path, "/resources/conf/application.properties");
五、封装一个fs.js
读写完整代码如下
//引入node原生fs模块
const fs = require("fs");
// 引入node内置的path模块
const path = require("path");
//引入node原生读写配置
const ini = require("ini");
/* 执行node命令时候的文件夹地址 */
const node_serve_path = process.cwd();
/* 判断是否是生产环境 */
const isDev = process.env.NODE_ENV === "development";
/* 需要读写的文件地址 */
const file_path = isDev
? path.join(node_serve_path, "/conf/11application.properties")
: path.join(node_serve_path, "/resources/conf/application.properties");
// 读取配置文件
export function readFile() {
return new Promise((resolve, reject) => {
fs.readFile(file_path, "utf8", function (err, dataStr) {
if (err) return reject(err.message); //读取失败
/* application.properties 文件内容符合ini配置文件的格式,
就可以通过ini.parse把读取到的文件转成js可识别的对象 */
resolve(ini.parse(dataStr.toString()));
});
});
}
// 更改配置文件
export function writeFile(config) {
return new Promise((resolve, reject) => {
fs.writeFile(file_path, ini.stringify(config), function (err) {
if (err) return reject(err.message); //写入失败
resolve("写入成功");
});
});
}
网友评论