Note: This post is a summary of information paraphrased from an excellent blog post by Christian Sepulveda.
Create the app and download the necessary dependencies.
create-react-app my-app
cd my-app
yarn add electron --dev
yarn add electron-builder --dev
yarn global add foreman # for process management
yarn install
Add electron-quick-start's main.js to src
folder as electron-starter.js
.
Make the mainWindow.loadUrl
call look like this instead:
// load the index.html of the app.
const startUrl = process.env.ELECTRON_START_URL || url.format({
pathname: path.join(__dirname, '/../build/index.html'),
protocol: 'file:',
slashes: true
});
mainWindow.loadURL(startUrl);
Create a file called electron-wait-react.js
in src
directory:
const net = require('net');
const port = process.env.PORT ? (process.env.PORT - 100) : 3000;
process.env.ELECTRON_START_URL = `http://localhost:${port}`;
const client = new net.Socket();
let startedElectron = false;
const tryConnection = () => client.connect({port: port}, () => {
client.end();
if(!startedElectron) {
console.log('starting electron');
startedElectron = true;
const exec = require('child_process').exec;
exec('npm run electron');
}
}
);
tryConnection();
client.on('error', (error) => {
setTimeout(tryConnection, 1000);
});
Ensure that the name
, description
, author
, and version
fields of your package.json are filled out. Then make the package.json look like this at the bottom:
"homepage": "./",
"main": "src/electron-starter.js",
"scripts": {
"start": "nf start -p 3000",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject",
"electron": "electron .",
"electron-start": "node src/electron-wait-react",
"react-start": "react-scripts start",
"pack": "build --dir",
"dist": "npm run build && build",
"postinstall": "install-app-deps"
},
"build": {
"appId": "com.electron.electron-with-create-react-app",
"win": {
"iconUrl": "https://cdn2.iconfinder.com/data/icons/designer-skills/128/react-256.png"
},
"directories": {
"buildResources": "public"
}
}
Create a file called Procfile
in the root folder of the app and put the following code in it:
react: npm run react-start
electron: npm run electron-start
Run using:
yarn start
Hi, I moved step by step and I faced these errors can you help?
$ npm start > [email protected] start C:\Users\Dev\desktop\itxi\React\airport-miami > nf start -p 3000 2:23:22 PM react.1 | > [email protected] react-start C:\Users\Dev\desktop\ itxi\React\airport-miami 2:23:22 PM react.1 | > BROWSER=none react-scripts start 2:23:22 PM react.1 | 'BROWSER' is not recognized as an internal or external command, 2:23:22 PM react.1 | operable program or batch file. 2:23:22 PM react.1 | npm 2:23:22 PM react.1 | ERR! code 2:23:22 PM react.1 | ELIFECYCLE 2:23:22 PM react.1 | npm 2:23:22 PM react.1 | ERR! errno 2:23:22 PM react.1 | 1 2:23:22 PM react.1 | npm 2:23:22 PM react.1 | ERR! [email protected] react-start:
BROWSER=none re act-scripts start
2:23:22 PM react.1 | npm 2:23:22 PM react.1 | ERR! Exit status 1 2:23:22 PM react.1 | npm ERR! 2:23:22 PM react.1 | npm ERR! Failed at the [email protected] react-start script. 2:23:22 PM react.1 | npm ERR! This is probably not a problem with npm. There is likely additional logging output above. 2:23:22 PM electron.1 | > [email protected] electron-start C:\Users\Dev\deskt op\itxi\React\airport-miami 2:23:22 PM electron.1 | > node src/start-react 2:23:22 PM react.1 | npm ERR! A complete log of this run can be found in: 2:23:22 PM react.1 | npm ERR! 2:23:22 PM react.1 | C:\Users\Dev\AppData\Roaming\npm-cache_logs\2019- 02-22T12_23_22_605Z-debug.log [DONE] Killing all processes with signal SIGINT 2:23:22 PM react.1 Exited with exit code null 2:23:42 PM electron.1 | (node:1068) MaxListenersExceededWarning: Possible Event Emitter memory leak detected. 11 connect listeners added. Use emitter.setMaxList eners() to increase limit