Skip to content

Instantly share code, notes, and snippets.

@ah-cog
Forked from matthewjberger/notes.md
Last active August 31, 2017 10:48
Show Gist options
  • Save ah-cog/8c49e3fb8eb9356a74b68bb1cefdb83d to your computer and use it in GitHub Desktop.
Save ah-cog/8c49e3fb8eb9356a74b68bb1cefdb83d to your computer and use it in GitHub Desktop.
How to make an electron app using Create-React-App and Electron with Electron-Builder.

This note describes how I assembled an application framework with:

  • Electron: for cross platform application frame
  • React: for UI
    • Node
  • (maybe) Postgres in Docker (with persistence via shared volume)
  • (maybe) SQLite
  • (maybe) Sequelize (in Node/React to interface with DB)
  • (maybe) Docker

Prerequisites

Instructions

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

References

This note is based on the blog post by Christian Sepulveda.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment