If you've already tried using react-router-dom with Electron, had difficulties getting it to work both in development and in production and in different windows, this library is for you π
Features
- π Ready for Development and Production environments
- π₯ Works on Multiple windows
- π¦ Isolated routes by window id
Installation
In your terminal, run:
yarn add electron-router-dom # OR npm i electron-router-dom
Router DOM is a peer dependency, if you haven't installed it yet or your package manager won't handle it automatically for you, so run:
yarn add react-router-dom # OR npm i react-router-dom
Usage
The main thing to keep in mind is: you must use the same window id in the Electron Main Process used in createFileRoute
and createURLRoute
functions and in the Electron Renderer Process in the <Router>
component prop names.
Electron Main Process
import { app, BrowserWindow, BrowserWindowConstructorOptions as WindowOptions, } from 'electron' import { createFileRoute, createURLRoute } from 'electron-router-dom' import { join } from 'path' function createWindow(id: string, options: WindowOptions = {}) { const window = new BrowserWindow({ width: 700, height: 473, ...options, }) const devServerURL = createURLRoute(process.env['ELECTRON_RENDERER_URL']!, id) const fileRoute = createFileRoute( join(__dirname, '../renderer/index.html'), id ) process.env.NODE_ENV === 'development' ? window.loadURL(devServerURL) : window.loadFile(...fileRoute) return window } app.whenReady().then(() => { createWindow('main', { webPreferences: { preload: join(__dirname, '../preload/index.js'), }, }) createWindow('about', { width: 450, height: 350, show: false, }) })
Electron Renderer Process
Create a routes.tsx
file:
import { Router, Route } from 'electron-router-dom' import { MainScreen, AboutScreen, SearchScreen } from './screens' export function AppRoutes() { return ( <Router main={ <> <Route path="/" element={<MainScreen />} /> <Route path="/search" element={<SearchScreen />} /> </> } about={<Route path="/" element={<AboutScreen />} />} /> ) }
Then, import the AppRoutes
in your index.tsx
:
import ReactDom from 'react-dom/client' import React from 'react' import { AppRoutes } from './routes' ReactDom .createRoot(document.querySelector('app') as HTMLElement) .render( <React.StrictMode> <AppRoutes /> </React.StrictMode> )
A simple example of a MainScreen component:
import { useNavigate } from 'react-router-dom' // The "App" comes from the context bridge in preload/index.ts const { App } = window export function MainScreen() { const navigate = useNavigate() return ( <main> <button onClick={() => navigate('/search')}>Go to Search screen</button> <button onClick={App.OpenAboutWindow}>Open About window</button> </main> ) }
To get more knowledge about this library, please,
check the Electron Router DOM GitHub Repository
Thanks π
Top comments (1)
Tysm.