Vite+Electron+React
This template is forked from Vite Electron Builder Boilerplate, now prepared for react.
Vite is used for compilation, and electron-builder for packaging.
-
This fork is maintained by Autumn.
-
Found a problem? Pull requests are welcome.
Follow these steps to get started with this template:
- Click the Use this template button (you must be logged in) or just clone this repo.
- If you want use another package manager don't forget edit
.github/workflows
-- it usesnpm
by default.
That's all you need.
Note: This template uses npm v7 feature — Installing Peer Dependencies Automatically. If you are using a different package manager, you may need to install some peerDependencies manually.
- Template use the latest electron version with all the latest security patches.
- The architecture of the application is built according to the security guids and best practices.
- The latest version of the electron-builder is used to compile the application.
- Vite is used to bundle all source codes. This is an extremely fast packer that has a bunch of great features. You can learn more about how it is arranged in this video.
- Vite supports reading
.env
files. You can also specify types of your environment variables intypes/vite-env.d.ts
.
Vite provides you with many useful features, such as: TypeScript
, TSX/JSX
, CSS/JSON Importing
, CSS Modules
, Web Assembly
and much more.
- The Latest TypeScript is used for all source code.
- Vite supports TypeScript out of the box. However, it does not support type checking.
- Code formatting rules follow the latest TypeScript recommendations and best practices thanks to @typescript-eslint/eslint-plugin.
React (optional)
- By default, web pages are built using React. However, you can easily change it. Or do not use additional frameworks at all. See examples of web pages for different frameworks.
- Code formatting rules follow the latest Vue recommendations and best practices thanks to eslint-plugin-react.
The template required a minimum dependencies. Only Vite is used for building, nothing more.
The structure of this template is very similar to the structure of a monorepo.
The entire source code of the program is divided into three modules (packages) that are bundled each independently:
packages/main
Electron main script.packages/preload
Used inBrowserWindow.webPreferences.preload
. See Checklist: Security Recommendations.packages/renderer
Electron web page.
Packages main
and preload
are built in library mode as it is a simple javascript.
renderer
package build as regular web app.
The build of web resources is performed in the scripts/build.js
. Its analogue is a sequential call to vite build
for each package.
Next step is run packaging and compilation a ready for distribution Electron app for macOS, Windows and Linux with "auto update" support out of the box.
To do this, using the electron-builder:
- In npm script
compile
: This script is configured to compile the application as quickly as possible. It is not ready for distribution, is compiled only for the current platform and is used for debugging. - In GitHub Action: The application is compiled for any platform and ready-to-distribute files are automatically added to the draft GitHub release.
According to Electron's security guidelines, Node.js integration is disabled for remote content. This means that you cannot call any Node.js api in the packages/renderer
directly. To do this, you must describe the interface in the packages/preload
where Node.js api is allowed:
// packages/preload/src/index.ts
import {readFile} from 'fs/promises'
// Please considering using ipcMain and ipcRenderer instead
const api = {
readConfig: () => readFile('/path/to/config.json', {encoding: 'utf-8'}),
}
contextBridge.exposeInMainWorld('electron', api)
// source under packages/renderer/
const {readConfig} = window.electron
Read more about Security Considerations.
All environment variables set as part of the import.meta
, so you can access them as follows: import.meta.env
.
You can also specify types of your environment variables in types/vite-env.d.ts
.
The mode option is used to specify the value of import.meta.env.MODE
and the corresponding environment variables files that needs to be loaded.
By default, there are two modes:
production
is used by defaultdevelopment
is used bynpm run watch
script
When running building, environment variables are loaded from the following files in your project root:
.env # loaded in all cases
.env.local # loaded in all cases, ignored by git
.env.[mode] # only loaded in specified env mode
.env.[mode].local # only loaded in specified env mode, ignored by git
Note: only variables prefixed with VITE_
are exposed to your code (e.g. VITE_SOME_KEY=123
) and SOME_KEY=123
will not. You can access VITE_SOME_KEY
using import.meta.env.VITE_SOME_KEY
. This is because the .env
files may be used by some users for server-side or build scripts and may contain sensitive information that should not be exposed in code shipped to browsers.
See Contributing Guide.