# a-vite-electron-template **Repository Path**: TheFreeOne/vite-electron ## Basic Information - **Project Name**: a-vite-electron-template - **Description**: Use the vite vue3 electron multi-page template and encrypt main.js with bytenode;不是那个开源的项目,是个人使用vite vue3 electron 多页模板 并使用bytenode加密main.js - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-10-31 - **Last Updated**: 2025-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vite-electron 使用vue3 vite electron 多页模板 并使用bytenode加密main.js - 由于对`electron-builder-config.js`进行了部分设置,对依赖进行了优化,electron-build打包时不再重复打包render中vue的依赖,因为按道理dist中已经有了;在没有electron必须的依赖的时候,请将`electronRequireDependencies`设置成空 - 如果打包之后页面空白,`Control+Shift+I`打开开发工具进行调试 - 如果打包后启动报错,请`asar`设置成false,并检查依赖是否打包 ## bytenode > 开发模式下编辑jsc的原理看`vite.config.js`中的大概189行和`main.bytenode.js`文件,build的时候的编译jsc看`electron-builder-config.js`大概18行下的代码 如果不想使用加密功能 修改package.json中的` "main": "dist-electron/main.bytenode.js",`改成` "main": "dist-electron/main.js",` ,并在`electron-builder-config.js`中删除相关代码 # electron 29.0.0 ``` /** * 29.0.0 * 现在通过 contextBridge 传送整个 ipcRenderer 模块作为对象,会在 bridge 的接收方收到一个 空对象。 此更改是为了消除/减轻一种安全隐患。 你不应该直接暴露 bridge 上的 ipcRenderer 或它的方法。 相反,应该提供一个像下面这样的安全包装器: */ contextBridge.exposeInMainWorld('app', { onEvent: (cb:Function) => ipcRenderer.on('foo', (e, ...args) => cb(args)), }); ``` # 关于electron-rebuild > -o 有时不生成.node文件,需要使用`-f -w` # 开发的时候可以执行,打包之后启动提示`Invalid or incompatible cached data (cachedDataRejected) ` 开发的时候jsc文件时electron生成的,打包的时候jsc文件时本地的node生成的,两者的node版本不一样导致这种情况, - 解决方法1. 确定本地electron和node_modules中的版本是否一致,并确定electron使用的node版本和自己安装的node的版本是否一致 - 解决方法2 参考`node_modules/electron/dist/electron electron-builder-config.js` 并在运行完编译的方法后退出进程,让`electron-builder`继续执行 (参考`electron-builder-config.js`大概94行) > 参考命令`"build": "run-p type-check \"build-only {@}\" -- && node_modules/electron/dist/electron electron-builder-config.js && electron-builder --config electron-builder-config.js",` ## Recommended IDE Setup [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). ## Type Support for `.vue` Imports in TS ## Customize configuration See [Vite Configuration Reference](https://vitejs.dev/config/). ## Project Setup ```sh yarn ``` ### Compile and Hot-Reload for Development ```sh npm start ``` ### Type-Check, Compile and Minify for Production ```sh npm run build ``` ### 参考 - https://github.com/bytenode/bytenode - https://blog.csdn.net/cfqdream/article/details/122347127 ##### `main.bytenode.js` 文件备份 ``` /* eslint-disable no-undef */ // 备份 别删 'use strict' const bytenode = require('bytenode') const fs = require('fs') const v8 = require('v8') const path = require('path') const { app, dialog } = require('electron') // 开发模式下每次启动都删除main.jsc if (!app.isPackaged) { if (fs.existsSync(path.join(__dirname, './main.jsc'))) { fs.unlinkSync(path.join(__dirname, './main.jsc')) } } v8.setFlagsFromString('--no-lazy') const jscPath = path.join(__dirname, './main.jsc') // 开发模式下运行的时候才生成 if (!fs.existsSync(jscPath)) { bytenode.compileFile(path.join(__dirname, './main.js'), jscPath) } // preloadjs属于renderer进程,还是不加密号 // if (!fs.existsSync(path.join(__dirname, './preload.jsc'))) { // bytenode.compileFile(path.join(__dirname, './preload.js'), path.join(__dirname, './preload.jsc')) // } try { require(jscPath) } catch (error) { // 立即退出应用程序 console.log(error) dialog.showErrorBox('启动失败', error.message) app.exit(0) } ```