提问人:JEFF BRO 提问时间:11/17/2023 更新时间:11/17/2023 访问量:47
无法将 react 应用程序构建加载到 electron 中
Not able to load react app build into electron
问:
我正在尝试将 react 构建文件实现到我的电子应用程序中并将其构建到 .exe 文件中。我被困在我的电子应用程序中得到空屏幕的地方,控制台 .log 中没有错误。在将链接传递给 mainWindow 对象后,我使用 npm run build 来获取 react 构建文件。
这些是我的代码.
main.js
const { app, BrowserWindow, ipcMain, Menu } = require('electron');
const { join } = require('path-browserify');
const url = require("url");
const path = require("path");
function createWindow() {
mainWindow = new BrowserWindow({
width: 1000,
height: 1000,
minWidth: 1000,
minHeight: 1000,
webPreferences: {
preload: join(__dirname, './preload.js'),
nodeIntegration: true,
worldSafeExecuteJavaScript: true,
// allowRunningInsecureContent: true,
contextIsolation: true,
},
});
const startURL = url.format({pathname: join(__dirname, './/finalelectronapp//build//index.html'),
protocol: "file:"
})
mainWindow.loadURL( startURL);
if (process.env.NODE_ENV === 'development') {
mainWindow.webContents.openDevTools();
}
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();
}
});
ipcMain.on('reload-window', () => {
mainWindow.reload();
});
ipcMain.on('installation-complete', () => {
if (installWindow) {
installWindow.close();
installWindow = null;
}
createWindow();
});
电子包.json
{
"name": "electroninstallion",
"version": "1.0.0",
"description": "",
"main": "installation.js",
"scripts": {
"start-electron": "electron ./main.js",
"start": "nodemon --exec electron ./main.js",
"test": "echo \"Error: no test specified\" && exit 1",
"build": "electron-packager . --asar",
"allbuild": "electron-packager . --all",
"homepage": "./"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^1.6.0",
"electron-is-dev": "^2.0.0",
"fs": "^0.0.1-security",
"mssql": "^10.0.1",
"path-browserify": "^1.0.1",
"process": "^0.11.10",
"react-router-dom": "^6.17.0",
"sqlite3": "^5.1.6",
"tedious": "^16.6.0"
},
"devDependencies": {
"electron": "^27.0.2",
"electron-build": "^0.0.3",
"electron-packager": "^17.1.2",
"node-windows": "^1.0.0-beta.8",
"nodemon": "^3.0.1",
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4"
}
}
React index.html 位于构建文件夹中
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="./favicon.ico" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Web site created using create-react-app" />
<link rel="apple-touch-icon" href="./logo192.png" />
<link rel="manifest" href="./manifest.json" />
<title>React App</title>
<script defer="defer" src="./static/js/main.301e95eb.js"></script>
<link href="./static/css/main.94852128.css" rel="stylesheet">
</head>
<body><noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
反应包.json
{
"name": "frontend",
"version": "0.1.0",
"homepage": "./",
"private": true,
"dependencies": {
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.14.16",
"@mui/material": "^5.14.16",
"@reduxjs/toolkit": "^1.9.7",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"@types/jest": "^27.5.2",
"@types/node": "^16.18.60",
"@types/react": "^18.2.33",
"@types/react-dom": "^18.2.14",
"axios": "^1.6.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-redux": "^8.1.3",
"react-router-dom": "^6.18.0",
"react-scripts": "5.0.1",
"sass": "^1.69.5",
"typescript": "^4.9.5",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "npm run build:react && npm run build:bundle",
"build:react": "react-scripts build",
"build:bundle": "webpack --config webpack.config.js",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@babel/core": "^7.23.3",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-env": "^7.23.3",
"@babel/preset-react": "^7.23.3",
"@types/glob": "^8.1.0",
"babel-loader": "^9.1.3",
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4"
}
}
反应 webpack.config.js
const path = require("path");
const TerserPlugin = require("terser-webpack-plugin");
const glob = require("glob");
module.exports = {
entry: {
"bundle.js": [
...glob
.sync("build/static/?(js|css)/main.*.?(js|css)")
.map((f) => path.resolve(__dirname, f)),
],
},
output: {
filename: "build/static/js/bundle.min.js",
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
{
test: /\.(png|jpg|gif|svg)$/i,
use: [
{
loader: "url-loader",
options: {
limit: 8192,
name: "static/media/[name].[hash:8].[ext]",
},
},
],
},
{
test: /\.(png|jpg|gif|svg)$/i,
include: path.resolve(__dirname, "media"),
use: [
{
loader: "file-loader",
options: {
name: "static/media/[name].[hash:8].[ext]",
},
},
],
},
],
},
optimization: {
minimize: true,
minimizer: [new TerserPlugin()],
},
};
反应 Index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import { Provider } from 'react-redux';
import { store } from './Redux/Store'
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
<Provider store={store}>
<React.StrictMode>
<App />
</React.StrictMode>
</Provider>
);
反应 app.tsx
import React, { useState, useEffect } from 'react';
// import axios from 'axios';
import { Routes, Route, BrowserRouter as Router } from 'react-router-dom';
import Login from './Components/Login/Login';
import Header from './Components/Header/Header';
import Footer from './Components/Footer/Footer';
import QuickLinks from './Components/Pages/QuickLinks/QuickLinks';
import CustomerDashboard from './Components/Pages/CustomerDashboard/CustomerDashboard';
import MyTheme from "./Components/Theme";
import { ThemeProvider } from "@mui/material";
import CustomerDataDetails from './Components/Pages/CustomerData/CustomerDataDetails';
import CustomerDataDetailsDemo from './Components/Pages/CustomerDataDemo/CustomerDataDetailsDemo';
function App() {
return (
<>
{/* <ThemeProvider theme={MyTheme}> */}
{window.location.pathname !== '/'? (<></>) : (< Header />)}
<Router>
<Routes>
<Route path="/" element={< CustomerDataDetailsDemo />} />
{/* <Route path="/" element={< Login />} /> */}
<Route path="/QuickLinks" element={<QuickLinks/>} />
<Route path="/CustomerDataDetails" element={< CustomerDataDetails />} />
<Route path="/Dashboard" element={< CustomerDashboard />} />
</Routes>
</Router>
{window.location.pathname !=='/'? (<></>) : ( <Footer/>)}
{/* </ThemeProvider> */}
</>
);
}
export default App;
这就是我在控制台.log中得到的。
但是我能够在这个电子应用程序中运行其他 react 项目构建,但不能专门运行这个。
答: 暂无答案
评论
homepage
scripts
mainWindow.loadURL('file://' + path.join(__dirname, './finalelectronapp/build/index.html'))