当前位置: 首页 > article >正文

创建vue+electron项目流程

一个vue3和electron最基本的环境搭建步骤如下:


// 安装 vite + vue3 + vite-plugin-vue-setup-extend + less + normalize.css + mitt + pinia + vue-router
npm create vue@latest
npm i vite-plugin-vue-setup-extend -D
npm i less -D
npm i normalize.css -S  (在vue的main.js引入:import 'normalize.css')
npm i mitt -S (链接:https://blog.csdn.net/weixin_50236973/article/details/143649070)
npm i pinia -S (链接:https://blog.csdn.net/weixin_50236973/article/details/143634741)
npm i vue-router -S (链接:https://blog.csdn.net/weixin_50236973/article/details/143606887)

// vite.config.ts内配置vite-plugin-vue-setup-extend
export default defineConfig({
  plugins: [
    vue(),
    VueSetupExtend()
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})



// 安装electron,然后在根目录下创建main.js文件, package.json也要配置main:main.js
npm i electron -D

// 安装nodemon, 监听js css html vue文件发生变化后重新渲染,然后配置package.json
npm i nodemon -D

"scripts": {
    "start": "nodemon --exec electron . --watch ./ --ext .js,.html,.css,.vue"
}

// 安装electron-win-state,记录窗口停留的位置
npm i electron-win-state -S

// 创建preload文件夹,创建一个index.js

// 完善一下官网的案例
app.whenReady().then(() => {
    createWindow()
    
    app.on('activate', () => {
        // const {BrowserWindow} = require('electron')
        if (BrowserWindow.getAllWindows().length === 0) createWindow()
    })
})

app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') app.quit()
})



具体项目信息查看本地上传的资源, 这里就的代码只拷贝一部分比较重要的

// main.js
const {app, BrowserWindow} = require('electron')
const path = require('path')

const WinState = require('electron-win-state').default

function createWindow() {
    const winState = new WinState({
        defaultWidth: 1000,
        defaultHeight: 800,
        
        // 给打开的窗口命名
        electronStoreOptions: {
            name: 'window-state-open'
        }
    })
    const win = new BrowserWindow({
        ...winState.winOptions,
        webPreferences: {
            preload: path.resolve(__dirname, 'preload/index.js'),
            sandbox: false
        },
    })

    win.loadURL('http://localhost:5173')

    winState.manage(win)
}

app.whenReady().then(() => {
    createWindow();

    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow()
    })
})

app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') app.quit()
})


// package.json
{
  "name": "readit",
  "version": "0.0.0",
  "description": "first electron app",
  "private": true,
  "main": "main.js",
  "scripts": {
    "dev": "vite",
    "build": "run-p type-check \"build-only {@}\" --",
    "preview": "vite preview",
    "build-only": "vite build",
    "type-check": "vue-tsc --build --force",
    "start": "nodemon --exec electron . --watch ./ --ext .js,.html,.css,.vue"
  },
  "dependencies": {
    "vue": "^3.5.12"
  },
  "devDependencies": {
    "@tsconfig/node22": "^22.0.0",
    "@types/node": "^22.9.0",
    "@vitejs/plugin-vue": "^5.1.4",
    "@vue/tsconfig": "^0.5.1",
    "electron": "^33.2.0",
    "electron-win-state": "^1.1.22",
    "nodemon": "^3.1.7",
    "npm-run-all2": "^7.0.1",
    "typescript": "~5.6.3",
    "vite": "^5.4.10",
    "vite-plugin-vue-devtools": "^7.5.4",
    "vue-tsc": "^2.1.10"
  }
}


// index.html
<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 去掉窗口的Content-Security-Policy警告,告诉该页面的内容是使用本地的 -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' 'unsafe-inline'">
    <title>Vite App</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>


http://www.kler.cn/a/397185.html

相关文章:

  • 【CV】头盔检测区域入侵项目
  • vxe-grid table 校验指定行单元格的字段,只校验某个列的字段
  • LSTM(长短期记忆网络)详解
  • 【PIP】完整指南:Python `pip install` 和 `pip uninstall` 命令详解与清理技巧
  • vue内置指令和自定义指令
  • nginx反向代理上游服务器主从配置
  • Ubuntu终端跑colmap实验记录——生成sparse和poses_bounds.npy
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,
  • Linux设置静态IP
  • 鸿蒙进阶篇-定时器、递归
  • IDEA2024:右下角显示内存
  • .NET6.0 CS0579“System.Reflection.AssemblyCompanyAttribute”特性重复 问题解决
  • 计算机网络各层设备总结归纳(更新ing)
  • RAG经验论文《FACTS About Building Retrieval Augmented Generation-based Chatbots》笔记
  • Java项目实战II基于微信小程序的电子商城购物平台(开发文档+数据库+源码)
  • Spring Boot之Spring-devtools热部署
  • QQ 小程序已发布,但无法被搜索的解决方案
  • 【Linux:epoll】
  • Wireshark 分析SQL 批量插入慢的问题
  • 江苏显卡服务器有哪些好处?
  • 3D Gaussian Splatting 代码层理解之Part1
  • 【NodeJS】Node.js是什么?能做什么?
  • 基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
  • layui 输入框带清空图标、分词搜索、关键词高亮
  • DevExpress WinForms中文教程:Data Grid - 如何绑定到实体框架数据源?
  • 单词 Watch 讲解