2021-03-06 09:12:18
以下是基于 Electron-vite-vue3 搭建项目及 C++调用 的完整流程和常见问题解决方案:
1. 环境准备避免使用 Electron 21+(因 V8 内存隔离区导致 C++ 动态库调用报错 Error: Error in native callback)。
推荐版本:Electron 20.0.0 或 20.3.8(测试稳定)。
安装命令:
npm install --save-dev electron@20.0.0在终端执行以下命令生成 Vue3 项目模板:
npm create vite
选择模板:Vue + JavaScript/TypeScript(根据需求选择)。
安装依赖:
npm install --save-dev vite-plugin-electron vite-plugin-electron-renderer修改 vite.config.js:
配置主进程入口文件(如 ./electron/main/index.js):
import { defineConfig } from 'vite';import electron from 'vite-plugin-electron';export default defineConfig({ plugins: [ electron({ main: { entry: './electron/main/index.js', }, }), ],});
主进程配置(electron/main/index.js):
创建窗口并加载前端页面:
const { app, BrowserWindow } = require('electron');app.whenReady().then(() => { const win = new BrowserWindow({ webPreferences: { nodeIntegration: true, contextIsolation: false, // 允许直接调用 Node.js API }, }); win.loadFile('dist/index.html'); // 打包后路径});安装依赖:
npm install vue-router修改 App.vue:
替换为路由视图容器(外层必须包裹 <div>,否则路由失效):
<template> <div> <router-view></router-view> </div></template>
创建路由文件(router.js):
import { createRouter, createWebHashHistory } from 'vue-router';import Home from './views/Home.vue';export default createRouter({ history: createWebHashHistory(), routes: [{ path: '/', component: Home }],});在 main.js 中引入路由:
import { createApp } from 'vue';import App from './App.vue';import router from './router';createApp(App).use(router).mount('#app');安装依赖库:
npm install ffi-napi ref-array-napi ref-napi ref-struct-napi iconv-lite常见问题及解决方案:
结构体指针取值问题:参考
Dll 调用常见问题:参考
Callback 返回空缓冲区:参考
示例代码(调用 C++ DLL):
const ffi = require('ffi-napi');const lib = ffi.Library('./path/to/your.dll', { 'your_function': ['int', ['string', 'int']],});console.log(lib.your_function('arg1', 123));安装打包工具:
npm install rimraf electron-builder -g配置打包脚本(package.json):
"scripts": { "build": "rimraf dist && vite build && electron-builder"}修改 vite.config.js 和 electron-builder.yml:
确保 index.html 被保留(避免打包后白板):
export default defineConfig({ build: { rollupOptions: { output: { assetFileNames: 'assets/[name]-[hash][extname]', entryFileNames: 'js/[name]-[hash].js', }, }, },});
处理静态资源:
将 public 目录拷贝到打包输出目录(如 dist):
import fs from 'fs';import path from 'path';fs.cpSync('./public', './dist', { recursive: true });
打包后报错 Cannot find module 'ref-napi':
原因:依赖未正确打包。
临时方案:保留 node_modules 打包(但会导致体积过大)。
参考链接:
Electron 下载失败:
手动下载对应版本的 electron-v20.0.0-win32-x64.zip,放入 Electron 缓存目录(如 ~/.electron)。
按此流程操作可减少踩坑,如遇其他问题可参考提供的链接或社区讨论。