前端(Electron Nodejs)如何读取本地配置文件

使用electron封装了前端界面之后,最终打包为一个客户端(exe)。但是,最近项目组内做CS(c++开发)的,想把所有的配置都放进安装目录的配置文件中(比如config.json)。这做法,对于纯前端而言有点难以接收。

第一,纯前端不允许读取本地文件。就这一条,直接封死所有的路。
第二,读取配置,前端可以通过可视化界面存入本地缓存,不必要读取本地文件。

基于以上两点,我觉得读取本地文件不可能实现,况且时间紧任务重。奈何,前端话语权微乎其微。

最后,我咬着牙,实现了一下读取本地文件的需求。如有更好的方案,可以私信评论。

首先,纯js肯定干不了读取本地文件的事情。那么,只能用nodejs了。况且,electron内部已经集成了nodejs,所以使用nodejs是必然选择。

读取本地文件

需要分两步走。

第一,先获取本系统的安装目录。第二,使用fs读取config配置文件。具体代码如下:

// 获取 exe 的安装目录
// 使用electron 内部的方法 app.getPath
// 配置文件 background.js 中写入如下代码

import {
    app,
    protocol,
    BrowserWindow,
    Menu,
    Tray,
    globalShortcut,
    ipcMain,
    dialog
} from 'electron';


// 获取安装目录
// 这里要注意 获取的安装目录是反斜杠 也就是 c:\dev\xxxx
// 这肯定是不行的  nodejs在使用这种地址是读取不了的 
// 所以 后边加了一个replace 用于转换反斜杠
let exePath = path.dirname(app.getPath('exe')).replace(/\\/g, "/");

// 拼接好安装目录下的config.json
let configPath = `${exePath}/config.json`;

// 使用fs读取文件内容
const fs = require('fs');
fs.readFile(configPath, 'utf-8', (err, data) => {
    if (data) {
        // 注意要转换json
        const config = JSON.parse(data)
    }
})

传递数据

现在本地数据是读取到了。如何将数据传递到我们的前端工程中(我用的是vue)?

我想到了两种办法。

第一种,通过electron窗口的方法。

// 创建window之后可以使用这个方法传递消息
// win是new BrowserWindow
// 注意消息主题是 async-message

win.webContents.send('async-message', '消息')





// 前端js中可以这么接收
import { ipcRenderer } from 'electron';

// 注意 监听事件要和上边保持一致 async-message

ipcRenderer.on('async-message', (e, arg) => {
    console.log('渲染进程===我收到啦', arg)
})

第二种,就是node起一个服务,就相当于写了一个接口前端再去调用。

// nodejs 写一个服务

// 定义一个暂存数组  用于后边关闭并清除socket服务
var sockets = [];

// 创建一个httpserver
const http = require('http');// 创建服务器对象
const server = http.createServer();
const closeServer = () => { 
          sockets.forEach(function(socket){
              socket.destroy();
          });

          server.close(function(){
              console.log("close server!");
          });
}

// res.local_port 就是我们上边读取本地配置后的内容

server.listen(res.local_port);// 对错误进行捕获

server.on('error', (err) => {
       if (err.code == 'EADDRINUSE') {
            // 如果目标端口被占用将使用
           // NodeJS 随机分配的端口号
           server.listen(0);
       }
});// 在成功监听后,向终端输出被监听的端口号
server.on('listening', () => {
                console.log('【HTTP Server is running at http://127.0.0.1:' + server.address().port + ' 】')
})

server.on("connection",function(socket){
   sockets.push(socket);
   //console.log('sockets', sockets);
   socket.once("close",function(){
      sockets.splice(sockets.indexOf(socket),1);
   });
});

server.on('request', function (req, res) {
       const url = req.url;
                
       // 接口地址就是 /getInfo
       if(url === '/getInfo') {
          res.setHeader('content-type', 'application/json');
          res.end(ws_path);
          closeServer();
       } else {
          res.writeHeader(404);
          res.end('404 not found');
          closeServer();
       }
})



// 前端工程中 请求这个接口 就可以获取配置信息了

axios.get('http://127.0.0.1:3000/getInfo').then(res => {
    if (res.code == 200) {
        console.log('这里就是请求本地的配置 -- ', res.data);
    }
})

就这样,收工......

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Electron和Node.js在浏览器中打开本地视频,你可以使用Node.js的`fs`模块来读取本地视频文件,然后将文件路径作为`<video>`标签的`src`属性值,最后使用Electron的`BrowserWindow`模块来创建一个包含`<video>`标签的窗口。 具体步骤如下: 1. 在你的Electron项目目录下,创建一个视频文件夹,并将你的本地视频文件放入该文件夹中。 2. 在你的JavaScript文件中,使用`fs`模块读取本地视频文件,示例代码如下: ```javascript const { app, BrowserWindow } = require('electron'); const path = require('path'); const url = require('url'); const fs = require('fs'); let mainWindow; function createWindow() { mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, }, }); const filePath = path.join(__dirname, '/videos/video.mp4'); // 视频文件路径 const fileExists = fs.existsSync(filePath); if (fileExists) { mainWindow.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true, })); mainWindow.webContents.on('did-finish-load', () => { mainWindow.webContents.send('play-video', filePath); }); } else { console.error('视频文件不存在'); } mainWindow.on('closed', () => { mainWindow = null; }); } app.on('ready', createWindow); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { if (mainWindow === null) { createWindow(); } }); ``` 其中,`filePath`是你本地视频文件的路径,`fileExists`变量用于判断视频文件是否存在。 3. 在你的HTML文件中,创建一个包含`<video>`标签的页面,示例代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>My Video Player</title> </head> <body> <video id="video-player" width="640" height="360" controls> Your browser does not support the video tag. </video> <script src="./renderer.js"></script> </body> </html> ``` 其中,`<video>`标签的`id`属性为`video-player`,`controls`属性用于显示视频控制条。 4. 在你的renderer.js文件中,使用`ipcRenderer`模块来接收主进程发送的视频文件路径,并将其作为`<video>`标签的`src`属性值,示例代码如下: ```javascript const { ipcRenderer } = require('electron'); ipcRenderer.on('play-video', (event, filePath) => { const videoPlayer = document.getElementById('video-player'); videoPlayer.src = `file://${filePath}`; }); ``` 其中,`ipcRenderer.on('play-video', ...)`用于接收主进程发送的视频文件路径,`videoPlayer.src`用于将其作为`<video>`标签的`src`属性值。 5. 运行JavaScript文件,即可通过Electron打开包含`<video>`标签的窗口,自动播放指定的本地视频文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值