• 小满Vue3第三十九章(Vue开发桌面程序Electron)


    Electron官网Electron | Build cross-platform desktop apps with JavaScript, HTML, and CSS.

    我们用的VsCode 也是 electron 开发的

     electron 内置了 Chromium 和 nodeJS 其中 Chromium 是渲染进程 主要渲染和解析HTML,Nodejs作为主进程,其中管道用IPC 通信

    1.使用vite 构建 electron项目

    创建一个vite 项目

    npm init vite@latest

    安装electron

    1. npm install electron -D
    2. npm install vite-plugin-electron -D

     根目录新建 electron / index.ts

    修改vite.config.ts 配置文件

    引入electron插件配置main  entry对应electron的文件

    1. import { defineConfig } from 'vite'
    2. import vue from '@vitejs/plugin-vue'
    3. import electron from 'vite-plugin-electron'
    4. // https://vitejs.dev/config/
    5. export default defineConfig({
    6.   plugins: [vue(), electron({
    7.     main: {
    8.       entry: "electron/index.ts"
    9.     }
    10.   })]
    11. })

    编写代码 electron / index.ts

    1. import { app, BrowserWindow } from 'electron'
    2. import path from 'path'
    3. //app 控制应用程序的事件生命周期。
    4. //BrowserWindow 创建并控制浏览器窗口。
    5. let win: BrowserWindow | null;
    6. //定义全局变量获取 窗口实例
    7. const createWindow = () => {
    8. win = new BrowserWindow({
    9. //
    10. webPreferences: {
    11. devTools: true,
    12. contextIsolation: false,
    13. nodeIntegration: true
    14. //允许html页面上的javascipt代码访问nodejs 环境api代码的能力(与node集成的意思)
    15. }
    16. })
    17. if (app.isPackaged) {
    18. win.loadFile(path.join(__dirname, "../index.html"));
    19. } else {
    20. win.loadURL(`http://${process.env['VITE_DEV_SERVER_HOST']}:${process.env['VITE_DEV_SERVER_PORT']}`)
    21. }
    22. }
    23. //在Electron完成初始化时被触发
    24. app.whenReady().then(createWindow)

    配置package json 增加main 字段 type 去掉

    1. {
    2. "name": "electron-vite",
    3. "private": true,
    4. "version": "0.0.0",
    5. "main": "dist/electron/index.js",
    6. "scripts": {
    7. "dev": "vite",
    8. "build": "vue-tsc --noEmit && vite build && electron-builder",
    9. "preview": "vite preview"
    10. },
    11. "dependencies": {
    12. "vue": "^3.2.37"
    13. },
    14. "devDependencies": {
    15. "@vitejs/plugin-vue": "^3.0.0",
    16. "electron": "^19.0.10",
    17. "electron-builder": "^23.1.0",
    18. "typescript": "^4.6.4",
    19. "vite": "^3.0.0",
    20. "vite-plugin-electron": "^0.8.3",
    21. "vue-tsc": "^0.38.4"
    22. }
    23. }

    npm run dev

    2.打包Electron

    需要安装electron-builder

    npm install electron-builder -D

    package json 配置 build 修改npm run build命令

    "build": "vue-tsc --noEmit && vite build  &&  electron-builder",
    1. "build": {
    2. "appId": "com.electron.desktop",
    3. "productName": "electron",
    4. "asar": true,
    5. "copyright": "Copyright © 2022 electron",
    6. "directories": {
    7. "output": "release/"
    8. },
    9. "files": [
    10. "dist"
    11. ],
    12. "mac": {
    13. "artifactName": "${productName}_${version}.${ext}",
    14. "target": [
    15. "dmg"
    16. ]
    17. },
    18. "win": {
    19. "target": [
    20. {
    21. "target": "nsis",
    22. "arch": [
    23. "x64"
    24. ]
    25. }
    26. ],
    27. "artifactName": "${productName}_${version}.${ext}"
    28. },
    29. "nsis": {
    30. "oneClick": false,
    31. "perMachine": false,
    32. "allowToChangeInstallationDirectory": true,
    33. "deleteAppDataOnUninstall": false
    34. },
    35. "publish": [
    36. {
    37. "provider": "generic",
    38. "url": "http://127.0.0.1:8080"
    39. }
    40. ],
    41. "releaseInfo": {
    42. "releaseNotes": "版本更新的具体内容"
    43. }
    44. }

    nsis 配置详解 

    1. {"oneClick": false, // 创建一键安装程序还是辅助安装程序(默认是一键安装)
    2. "allowElevation": true, // 是否允许请求提升,如果为false,则用户必须使用提升的权限重新启动安装程序 (仅作用于辅助安装程序)
    3. "allowToChangeInstallationDirectory": true, // 是否允许修改安装目录 (仅作用于辅助安装程序)
    4. "installerIcon": "public/timg.ico",// 安装程序图标的路径
    5. "uninstallerIcon": "public/timg.ico",// 卸载程序图标的路径
    6. "installerHeader": "public/timg.ico", // 安装时头部图片路径(仅作用于辅助安装程序)
    7. "installerHeaderIcon": "public/timg.ico", // 安装时标题图标(进度条上方)的路径(仅作用于一键安装程序)
    8. "installerSidebar": "public/installerSiddebar.bmp", // 安装完毕界面图片的路径,图片后缀.bmp,尺寸164*314 (仅作用于辅助安装程序)
    9. "uninstallerSidebar": "public/uninstallerSiddebar.bmp", // 开始卸载界面图片的路径,图片后缀.bmp,尺寸164*314 (仅作用于辅助安装程序)
    10. "uninstallDisplayName": "${productName}${version}", // 控制面板中的卸载程序显示名称
    11. "createDesktopShortcut": true, // 是否创建桌面快捷方式
    12. "createStartMenuShortcut": true,// 是否创建开始菜单快捷方式
    13. "shortcutName": "SHom", // 用于快捷方式的名称,默认为应用程序名称
    14. "include": "script/installer.nsi", // NSIS包含定制安装程序脚本的路径,安装过程中自行调用 (可用于写入注册表 开机自启动等操作)
    15. "script": "script/installer.nsi", // 用于自定义安装程序的NSIS脚本的路径
    16. "deleteAppDataOnUninstall": false, // 是否在卸载时删除应用程序数据(仅作用于一键安装程序)
    17. "runAfterFinish": true, // 完成后是否运行已安装的应用程序(对于辅助安装程序,应删除相应的复选框)
    18. "menuCategory": false, // 是否为开始菜单快捷方式和程序文件目录创建子菜单,如果为true,则使用公司名称
    19. }

    npm run build

     

     

     3.Electron Vscode 输出乱码解决 方案

    dev 的时候 加上chcp 65001 输出中文

     "dev": "chcp 65001 && vite",

    加上之后

     4.渲染进程和主进程通信

    vite.config.ts 需要修改 不然会报一个错Error: Module "path" has been externalized for browser compatibility. Cannot

    只要安装了  vite-plugin-electron 就会带上 vite-plugin-electron-renderer 直接引入用就行

    1. import { defineConfig } from 'vite'
    2. import vue from '@vitejs/plugin-vue'
    3. import electron from 'vite-plugin-electron'
    4. import electronRender from 'vite-plugin-electron-renderer'
    5. // https://vitejs.dev/config/
    6. export default defineConfig({
    7. plugins: [vue(), electron({
    8. main: {
    9. entry: "electron/index.ts"
    10. }
    11. }),electronRender()],
    12. build:{
    13. emptyOutDir: false,
    14. }
    15. })

    渲染进程使用ipcRenderer 发送

    1. import { ipcRenderer } from 'electron'
    2. const open = () => {
    3. ipcRenderer.send('openFlyCar')
    4. }

    主进程使用 ipcMain 接受

    1. ipcMain.on('openFlyCar',()=>{
    2. console.log('收到')
    3. })

    主进程通知渲染进程

    1. const win = new BrowserWindow(xxxxx)
    2. win!.webContents.send('load', { message: "electron初始化了" })

    渲染进程接受

    1. ipcRenderer.on('load',(_,data)=>{
    2. console.log(data)
    3. })

  • 相关阅读:
    ELECTRA:Pre-training Text Encoders as Discriminators Rather Than Generators
    和平精英官方网站静态页面制作与学习html+css保姆级教程
    控价常用的几种方法
    element-ui《input》输入框效验
    SpringBoot定时任务 - Spring自带的定时任务是如何实现的?有何注意点?
    ufw配置:外网ip禁止访问配置
    [附源码]计算机毕业设计网上电影购票系统Springboot程序
    微服务之 consul
    劫持TLS绕过canary pwn89
    基于JAVA,SpringBoot,Vue,UniAPP智能停车场小程序管理系统设计
  • 原文地址:https://blog.csdn.net/qq1195566313/article/details/126063804