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

  1. 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()],
}
  1. Using the third-part C/C++, esm package 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 using require(). So it should be put into dependencies.

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)

Doing so will reduce the size of the packaged APP by electron-builder.