- 638d0f3 feat: support main process control hot-reload
- c58fbf9 feat: mock index.html for support use the main process only
Hot Reload
Since v0.29.0
, when preload scripts are rebuilt, they will send an electron-vite&type=hot-reload
event to the main process.
If your App doesn't need a renderer process, this will give you hot-reload.
// electron/main.ts
process.on('message', (msg) => {
if (msg === 'electron-vite&type=hot-reload') {
for (const win of BrowserWindow.getAllWindows()) {
// Hot reload preload scripts
win.webContents.reload()
}
}
})
- 3239718 fix: better exit app #251
- 927885d fix: unable to disable watch #252
- f043f74 chore: cleanup
- 149c4a9 Merge pull request #247 from think-flow/testfix
- f9bda13 fix: notBundle test is failed
- b3cf74c chore: cleanup, code format
- 957b144 Merge pull request #233 from kuoruan/feat/config
- c0f2647 feat: inherit more config from base user config
Contributors:
- be94383 fix:
ElectronOptions['startup']
definition - 96905d9 chore: compatible vite@4 resolve node first
- a16fe3c fix: hot-reload compatible vite@4
- f325403 chore: update comments
- 5ebd3a6 Merge pull request #229 from ThatKawaiiSam/feat/custom-electron-fork
- dbc85dc feat: allow custom electron forks in
startup
call - 8b076be chore: update deprecated API
Contributors:
- 4f7748c chore: restore
vite-plugin-electron-renderer
inpeerDependencies
- 412ed9b fix(#214): catch the
process.kill(pid)
error
- a300c08 fix: remove electron@28 version pre-deps
- 5b0fc87 feat: use
treeKillSync()
insteadtree-kill
- efc5826 fix: correct
calcEntryCount()
for startup - cf0e91f feat: startup support
SpawnOptions
#194 - 512a1c5 Merge pull request #204 from SanGongHappy/tree-kill-sync
- edf4bf6 refactor: better
treeKillSync
implemented - 82cd32f Merge branch 'electron-vite:main' into tree-kill-sync
- 6e122a7 feat: polyfill
process.env
by default - 45f28bb (github/main, main) chore: update CHANGELOG
- f9b81e4 chore(simple): update comments
- b5376a9 docs: add
Built format
- e334366 copy tree-kill
- 20170a5 refactor: preload built
format
useesm
by default
- No break changes. Just need to define
"type": "module"
in package.json for supportsesm
:) - By the way. Recommend using the
vite-plugin-electron/simple
API. It is simpler, and the main difference is its adaptation topreload
scripts. - electron@28 Preload scripts 👉 limitations.
In most cases, use cjs
format
`require()` can usable matrix
@see - https://github.com/electron/electron/blob/v30.0.0-nightly.20240104/docs/tutorial/esm.md#preload-scripts
┏———————————————————————————————————┳——————————┳———————————┓
│ webPreferences: { } │ import │ require │
┠———————————————————————————————————╂——————————╂———————————┨
│ nodeIntegration: false(undefined) │ ✘ │ ✔ │
┠———————————————————————————————————╂——————————╂———————————┨
│ nodeIntegration: true │ ✔ │ ✔ │
┠———————————————————————————————————╂——————————╂———————————┨
│ sandbox: true(undefined) │ ✘ │ ✔ │
┠———————————————————————————————————╂——————————╂———————————┨
│ sandbox: false │ ✔ │ ✘ │
┠———————————————————————————————————╂——————————╂———————————┨
│ nodeIntegration: false │ ✘ │ ✔ │
│ sandbox: true │ │ │
┠———————————————————————————————————╂——————————╂———————————┨
│ nodeIntegration: false │ ✔ │ ✘ │
│ sandbox: false │ │ │
┠———————————————————————————————————╂——————————╂———————————┨
│ nodeIntegration: true │ ✘ │ ✔ │
│ sandbox: true │ │ │
┠———————————————————————————————————╂——————————╂———————————┨
│ nodeIntegration: true │ ✔ │ ✔ │
│ sandbox: false │ │ │
┗———————————————————————————————————┸——————————┸———————————┛
- import(✘): SyntaxError: Cannot use import statement outside a module
- require(✘): ReferenceError: require is not defined in ES module scope, you can use import instead
This is just the default behavior, and you can modify them at any time through custom config in the vite.config.js
{ "type": "module" }
┏————————————————————┳——————————┳———————————┓
│ built │ format │ suffix │
┠————————————————————╂——————————╂———————————┨
│ main process │ esm │ .js │
┠————————————————————╂——————————╂———————————┨
│ preload scripts │ cjs │ .mjs │ diff
┠————————————————————╂——————————╂———————————┨
│ renderer process │ - │ .js │
┗————————————————————┸——————————┸———————————┛
{ "type": "commonjs" } - default
┏————————————————————┳——————————┳———————————┓
│ built │ format │ suffix │
┠————————————————————╂——————————╂———————————┨
│ main process │ cjs │ .js │
┠————————————————————╂——————————╂———————————┨
│ preload scripts │ cjs │ .js │ diff
┠————————————————————╂——————————╂———————————┨
│ renderer process │ - │ .js │
┗————————————————————┸——————————┸———————————┛
- d7c0a91 feat: preload built
format
adapt toesm
- f557a98 feat: supports
"type": "module"
, betteresm
logic
No break changes. Just need to define"type": "module"
in package.json for supportsesm
:)By the way. Recommend using thevite-plugin-electron/simple
API. It is simpler, and the main difference is its adaptation topreload
scripts.electron@28 Preload scripts 👉 limitations.
- 9ec82b5 feat: supports electron@28, build
esm
by default - 5dd3ccd feat: bump deps to vite@5, electron@28 and others
- 39520cc feat: upgrade to vite@5
- 3340cfc chore: prevent encounter problem
Why
v0.28.0
? This is consistent withelectron@28
, meaning it is recommended to use electron@28+, which is the first version to supportesm
.
🚨 deprecated
-
Updatemain
ofpackage.json
foresm
{ - "main": "dist-electron/main.js", + "main": "dist-electron/main.mjs", }
-
If you still need to usecjs
, you need to make some changesSimple APIimport electron from 'vite-plugin-electron/simple' export default { plugins: [ electron({ main: { - entry: 'electron/main.ts', + vite: { + build: { + lib: { + entry: 'electron/main.ts', + formats: ['cjs'], + fileName: () => '[name].js', + }, + }, + }, }, }), ], }
Flat APIimport electron from 'vite-plugin-electron' export default { plugins: [ electron({ - entry: 'electron/main.ts', + vite: { + build: { + lib: { + entry: 'electron/main.ts', + formats: ['cjs'], + fileName: () => '[name].js', + }, + }, }, }), ], }
- f57a60a fix(#182, #187): correctly
options.reload()
- f606551 Merge pull request #178 from electron-vite/v0.15.4
- 532e0b4 Merge pull request #177 from Siykt/main
- 845c39b fix: add SIGKILL to tree-kill call
Contributors:
- 20907ef chore: recover
v0.15.1
- 9719203 chore: better exit
electron
logic
- 2119108 fix: correct use
tree-kill
- 234be07 fix:
tree-kill
doesn't work - 5e6c36d feat:
calcEntryCount()
- bbd6bd1 Merge branch 'main' of github.com:electron-vite/vite-plugin-electron into main
- 9a910e5 Merge pull request #166 from CommandMC/fix/wait-for-all-files
- 3962718 fix: startup electron wait for all files built
- 7f75ae2 Merge branch 'fix/wait-for-all-files' of https://github.com/CommandMC/vite-plugin-electron into main
- 65b73c2 Merge pull request #122 from sevenc-nanashi/main
- e4033c3 Merge pull request #1 from caoxiemeihao/cleanup
- 8e70a39 chore: cleanup
- 20dd675 refactor: migrate examples to
github.com/caoxiemeihao/electron-vite-samples
- de9259f Change: Use peer-dependency
- 8247192 Merge: main -> main
- ab990b9 Wait until the last file is done bundling before starting Electron
- 6e5a033 Merge pull request #163 from electron-vite/v0.14.1
Fixs:
electron
does not exit correctly | 使用ctrl + c 停止代码,electron后台不关闭 #168, #122- Fixed
electron
startup timing #166
Contributors:
- ba14f55 feat(simple): Preload scripts code not split by default
- 3cc71ca feat(simple): build Preload scripts as
cjs
by default
- d3cf87f feat: simple API build
- d8c3c27 feat: simple API 🥳
See 👉 Simple API
import electron from 'vite-plugin-electron/simple'
electron({
main: {},
preload: {},
renderer: {},
})
- 37e14b0 fix: remove
apply: 'serve'
- 4f196e3 fix: export bare
vite-plugin-electron/plugin
- 06c91f3 docs: v0.13.0
The user decides when notBundle
should be used. See 👉 Not Bundle
import electron from 'vite-plugin-electron'
import { notBundle } from 'vite-plugin-electron/plugin'
export default defineConfig(({ command }) => ({
plugins: [
electron({
entry: 'electron/main.ts',
vite: {
plugins: [
command === 'serve' && notBundle(/* NotBundleOptions */),
],
},
}),
],
}))
- 86d9a34 chore: update pnpm lock
- c6aceb3 refactor: standalone
Not Bundle
plugin - b3decf4 Merge pull request #150 from haodaking/changelog
- 3f77d12 Update CHANGELOG.md
Users need to import the notBundle
plugin explicitly. See 👉 Not Bundle
import electron from 'vite-plugin-electron'
import { notBundle } from 'vite-plugin-electron/plugin'
export default {
plugins: [
electron({
entry: 'electron/main.ts',
vite: {
plugins: [
notBundle(/* NotBundleOptions */),
],
},
}),
],
}
- e5403c1 feat: check
cjs
availabe
- 5fbcf40 test: plugin
external_node_modules
- 9803e26 feat: non-bundle during dev 🚀
Let's use the electron-log
as an examples.
┏—————————————————————————————————————┓
│ import log from 'electron-log' │
┗—————————————————————————————————————┛
↓
Modules in `node_modules` are not bundled during development, it's fast!
↓
┏—————————————————————————————————————┓
│ const log = require('electron-log') │
┗—————————————————————————————————————┛
- 6822409 docs: v0.12.0
- 9ec9d3b v0.12.0
- 53a0dd8 feat: disable minify during dev
- 3925cd1 refactor: remove
defineConfig
,Configuration
->ElectronOptions
, config.ts -> utils.ts
- b033bc5 v0.11.2
- 8190208 docs: typo
- 111d495 refactor(🔨): better build logic
- 76611a9 fix: disable
browserField
by default #136 - 241534f feat: add
.npmrc
forpnpm
- 65d4ab1 chore: bump deps
- b4308e3 chore: rename
- 036e52c docs: update
- a222c48 examples: update quick-start
- d04155c examples: add javascript-api
- 9213ba0 docs: update
- 9b8da83 fix: cannot find type definition #126
- e864b81 examples: update multiple-window, add multiple-renderer
- 0a226b5 docs: update
- ff5e9dc feat: add logo.svg
- 7cec6ad examples: add multiple-windows
- f8528ed Merge pull request #123 from xhayper/patch-1
- 1e9f9b0 feat: remove extra dependencies
- 8fa6ce4 feat: update package and example
- 1d7eca5 feat: add test 🌱
- 9ef3e8e chore: bump deps
- 56446e2 chore: cleanup
- 2bf7d0b docs:
startup()
- 401a44e refactor: cleanup
// 0.10.0
function build(config: Configuration | Configuration[]): Promise<void>
// 0.11.0 - Same as Vite's build
function build(config: Configuration): Promise<RollupOutput | RollupOutput[] | RollupWatcher>
JavaScript API
vite-plugin-electron
's JavaScript APIs are fully typed, and it's recommended to use TypeScript or enable JS type checking in VS Code to leverage the intellisense and validation.
Configuration
- typedefineConfig
- functionresolveViteConfig
- function, Resolve the default Vite'sInlineConfig
for build Electron-MainwithExternalBuiltins
- functionbuild
- functionstartup
- function
Example:
build(
withExternalBuiltins( // external Node.js builtin modules
resolveViteConfig( // with default config
{
entry: 'foo.ts',
vite: {
mode: 'foo-mode', // for .env file
plugins: [{
name: 'plugin-build-done',
closeBundle() {
// Startup Electron App
startup()
},
}],
},
}
)
)
)
V8 Bytecode support 👉 bytecode
Inspired by:
- Support Vite4.x | #118, 28d38b6
- Bytecode example | df170c2
- JavaScript API docs | 3049169
- Fix load
.env
| 758695d - Refactor
build()
| d9c3343
- e4f943f refactor: move
build.resolve
toresolve
- 91fb525 docs(zh-CN): update | @ggdream
- 41db615 Use mode from source config. | #105, #106
- 0b24909 refactor: cleanup, provides some programmable APIs 🌱
- 58517d8 refactor(proj-struct): remove
vite-plugin-electron-renderer
- d2b3c29 Merge pull request #98 from skyrpex/patch-1
- 1645be2 fix: ignore the browser field when bundling
By default, the dist
folder will be automatically removed by Vite. We build Electron related files into dist-electron
to prevent it from being removed by mistake
- Remove Vite
3.2.0
| #90 - ad9bb3c refactor(electron-renderer)!: remove
options.resolve()
, use 'lib-esm' for resolve Node.js modules andelectron
| vite-plugin-electron-renderer - b500039 feat(electron-renderer): support
optimizeDeps
for Electron-Renderer 🚀 - f28e66b faet(outDir)!:
dist/electron
->dist-electron
| vite-plugin-electron
- 59a24df fix(electron-renderer): use
createRequire()
instead ofimport()
🐞 - 11cd4c3 feat(electron):
onstart
providesreload()
This is a redesigned version of the API(Only 3 APIs). Not compatible with previous versions!
export type Configuration = {
/**
* Shortcut of `build.lib.entry`
*/
entry?: import('vite').LibraryOptions['entry']
/**
* Triggered when Vite is built.
* If passed this parameter will not automatically start Electron App.
* You can start Electron App through the `startup` function passed through the callback function.
*/
onstart?: (this: import('rollup').PluginContext, startup: (args?: string[]) => Promise<void>) => void
vite?: import('vite').InlineConfig
}
In the past few weeks, some issues have been mentioned in many issues that cannot be solved amicably. So I refactored the API to avoid design flaws. But despite this, the new version will only be easier rather than harder.
For example, some common problems in the following issues.
Thanks to [email protected]'s lib.entry
supports multiple entries, which makes the configuration of the new version very simple. So the [email protected]
requires Vite at least v3.2.0
.
e.g.
import electron from 'vite-plugin-electron'
// In plugins option
electron({
entry: [
'electron/entry-1.ts',
'electron/entry-2.ts',
],
})
// Or use configuration array
electron([
{
entry: [
'electron/entry-1.ts',
'electron/entry-2.ts',
],
},
{
entry: 'foo/bar.ts',
},
])
vite-plugin-electron-renderer
will change output.format
to cjs
format by default(This is because currently Electron@21 only supports CommonJs), which will cause the built code to use require
to import modules, if the user nodeIntegration
is not enabled in the Electron-Main process which causes the error require is not defined
to be thrown.
[email protected]
provides the nodeIntegration
option. It is up to the user to decide whether to use Node.js(CommonJs).
e.g.
import renderer from 'vite-plugin-electron-renderer'
// In plugins option
renderer({
nodeIntegration: true,
})
You can see 👉 examples/worker
-
Use Worker in Electron-Main
e.g. This looks the same as multiple entry
import electron from 'vite-plugin-electron' // In plugins option electron({ entry: [ 'electron/main.ts', 'electron/worker.ts', ], }) // In electron/main.ts new Worker(path.join(__dirname, './worker.js'))
-
Use Worker in Electron-Renderer
e.g.
import renderer, { worker } from 'vite-plugin-electron-renderer' export default { plugins: [ renderer({ // If you need use Node.js in Electron-Renderer process nodeIntegration: true, }), ], worker: { plugins: [ worker({ // If you need use Node.js in Worker nodeIntegrationInWorker: true, }), ], }, }
- There is no way to differentiate between Preload-Scripts, which will cause the entire Electron App to restart after the preload update, not the Electron-Renderer reload.
vite-plugin-electron
vite-plugin-electron-renderer
- 191afb8 feat: proxy
ipcRenderer
inWorker
| #69
vite-plugin-electron
- 715a1cd fix(electron):
VITE_DEV_SERVER_HOSTNAME
insteadVITE_DEV_SERVER_HOST
vite-plugin-electron-renderer
vite-plugin-electron
- db61e49 feat(electron): support custom start 🌱 | #57, #58
vite-plugin-electron-renderer
🎉 v0.9.0
is a stable version based on [email protected]
vite-plugin-electron
vite-plugin-electron-renderer
- ebc6a3d chore(electron-renderer): remove
renderBuiltUrl()
based on [email protected] ([email protected])
sync vite-plugin-electron-renderer
version
70a8c6e fix: electron-vite/electron-vite-vue#229
ESM -> CJS
PR: #51
-
feat: add
VITE_DEV_SERVER_URL
to electron process env, so that it is easier to use -
fix(🐞): VITE_DEV_SERVER_HOSTNAME cannot be used directly when VITE_DEV_SERVER_HOSTNAME is a ipv6 address or vite config
server.host
is true -
fix(🐞): use vite config
mode
as default build mode to avoid build mode not equal to vite configmode
when vite configmode
!== 'development' which would lead to render env not equal to electron main or preload -
fix(🐞): build electron output after render to avoid the electron output being deleted when the vite config emptyOutDir is
true
and the vite command isbuild
-
fix(🐞): use
closeBundle
to replacewriteBundle
, because in extreme cases, an error will be reported. For example,can't find preload module
will occur as an error whenpreload
update frequently
- 🌱 c8b59ba Support
envFile
options electron-vite-vue/issues/209 - 🌱 2d7f033 Add
ImportMeta['env']
declaration - 🌱 20d0a22 Must use
pnpm publish
instead ofnpm publish
#43
- 9ee720f chore(electron): remove
envFile: false
- 0016d52 fix(🐞):
normalizePath()
- 33b121a chore(deps): hoist
typescript
- d3bd37a chore(electron): change import path
- 45f34d9 [email protected]
- daa1c52 docs:
[email protected]
- e4e7ee0 chore: fix link
- d1d4c82 chroe: bump deps
- 581ef71 chore(deps): bump vite to 3.0.2
- 481368a chore: remove unused def
- 71d54c1 chore(🐞): update import path
- 3bae8e5 refactor:
checkPkgMain.buildElectronMainPlugin()
- dba119d chore: format code
- 739e659 feat: use
checkPkgMain()
- 192a8ca refactor: standlone
checkPkgMain
function - aaa9030 chore: explicitly specify external modules
- 3eac722 chore: remove TODO
- c03abe9 feat: add
checkPkgMain()
plugin - d8c0f8e chore: rename param
- 04c94dd feat:
checkPkgMain()
- 7b9631a deps: add
rollup
- cec6db6 deps(🐞): add rollup for import
InputOption
- a4de86e monorepo: move
vite-plugin-electron
topackages/electron
- 1ed6e19 chore: bump vite-plugin-electron-renderer to v0.5.7
- c60fb17 chore: update params
- 13f0c70 chore: bump vite-plugin-electron-renderer to 0.5.6
- 2033256 chore: bump deps
- 8fb064e fix(🐞): bump vite-plugin-electron-renderer to 0.5.3
- 44006b2 chore: comments
- 42acf37 docs: update
- 6d878f7 refactor: use
resolveModules()
- acf1751 chore: bump deps
- 661a146 docs: v0.7.0
- 8ee091d feat: support restart on
vite.config.ts
changed #24 - ca15795 add
electron-env.d.ts
- 76863bb electron-env.d.ts
- 3fbef04 refactor: optimize code
- cc3c8c0 feat:
resolveBuildConfig()
- 50c3afe feat:
resolveRuntime()
- 1184dd3
node.js.ts
->config.ts
- 5779397 chore: bump vite-plugin-electron-renderer to 0.5.1
- 2a2f77d docs:
Put Node.js packages in dependencies
- 5b736fa bump vite-plugin-electron-renderer to 0.5.0
- f70e030 fix(🐞): ensure always load into
buildConfig()
- 73ae8f2 docs: update
- 5204eca docs: v0.6.0
- e885e54 feat:
withExternal()
- dee6d6a feat:
CommonConfiguration
- 55f9e11 node.js.ts
- 83d0b8d remove README.zh-CN.md
- 5f488b8 remove
polyfille-exports
- e118fbd remove
renderer
- 6e5761f refactor: integrate
vite-plugin-electron-renderer
- 0e696ec add
vite-plugin-electron-renderer
- 87bc5bb remove
vite-plugin-optimizer
- 0c5155c chore: TODO
- 892940e fix app,getName() return error name
- abf460f chore: variable rename
- ceb559f chore:
build.cssCodeSplit=false
- ab40088 fix(🐞): set
emptyOutDir=false
for prevent accidental deletion of files - 7baafa0 break: set
electron
build.outDir
value isdist/electron
by default - c13eb49 fix(🐞): assign default value
dist/electron/[process]
ofbuild.outDir
#10
- 1346707 refactor: better assign default
build.outDir
- f489da1 chore: commnets
- 6db3bf3 fix: check
output
is Array
- 394cf6f feat:
config.build.emptyOutDir = false
by default - 4a67688 feat(🐞): enabled
polyfill-exports
by default