electron中使用vue3+vite

简介: electron中使用vue3+vite

先说结论,重点还是在于mainWindow.loadURL()


打包后还是加载http://localhost:3000是无法运行的,因此,此处需要先用vite打包好,然后使用electron-builder加载vite打包后的文件进行打包。

为了代码能够根据不同环境在运行时加载http://localhost:3000,在打包时加载文件,此处需要使用环境变量来切换生产和开发环境。


vite.config.ts 配置


渲染进程配置 renderer/vite.config.ts

本文基于开启 nodeIntegration,如果无需在渲染进程中使用 Node.js API 可以忽略渲染进程配置

渲染进程代码 main/index.ts:

npm create vite 生成代码


主进程配置 main/vite.config.ts

Vite 提供了 build.lib 快捷入口,使得主进程配置十分简单;其次只需要关注下 Rollup 的 external 即可


import { builtinModules } = from 'module'
export default {
  root: __dirname,         // 指向主进程目录
  build: {
    outDir: '../../dist/main',
    lib: {
      entry: 'index.ts',   // Electron 目前只支持 CommonJs 格式
      formats: ['cjs'],
      fileName: () => '[name].cjs',
    },
    rollupOptions: {
      external: [          // 告诉 Rollup 不要打包内建 API
        'electron',
        ...builtinModules,
      ],
    },
  },
}
复制代码


主进程代码 main/index.ts:


import { app, BrowserWindow } from 'electron'
app.whenReady().then(() => {
 win = new BrowserWindow({
 title: 'Main window',
 webPreferences: {
 preload: join(__dirname, '../preload/index.cjs'),
 nodeIntegration: true,
 contextIsolation: false,
    },
  })
 if (app.isPackaged) {
 win.loadFile(join(__dirname, '../renderer/index.html'))
  } else {
 win.loadURL('http://localhost:3000')
  }
})
复制代码


启动脚本分析


先出个结论 - Electron 的启动与 Node.js 相比行为几乎是一致的 - 可执行程序 + 入口文件


# 当我们使用 Node.js 执行一个文件
node path/filename.js
# 这里使用的是全局的 node 命令
# 当我们使用 Electron 执行一个文件
node_modules/.bin/electron path/filename.js
# 这里使用的是项目中的 electron
复制代码


再思考下关于 Electron 启动的问题


  1. 开发环境下 Electron 加载 Vite 启动的开发服务器,即通过 loadURL() 加载一个 http 地址
  2. 生产环境下使用 loadFile()加载一个入口文件


启动脚本设计


Vite 提供了全量的可编程化的 Node.js API 方便我们灵活调度,比如 vite server 命令对应 API 中的 createServer().listen()

基于它我们可以很方便的在我们的脚本中启动 Vite

scripts/watch.mjs


import { spawn } from 'child_process'
import { createServer, build } from 'vite'
// electron 绝对路径,Windows 为 electron.exe
import electronPath from 'electron'
// ---- 渲染进程部分 ----
const server = await createServer({ configFile: 'packages/renderer/vite.config.ts' })
await server.listen()
// ---- 主进程部分 ----
let electronProcess = null
build({
  // 加载主进程构建配置
  configFile: 'packages/main/vite.config.ts',
  build: {
    // 通过 watch 选项监听主进程文件改动,时时编译
    watch: {},
  },
  plugins: [{
    name: 'electron-main-starter',
    // 第一次编译、重新编译后都会触发
    writeBundle() {
      if (electronProcess) {
        // 重启前先杀死当前正在运行的 electron 程序
        electronProcess.kill()
      }
      // 启动、重启 electron
      electronProcess = spawn(
        // 相当于官方的 electron . 启动方式
        electronPath, ['.'],
        // 将 electron 主进程的 console.log 输出到当前命令行
        { stdio: 'inherit' },
      )
    },
  }],
})
复制代码


配置


{
  "scripts": {
    "dev": "node scripts/watch.mjs"
  }
}
复制代码


命令


npm run dev
复制代码


到这一步已经完成了,已经是一个可用的应用了!


渲染进程使用 Node.js API


renderer/src/main.ts

默认情况下 Vite 会将所有的 import 裸模块以 ESM 格式预构建到 node_modules/.vite/ 文件夹下


  1. Node.js 内置模块会被当成 external 模块处理,但只是一个简单的 polyfill 并不能在渲染进程中使用
  2. electron 模块会执行预构建,得到的结果也是不可以使用的,因为 electron 导出的只是一个程序运行路径而已


上述两点,需要我们对其有正确的处理才能保障其在渲染进程中工作


  1. 第一种方式,如果使用 require('electron') 可以避开预构建和 polyfill 行为,从而正常工作
  2. 如果将 import electron form 'electron' 在与构建中排除,并在 Vite 对其 polyfill 之前进行拦截处理,也可以使其正常工作


// ❌ 不会正常工作
import { ipcRenderer } from 'electron'
// ✅ 可以正常工作
const { ipcRenderer } = require('electron')
复制代码


到此为止,使用部分已经 OK 了!除了看起来丑陋的


require('electron')


总结



  • Vite 个人觉得是个不错的方案,毕竟打包工具早晚会推出历史舞台;Vite 往前又迈了 0.5步
  • Electron 的集成只是一个案例,从一个案例出发到写一个插件,你会更好的理解 Vite 设计、思想
  • 最后,不能什么都站在客观的角度去等待,更需要我们主动的去建设
相关文章
|
1天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
102 64
|
1天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
|
23天前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
50 7
|
23天前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
39 1
|
23天前
|
JavaScript 开发者
在 Vue 3 中使用 Proxy 实现数据的双向绑定
【10月更文挑战第23天】Vue 3利用 `Proxy` 实现了数据的双向绑定,无论是使用内置的指令如 `v-model`,还是通过自定义事件或自定义指令,都能够方便地实现数据与视图之间的双向交互,满足不同场景下的开发需求。
44 1
|
8天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
8天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
7天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
13天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
13天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。