DEV Community

Sarkis Peha
Sarkis Peha

Posted on

First thoughts on Electron

As a web developer, I find that whenever I"m looking to try something new, I first see if there"s a way that I can leverage my knowledge foundation to find similarities play into the learning experience. Electron allows for such a cross and some wonderful analogies to getting started with desktop application development.

State management

The overlap in using a store between React and Electron is a nice getter/setter model similar to most state management systems in React. By requiring the electron-store, one can easily get going:

// electron main.js
const Store = require("electron-store");

const store = new Store({
defaults: {
  groceryList: {
    produce: ["apples", "carrots", "pears"]
    }
  }
});

ipcMain.handle("get-produce", () => {
  return store.get("groceryList.produce");
});
Enter fullscreen mode Exit fullscreen mode
// ui.jsx (React component)
function ProduceListComponent() {
  const [produce, setProduce] = useState(null);

  useEffect(() => {
    window.electron.getProduce().then(setProduce);
  }, []);

// ... use "produce" as needed
Enter fullscreen mode Exit fullscreen mode

The IPC as a REST API

Poking around at the tutorials, each is quick to get talking about the IPC. The IPC (Inter-Process Communication) is similar to an internal API within a web app. Where fetch is the browser"s way to make a request, electron.ipcRenderer.invoke is how this would be exposed to the Electron app"s UI. As can be seen, both are async and promise-based.

// Web API Request
const fetchPriceData = async () => {
  const response = await fetch("/api/price");
  return response.json();
};

// Electron IPC
const getPriceData = async () => {
  return await window.electron.invoke("get-price");
};
Enter fullscreen mode Exit fullscreen mode

Route Architecture

Similar to Node/Express, building a route for a web API is the equivalent to an IPC handler. HTTP methods are similar to the IPC channel names, and the request/response cycle is to the IPC invoke/return.

const express = require("express");
const app = express();

app.get("/api/price/:id", async (req, res) => {
  try {
    const productId = req.params.id;
    const productData = await database.getPriceById(productId);
    res.json(productData);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});
Enter fullscreen mode Exit fullscreen mode
const { ipcMain } = require("electron");

ipcMain.handle("get-product", async (event, productId) => {
  try {
    const productData = await database.getProductById(productId);
    return productData;
  } catch (error) {
    throw error;
  }
});
Enter fullscreen mode Exit fullscreen mode

It"s been a fun start with Electron, and I"m looking forward to tinkering around its extensive API for building desktop applications.

Top comments (0)