javascript 如何用Electron打开React的屏幕?

eqqqjvef  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(142)

我有一个项目,我正在用Electron做桌面应用程序,并使用React作为模板引擎。但我不知道如何打开一个新屏幕来使用Electron进行React。
这是我的项目的目录层次结构:https://i.stack.imgur.com/RvI77.png
在我的main -〉index.js中,我有这样一段代码,它是我的应用程序的init:

'use strict'

import { app, BrowserWindow, ipcMain } from 'electron'
import * as path from 'path'
import { format as formatUrl } from 'url'
import { NOME_APLICACAO, ABRIR_TELA_DE_VENDAS } from '../utils/constants.js';

const isDevelopment = process.env.NODE_ENV !== 'production'

// global reference to login window (necessary to prevent the window from being garbage collected)
let loginWindow;
let vendaWindow;

function createLoginWindow() {
  const window = new BrowserWindow({ 
    title: NOME_APLICACAO,
    webPreferences: { nodeIntegration: true }
  });

  if (isDevelopment) {
    window.webContents.openDevTools()
  };

  if (isDevelopment) {
    window.loadURL(`http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}`)
  }
  else {
    window.loadURL(formatUrl({
      pathname: path.join(__dirname, 'index.html'),
      protocol: 'file',
      slashes: true
    }))
  }

  window.on('closed', () => {
    loginWindow = null
  })

  window.webContents.on('devtools-opened', () => {
    window.focus()
    setImmediate(() => {
      window.focus()
    })
  })

  return window;
}

// quit application when all windows are closed
app.on('window-all-closed', () => {
  // on macOS it is common for applications to stay open until the user explicitly quits
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  // on macOS it is common to re-create a window even after all windows have been closed
  if (loginWindow === null) {
    loginWindow = createLoginWindow()
  }
})

// create main BrowserWindow when electron is ready
app.on('ready', () => {
  loginWindow = createLoginWindow()
})

当我启动项目时,它会打开view -〉index.js screen,index.js screen有以下代码:

import React from "react"
import ReactDOM from "react-dom"
import Login from "./component/loginView/Login"

ReactDOM.render(
    <Login />, 
    document.getElementById("app") 
)

从我的学习中了解到,视图-〉'index.js'需要在id为“app”的元素中附加一个.html文件。但是正如你在我的目录层次结构中看到的,我在任何地方都没有任何.html文件。所以,我不知道在哪里附加了index.js文件。这是我的第一个问题。
我的第二个问题是,正如你所看到的,window.loadURL(http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT})这个指令在main -〉index.js中足以打开view -〉index.js,我不知道如何。我想知道如何,因为我有其他页面,如view -〉vendaView.js,我想在main -〉index.js中打开,但我不知道如何编写它。
我很感激任何帮助。

zbsbpyhn

zbsbpyhn1#

你现在是在开发环境中运行,所以electron在运行的时候打开了http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT},它并不是打开你写的任何src文件,实际上它们不能被浏览器读取(也包括电子)。在开发环境中,当您运行npm start或任何启动命令时,它会将源文件构建为浏览器可读版本,并在端口process.env.ELECTRON_WEBPACK_WDS_PORT上静态服务。电子在屏幕上显示内容。
您可以通过在浏览器中打开相同的URL来确认。
当你不在开发环境中时,浏览器应该打开构建文件的index.html。构建的文件可以被浏览器读取。所以,我怀疑配置:

pathname: path.join(__dirname, 'index.html')

将无法工作。因此,您必须告诉electron打开构建文件的索引,如下所示:

pathname: path.join(__dirname, '../build/index.html')

例如:src文件的<Login/>标记无法在浏览器中显示,但当您的src构建时,它将被一组具有可显示内容的标记替换。
Electron的大部分功能由Chromium、Node.js和V8.ref的核心组件提供:https://www.electronjs.org/blog/electron-6-0
您的index.js会根据Electron浏览器打开的环境(dev或prod)更改静态服务和构建的索引。

相关问题