electron-vite icon indicating copy to clipboard operation
electron-vite copied to clipboard

修复:preload config是function时报错;特性:`main` 更新后 Electron 重启和 `preload` 更新后重新挂载

Open Beiluola opened this issue 3 years ago • 2 comments

fix: preload config will error when preload config is a function. feat: restart Electron after main update and reload render page after preload update .

修复:preload config是function时报错。 特性:main 更新后 Electron 重启和 preload 更新后重新挂载。

Description

修复

  • 错误代码:src/config.ts文件内290行代码if (!isObject(preloadViteConfig)) {
  • 错误描述:此bug会导致electron.vite.config.{js|ts|mjs|cjs}配置文件内的preload属性定义为function时,报错Error: preload config must export or return an object
  • 修改后代码:if (!isObject(preloadConfig)) {

特性

  • 特性描述:main 更新后 Electron 重启和 preload 更新后重新挂载。

  • 修改文件:src/server.ts

  • 使用方式:

    // file: electron.vite.config.{js|ts|mjs|cjs}
    export default defineConfig({
        main: ({ command }) => ({
            build: {
                watch: command === 'serve' ? {} : undefined,
                // ...
            },
        }),
        preload: ({ command }) => ({
            build: {
                watch: command === 'serve' ? {} : undefined,
                // ...
            }
        }),
        renderer: {
            // ...
        }
    })
    
  • 已修改README文档

Additional context

为什么要提供「main 更新后 Electron 重启和 preload 更新后重新挂载」的特性?

我注意到 主进程不支持热更新么? 中的讨论,引用其中的一段话:

electron主进程的热更新实际为node模块更替,也有一些关于node的热更新方案,但实际应用很少也不成熟。在electron中也有一些社区模块通过检测并重启electron进程方式达到目的,但这不是热更新的概念,这种方式并不友好,不是很好的开发实践。electron-vite 渲染进程的热更新是基于vite下browser环境, electron-vite 没有关于主进程的热更新实现。

诚然,重启electron进程,不是热更新的概念,但我觉得这是可行的,有以下三点理由:

  1. 监视 mainpreload 的更新是一个需求,很多开发者都需要这个特性。
  2. vue-cli-plugin-electron-builder是一个成熟的插件,也是通过重启electron进程的方式完成这个需求的,那么我们也可以这么做,将是否使用这个特性的决定权交给使用者往往更好(使用者可以通过在electron.vite.config.{js|ts|mjs|cjs}文件内设置{main|preload}.build.watch属性方便的开启或关闭这个特性)。
  3. 最关键的一点是,如果增加了这个特性,那是多么的酷!

最后,我想表达下我的感谢,此仓库electron-vite为我在vite环境下开发electron提供了很大帮助,希望它变得更好,期望您考虑此功能!


What is the purpose of this pull request?

  • [x] Bug fix
  • [X] New Feature
  • [X] Documentation update
  • [ ] Other

Before submitting the PR, please make sure you do the following

Beiluola avatar Jun 30 '22 17:06 Beiluola

感谢大佬关注这个问题 目前我这边采用的临时解决方案是nodemon 监听 main 和 preload 进行主进程的重启; 当然更希望采用官方的写法

chenzhihang950909 avatar Jul 01 '22 05:07 chenzhihang950909

@Beiluola 感谢你对electron-vite项目的肯定,也非常感谢你花费时间参与贡献(包括你提的上一个PR),能感觉到你非常专业。

关于主进程和preload脚本的热更新问题,在最早的时候是有类似此PR的实现。但在我长期的实践中,诸如一个不小心保存就重启,实际代码并没有写完整。这种反复过程和不可选择性,给我带来困扰。所以,我会认为这是一个不好的开发调试体验,在 eletron-vite 中就没有去关注这一点。我也尝试过node模块化重载的方式而非重启进程的方式,但不是很靠谱。重启进程好像是唯一可行的。你提到的一点非常好,让开发者自己选择。但我在思考会不会导出plugin的形式会更好,同时支持glob的配置,让开发者有更多选择的配置:thinking:。可能需要一些更全面的思考。

alex8088 avatar Jul 01 '22 17:07 alex8088

Thank you very much for your PR, it is valuable. the new implementation has been released, check it out https://cn-evite.netlify.app/guide/hot-reloading.html

alex8088 avatar Sep 13 '22 03:09 alex8088