electron访问本地react,react访问本地express

2023-04-06by@306757543-2dPFm&@ChatGPT.Model: gpt-3.5
306757543-2dPFm

electron访问本地react,react访问本地express

Avatar
Avatar

作为一个AI,我无法直接进行本地访问操作,但是我可以提供一些思路供您参考。

首先,您需要确保您的React应用和Express应用都是在本地运行的。

然后,您可以通过Electron提供的webPreferences配置项来允许Electron应用加载本地文件。例如:

const { app, BrowserWindow } = require('electron')

function createWindow () {
  const win = new BrowserWindow({
    webPreferences: {
      nodeIntegration: true,
      webSecurity: false,
      allowFileAccess: true // 允许加载本地文件
    }
  })

  win.loadFile('path/to/your/react/app/index.html')
}

app.whenReady().then(() => {
  createWindow()
})

在React应用中,您可以使用fetchaxios等工具向Express应用发送HTTP请求。例如:

fetch('http://localhost:3000/api/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error))

在Express应用中,您需要设置CORS(跨域资源共享)以允许来自React应用的跨域请求。例如:

const express = require('express')
const cors = require('cors')

const app = express()

app.use(cors())

app.get('/api/data', (req, res) => {
  res.json({ message: 'Hello from Express!' })
})

app.listen(3000, () => {
  console.log('Express app listening on port 3000')
})

这是一个简单的示例,您可以根据自己的需求进行修改。希望能帮到您!

306757543-2dPFm

electron同时开启react与express的本地服务

Avatar
Avatar

您可以在Electron应用中启动两个本地服务:一个是React应用的服务,另一个是Express应用的服务。

以下是一个简单的示例,假设React应用的服务在http://localhost:3000,Express应用的服务在http://localhost:4000

const { app, BrowserWindow } = require('electron')
const express = require('express')
const cors = require('cors')
const path = require('path')
const { spawn } = require('child_process')

let reactApp
let expressApp

function createMainWindow() {
  const win = new BrowserWindow({
    webPreferences: {
      nodeIntegration: true,
      webSecurity: false,
      allowFileAccess: true // 允许加载本地文件
    }
  })

  win.loadURL('http://localhost:3000')
}

function startReactApp() {
  // 启动React应用的服务
  reactApp = spawn('npm', ['start'], {
    cwd: path.join(__dirname, 'path/to/your/react/app'),
    shell: true,
    env: process.env
  })

  reactApp.stdout.on('data', data => console.log(data.toString()))
  reactApp.stderr.on('data', data => console.error(data.toString()))
}

function startExpressApp() {
  // 启动Express应用的服务
  expressApp = express()

  expressApp.use(cors())

  expressApp.get('/api/data', (req, res) => {
    res.json({ message: 'Hello from Express!' })
  })

  expressApp.listen(4000, () => {
    console.log('Express app listening on port 4000')
  })
}

app.whenReady().then(() => {
  startReactApp()
  startExpressApp()
  createMainWindow()
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('before-quit', () => {
  // 关闭React应用的服务
  reactApp.kill()
  // 关闭Express应用的服务
  expressApp.close()
})

在上面的示例中,我们使用了spawn函数来启动React应用的服务,并将其与Electron应用一起运行。而对于Express应用的服务,我们直接在Electron应用中启动它。

before-quit事件中,我们需要确保关闭React应用的服务和Express应用的服务,以避免它们在Electron应用退出后继续运行。