electron-vite-vue/README.md

167 lines
6.4 KiB
Markdown
Raw Normal View History

2022-03-29 18:02:21 +08:00
# electron-vite-vue
2021-11-04 14:28:22 +08:00
2022-03-05 06:36:45 +08:00
[![awesome-vite](https://awesome.re/mentioned-badge.svg)](https://github.com/vitejs/awesome-vite)
2022-03-29 18:02:21 +08:00
![GitHub license](https://img.shields.io/github/license/caoxiemeihao/electron-vite-vue?style=flat)
![GitHub stars](https://img.shields.io/github/stars/caoxiemeihao/electron-vite-vue?color=fa6470&style=flat)
![GitHub forks](https://img.shields.io/github/forks/caoxiemeihao/electron-vite-vue?style=flat)
2021-11-12 08:35:08 +08:00
2021-11-04 14:28:22 +08:00
2021-11-09 19:38:57 +08:00
**English | [简体中文](README.zh-CN.md)**
2022-03-29 18:02:21 +08:00
🥳 Real simple `Electron` + `Vue` + `Vite` boilerplate.
2020-08-16 20:42:52 +08:00
2022-03-03 20:04:55 +08:00
## Quick Start
2021-11-02 15:06:09 +08:00
```bash
# clone the project
2022-03-29 18:02:21 +08:00
git clone https://github.com/caoxiemeihao/electron-vite-vue.git
2021-11-02 15:06:09 +08:00
# enter the project directory
2022-03-29 18:02:21 +08:00
cd electron-vite-vue
2021-11-02 15:06:09 +08:00
2021-12-11 10:43:21 +08:00
# install dependency
npm install
2021-11-02 15:06:09 +08:00
# develop
2021-12-11 10:43:21 +08:00
npm run dev
2021-11-02 15:06:09 +08:00
```
2020-08-16 21:00:37 +08:00
2022-03-03 20:04:55 +08:00
![quick-start](packages/renderer/public/images/quick-start.gif)
2022-03-23 20:03:44 +08:00
## Another way is by scaffolding started
```
npm create electron-vite
```
2022-03-05 06:36:45 +08:00
## Overview
This is a `Vite`-integrated `Electron` template built with simplification in mind.
The repo contains only the most basic files, dependencies and functionalities to ensure flexibility for various scenarios.
You need a basic understanding of `Electron` and `Vite` to get started. But that's not mandatory - you can learn almost all the details by reading through the source code. Trust me, this repo is not that complex. 😋
2021-11-11 18:29:18 +08:00
## Directory
2022-02-20 15:17:31 +08:00
A `dist` folder will be generated everytime when `dev` or `build` command is executed. File structure of `dist` is identical to the `packages` directory to avoid any potential path calculation errors.
2021-12-29 09:27:51 +08:00
2021-11-11 18:29:18 +08:00
```tree
2022-02-20 15:17:31 +08:00
├── dist Will be generated following the structure of "packages" directory
2021-12-29 09:27:51 +08:00
├ ├── main
├ ├── preload
├ ├── renderer
2021-11-11 18:29:18 +08:00
├── scripts
2022-02-20 15:17:31 +08:00
├ ├── build.mjs Build script -> npm run build
2022-02-09 08:51:25 +08:00
├ ├── watch.mjs Develop script -> npm run dev
2021-11-11 18:29:18 +08:00
2022-02-08 10:34:14 +08:00
├── packages
2022-01-27 11:27:25 +08:00
├ ├── main Main-process source code
2022-02-09 08:51:25 +08:00
├ ├── vite.config.ts
2022-01-27 11:27:25 +08:00
├ ├── preload Preload-script source code
2022-02-09 08:51:25 +08:00
├ ├── vite.config.ts
2022-01-27 11:27:25 +08:00
├ ├── renderer Renderer-process source code
2022-02-09 08:51:25 +08:00
├ ├── vite.config.ts
2021-11-11 18:29:18 +08:00
```
## `dependencies` vs `devDependencies`
- First, you need to know if the package is still needed at runtime after packed.
- Packages like [serialport](https://www.npmjs.com/package/serialport), [sqlite3](https://www.npmjs.com/package/sqlite3) are node-native modules and should be placed in `dependencies`. Vite will not build them and will treat them as externals.
- Packages like [vue](https://www.npmjs.com/package/vue), [react](https://www.npmjs.com/package/react) are pure javascript modules and can be built with Vite. They can be listed in `devDependencies` which helps reducing the size of bundled product.
## Use Electron, NodeJs API
2021-11-11 18:29:18 +08:00
> 🚧 Due to [electron security](https://www.electronjs.org/docs/latest/tutorial/security/) constraints, using Electron or NodeJS API in the rederer process is strongly discouraged.
The template provides two methods for using the NodeJs API in the rendering process:
1. Bypass the security constraints (**default**), located in the [main](https://github.com/caoxiemeihao/electron-vue-vite/tree/main) branch. `nodeIntegration` is enabled by default, making it easy to use.:tada:, but there are certain security risks 🚧.
2. Inject Render by preload script, located in the [withoutNodeIntegration](https://github.com/caoxiemeihao/electron-vue-vite/tree/withoutNodeIntegration) branch. `nodeIntegration` is turned off by default, the official recommended way of electron, more secure:lock:.
**For [1](https://github.com/caoxiemeihao/electron-vue-vite/tree/main), all NodeJs and Electron APIs can be used directly in the rendering process.**
2022-02-20 15:17:31 +08:00
**For [2](https://github.com/caoxiemeihao/electron-vue-vite/tree/withoutNodeIntegration), all NodeJs, Electron APIs injected into the rendering process via `Preload-script`**
you need to create a context bridge and expose the APIs you need to the renderer process.
Note that if your project uses typescript, you also need to add type declarations to the `Window` interface, for example:
2021-11-11 18:29:18 +08:00
2022-02-08 10:34:14 +08:00
* **packages/preload/index.ts**
2021-11-11 18:29:18 +08:00
```typescript
2021-12-20 09:48:32 +08:00
import fs from 'fs'
import { contextBridge, ipcRenderer } from 'electron'
// --------- Expose some API to Renderer-process. ---------
2021-11-11 18:29:18 +08:00
contextBridge.exposeInMainWorld('fs', fs)
contextBridge.exposeInMainWorld('ipcRenderer', ipcRenderer)
```
2022-02-08 10:34:14 +08:00
* **packages/renderer/src/global.d.ts**
2022-01-06 09:21:29 +08:00
```typescript
// Defined on the window
interface Window {
fs: typeof import('fs')
ipcRenderer: import('electron').IpcRenderer
}
```
2022-02-08 10:34:14 +08:00
* **packages/renderer/src/main.ts**
2021-11-11 18:29:18 +08:00
```typescript
2022-01-06 09:21:29 +08:00
// Use Electron, NodeJs API in Renderer-process
2021-11-11 18:29:18 +08:00
console.log('fs', window.fs)
console.log('ipcRenderer', window.ipcRenderer)
```
2021-05-08 17:29:38 +08:00
Finally, either way, for third-party NodeJs APIs (e.g. `sqlite3`), You'll also need to declare how it was imported in `packages/renderer/vite.config.ts` `defineConfig.plugins` so that the template can recognize them correctly. 👉 reference `issues` [resolveElectron](https://github.com/caoxiemeihao/electron-vue-vite/issues/52)
## Use SerialPort, SQLite3 or other node-native addons in Main-process
2022-02-20 15:23:58 +08:00
- First, you need to make sure the packages are listed in the "dependencies" since they are still needed at runtime after the project is packed.
2022-01-27 16:08:44 +08:00
2022-02-20 15:23:58 +08:00
- Source code of main process and preload scripts are also bundled with Vite[build.lib](https://vitejs.dev/config/#build-lib). Rollup configurations needed.
2022-02-20 15:17:31 +08:00
**More:** 👉 [packages/main/vite.config.ts](https://github.com/caoxiemeihao/electron-vue-vite/blob/main/packages/main/vite.config.ts)
```js
export default {
build: {
// built lib for Main-process, Preload-script
lib: {
entry: 'index.ts',
formats: ['cjs'],
fileName: () => '[name].js',
},
rollupOptions: {
// configuration here
external: [
'serialport',
'sqlite3',
],
},
},
}
```
2022-01-06 10:54:02 +08:00
## Main window
2021-11-11 18:29:18 +08:00
<img width="400px" src="https://raw.githubusercontent.com/caoxiemeihao/blog/main/electron-vue-vite/screenshot/electron-15.png" />
2021-11-02 15:06:09 +08:00
2022-03-30 09:47:11 +08:00
## <!-- Wechat | | -->请我喝杯下午茶 🥳
2022-03-23 20:00:06 +08:00
<div style="display:flex;">
2022-03-30 09:47:11 +08:00
<!-- <img height="333px" src="https://raw.githubusercontent.com/caoxiemeihao/blog/main/assets/wechat/group/qrcode.jpg" />
&nbsp;&nbsp;&nbsp;&nbsp; -->
2022-03-23 20:03:44 +08:00
<img height="333px" src="https://raw.githubusercontent.com/caoxiemeihao/blog/main/assets/wechat/%24qrcode/%24.png" />
2022-03-23 20:00:06 +08:00
</div>
2021-06-20 19:10:27 +08:00