如何搭建 Electron 项目

LibraHeresy
• 阅读 370

前言

前段时间帮一个不是程序员的朋友搭建了属于自己的博客,但是他不会 GithubVS Code,这就让更新博客成为一件麻烦事。

又因为朋友的特殊使用习惯,单纯使用网页更新的话,安全性得不到保障,而且不能初始化和自定义设置。因为我没服务器,无法搭建 http 服务和数据库。

思考了一段时间,突然想起我是个前端啊,那用 Electron 直接写个桌面应用不就行了。敏感数据直接保存到本地,也不用担心安全问题,还省了服务器的费用(这是重点)。

Electron 官方文档

create-vue 文档

环境

node: 18.16.0

npm: 9.5.1

electron: 24.2.0

vite: 4.3.2

vue: 3.2.47

实现

初上手 Electron,目录结构犯了难,是把 Vue 项目直接放在 Electron 项目内好呢,还是分开好一些。

在网上搜了一下最佳实践,好像都有。

偶然间在知乎看见一个大佬解释 Electron 项目,“其实把 Electron 想象成在本地部署运行的 node 服务和 Vue 项目就行了,不要过多思考 Electron 的定位”。

这一下茅塞顿开,决定将 VueElectron 分别存放开发。

这样以后将页面单独剥离,作为 web 项目开发,也不会有什么阻碍。

初始化 Electron 项目和 Vue 项目

Electron 项目推荐跟着 Electron 快速入门 来搭建,简单易上手。

Vue 项目推荐使用 create-vue 脚手架来搭建,也是简单易上手,毕竟我们的目标是快速开发应用。

整合 ElectronVue

当两个项目初始化成功,那接下来的最大问题就是,如何同步开发与打包。

同步开发

练习了 Electron 快速入门 的人,自然会记得创建窗口的 createWindow 方法内,win 对象调用的 loadFile 方法,它的入参是一个地址。

而我们本地运行的 Vue 项目也提供了一个本地地址,http://localhost:5173/

没错,我们可以直接把这个地址作为入参传入 loadFile 方法,实现同步开发,不用在每次 Vue 更新代码后重新打包。

const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
  });

  win.loadFile("http://localhost:5173/");
};

同步打包

开发的时候,可以使用本地地址,那打包的时候就不行了呀。Electron 项目是需要使用入口文件 index.html 的,如果 Vue 项目在项目文件夹内打包,Electron 项目肯定是引用不到的,那该如何解决这个问题呢?

也很简单,直接修改 Vite 的配置文件,将输出路径改为 Electron 的根目录。之所以是根目录,是因为放在别的路径下,Electron 并不能很好的识别到依赖文件并进行打包,当然也可能是因为我还没有完全了解 Electron 的配置。

网上有推荐 electron-builder 插件包,来实现打包操作,但根据我的使用体验,electron-forge,这个官方的打包插件已经能满足我的需要了。

vue-app/vite.config.ts

import vue from "@vitejs/plugin-vue";
import { defineConfig } from "vite";

// https://vitejs.dev/config/
export default defineConfig({
  base: "./",
  build: {
    outDir: "../electron-app",
    emptyOutDir: false, // 这个很重要,别把Electron项目文件夹给清空了
  },
  plugins: [vue()],
});
const NODE_ENV = process.env.NODE_ENV

const config = {
  production: {
    loadFile: path.join(__dirname, `./index.html`),
  },
  development: {
    loadFile: 'http://localhost:5173/'
  },
}

const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
  });

  win.loadURL(config[NODE_ENV]?.loadFile || path.join(__dirname, `./index.html`));
};

编写 package.json 文件

这个 package.json 文件并不是 Electron 项目或者 Vue 项目的,而是属于包裹着这两个项目的 npm 项目的配置文件。

我们需要编写安装,运行,打包三个命令。

大致目录结构如下:

─electron-template
  ├─electron-app
  ├─vue-app
  └─package.json

安装

没什么好说的,&& 串行执行。

{
  "scripts": {
    "electron:install": "cd ./electron-app && yarn install",
    "vue:install": "cd ./vue-app && yarn install",
    "all:install": "yarn vue:install && yarn electron:install"
  }
}

运行

cross-env 是运行跨平台设置和使用环境变量的脚本,创造一个全局环境变量,主要用来区分开发与生产环境

concurrently 是前端工程化并行解决方案,就是并行运行多条命令

wait-on 是跨平台异步方式调用同步方法插件包,简单理解就是 asyncawait

{
  "scripts": {
    "electron:start": "wait-on tcp:5173 && cd ./electron-app && yarn start",
    "vue:start": "cd ./vue-app && yarn dev",
    "all:start": "cross-env NODE_ENV=development concurrently -k \"yarn vue:start\" \"yarn electron:start\""
  }
}

打包

看前面的解释 =_=

{
  "scripts": {
    "electron:build": "cd ./electron-app && yarn make",
    "vue:build": "cd ./vue-app && yarn build",
    "all:build": "cross-env NODE_ENV=production yarn vue:build && yarn electron:build"
  }
}

执行打包命令

在根目录执行all:build打包命令,如果在 Electron 项目根目录下出现 out 文件夹,就代表你打包成功。

yarn all:build

打开里面的 exe 文件,如果你能看见以下截图画面,就代表你成功运行了 Electron 项目。

具体的代码可以到 我的仓库 查看。

如何搭建 Electron 项目

点赞
收藏
评论区
推荐文章
冴羽 冴羽
2年前
VuePress 博客优化之 last updated 最后更新时间如何设置
前言在中,我们使用VuePress搭建了一个博客,但是浏览最终搭建的站点:,我们会发现,在每篇文章的底部,并没有像VuePress官方文档那样,出现最后更新的时间:这篇我们来探究下如何实现最后更新时间。官方自带查阅VuePress的,我们可以知道,VuePress自带显示最后更新时间的插件,在默认主题下,无需安装本插件,因为VuePre
冴羽 冴羽
2年前
VuePress 博客优化之增加 Vssue 评论功能
前言在中,我们使用VuePress搭建了一个博客,最终的效果查看:。本篇讲讲如何使用Vssue快速的实现评论功能。主题内置因为我用的是vuepressthemereco主题,主题内置评论插件@vuepressreco/vuepressplugincomments,可以根据自己的喜好选择Valine或者Vssue。那我们来介绍下Vss
冴羽 冴羽
2年前
VuePress 博客优化之增加 Valine 评论功能
前言在中,我们使用VuePress搭建了一个博客,最终的效果查看:。本篇讲讲如何使用Valine快速的实现评论功能。主题内置因为我用的是vuepressthemereco主题,主题内置评论插件@vuepressreco/vuepressplugincomments,可以根据自己的喜好选择Valine或者Vssue。本篇讲讲使用Val
Easter79 Easter79
3年前
springboot2结合mybatis拦截器实现主键自动生成
前言前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。他的回答是他们项目目前的id都是采用雪花算法来生成,因此为了项目稳定性,不会切换id的生成方式。朋友问我有没有什么实现思路,他们公司的orm框架是mybatis,我就建议他说,不然让你老大把m
冴羽 冴羽
2年前
一篇从购买服务器到部署博客代码的详细教程
前言我们在实现了VuePress搭建个人博客,在和实现了代码自动同步和部署Github和Gitee,但我最终还是决定自己建站,说干就干,那我们开始吧。买服务器因为个人的工作经历,选择了阿里云服务器,我们直接买个云服务器ECS,所谓ECS服务器,直接引用官方的介绍:云服务器ECS(ElasticComputeService)是一种
Stella981 Stella981
3年前
Hexo+Kaze+Gitee Pages 搭建静态博客网站
前言建网站本身是一个很大的工程,涉及前端页面的搭建,网站数据的存储,还要购置服务器资源,甚至是后期的维护,过程相当繁琐。不过如果仅仅是想搭建个人的网站,写写博客,想要美观,又不想操心太多和写博客无关的事情。那么,HexoKazeGiteePages的方式就很适合你。本文就讲下如何借助这三样免费的技术或服务,来搭建一个可访问的
Stella981 Stella981
3年前
GitHub终于可以免费创建私有代码库了
!(https://oscimg.oschina.net/oscnet/0b6f0c9a1faec953273b1be6a8dd96203b6.jpg)相信应该很多朋友都在使用GitHub。但是有一些自己的文件不想被别人看到,于是想建一个私有库吧,以前可那要收费的所以有些朋友就自己搞一台虚机,搭建一个Git服务器(带宽还不受
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
LibraHeresy LibraHeresy
1年前
如何搭建 VitePress
前言前段时间找工作,面对自己平平无奇的简历,萌生了搭建自己的博客的想法。说干就干,在群里潜水的时候,有一个前同事在群里发了他搭建的基于VuePress和VitePress的博客。看了以后被这种简约的风格打动了,于是开始了自己的VitePress搭建之旅。环
LibraHeresy LibraHeresy
1年前
使用 Github Pages 部署 VitePress
前言自从用VitePress快速搭建博客系统以后,一直想部署在互联网上,然后去考察了阿里云和腾讯云,发现有点小贵。因为按照我的使用习惯,只是部署博客的话,有点小亏。这几天在掘金闲逛的时候,看到这篇文章,突然就想尝试一下,因为白嫖总是令人愉悦的。实现因为这篇