README.md
May 5, 2026 · View on GitHub
vite-plugin-electron-renderer
Support use Node.js API in Electron-Renderer
English | 简体中文
In short, vite-plugin-electron-renderer is responsible for polyfilling Electron, Node.js built-in modules.
Install
npm i vite-plugin-electron-renderer -D
Usage
- This just modifies some of Vite's default config to make the Renderer process works.
import renderer from 'vite-plugin-electron-renderer'
export default {
plugins: [renderer()],
}
- Using the third-part
C/C++,esmpackage in the Renderer process.
import renderer from 'vite-plugin-electron-renderer'
export default {
plugins: [
renderer({
resolve: {
// C/C++ modules should stay on require()
serialport: { type: 'cjs' },
// Pure ESM modules can be loaded through dynamic import()
got: { type: 'esm' },
},
}),
],
}
By the way, if a module is marked as
type: 'cjs', the plugin just loads it in usingrequire(). So it should be put intodependencies.
API (Define)
renderer(options: RendererOptions)
export interface RendererOptions {
/**
* Explicitly tell Vite how to load modules, which is very useful for C/C++ and `esm` modules
*
* - `type.cjs` loads through `require()` and exposes statically known names when possible
* - `type.esm` loads through top-level `await import()`
*
* @experimental
*/
resolve?: {
[module: string]: {
type: 'cjs' | 'esm'
/** Full custom how to generate the shim module */
build?: (args: {
cjs: (module: string) => Promise<string>
esm: (module: string) => Promise<string>
}) => Promise<string>
}
}
}
Examples
How to work
Load Electron and Node.js cjs-packages/built-in-modules (Schematic)
┏————————————————————————————————————————┓ ┏—————————————————┓
│ import { ipcRenderer } from 'electron' │ │ Vite dev server │
┗————————————————————————————————————————┛ ┗—————————————————┛
│ │
│ 1. Generate electron shim on first resolve │
│ node_modules/.vite-electron-renderer/electron │
│ │
│ 2. HTTP(Request): electron module │
│ ————————————————————————————————————————————————> │
│ │
│ 3. resolveId() redirects to │
│ node_modules/.vite-electron-renderer/electron │
│ ↓ │
│ const { ipcRenderer } = require('electron') │
│ export { ipcRenderer } │
│ │
│ 4. HTTP(Response): electron module │
│ <———————————————————————————————————————————————— │
│ │
┏————————————————————————————————————————┓ ┏—————————————————┓
│ import { ipcRenderer } from 'electron' │ │ Vite dev server │
┗————————————————————————————————————————┛ ┗—————————————————┛
Dependency Pre-Bundling
In general. Vite will pre-bundle all third-party modules in a Web-based usage format, but it can not adapt to Electron Renderer process especially C/C++ modules. So we must be make a little changes for this.
const _M_ = require('serialport')
export default _M_.default || _M_
export const SerialPort = _M_.SerialPort
// export other members ...
Modules configured as esm are shimmed with top-level await import() and re-exported directly.
dependencies vs devDependencies
| Classify | e.g. | dependencies | devDependencies |
|---|---|---|---|
| Node.js C/C++ native modules | serialport, sqlite3 | ✅ | ❌ |
| Node.js CJS packages | electron-store | ✅ | ✅ |
| Node.js ESM packages | execa, got, node-fetch | ✅ | ✅ (Recommend) |
| Web packages | Vue, React | ✅ | ✅ (Recommend) |
Why is it recommended to put properly buildable packages in devDependencies?
Doing so will reduce the size of the packaged APP by electron-builder.