不要让自己的上限成为你的底线
前言
诈尸更新系列,为了跟上脚步,尝试了vue3,在学习vue3的时候顺便学习一手electron和ts,本教程将分别发布,源码会在最后的文章发布。因为还在开发中,目前也是为了防止有些遇到坑不会及时忘掉,所以先整理一部分出来
将分2部分发出教程,因为配置的东西个人感觉有点多并且跟开发内容相关的东西并不是很多,因此单独发出,见谅,第二篇这两天发出,长文警告!⚠。
【electron+vue3+ts实战便笺exe】二、electron+vue3开发内容
开发思路:
- 页面:
- 列表页
index.vue
头部、搜索、内容部分,只能有一个列表页存在 - 设置页
setting.vue
设置内容和软件信息,和列表页一样只能有一个存在 - 编辑页
editor.vue
icons功能和背景颜色功能,可以多个编辑页同时存在
- 列表页
- 动效:
- 打开动效,有一个放大、透明度的过渡,放不了动图这里暂时不演示了。
- 标题过渡效果
- 切换
index
和setting
时头部不变,内容过渡
- 数据储存:数据的创建和更新都在编辑页
editor.vue
进行,这个过程中在储存进nedb
之后才通信列表页index.vue
更新内容,考虑到性能问题,这里使用了防抖
防止连续性的更新而导致卡顿(不过貌似没有这个必要。。也算是一个小功能吧,然后可以设置这个更新速度) - 错误采集:采集在使用中的错误并弹窗提示
- 编辑显示:
document
暴露execCommand
方法,该方法允许运行命令来操纵可编辑内容区域的元素。
在开发的时候还遇到过好多坑,这些都是在electron
环境中才有,比如
@input
触发2次,加上v-model
触发3次。包括创建一个新的electron框架也是这样,别人电脑上不会出现这个问题,猜测是electron缓存
问题- vue3碰到
空属性
报错时无限报错,在普通浏览器(edge和chrome)是正常一次 - 组件无法正常渲染不报错,只在控制台报异常
- 打包后由于
electron
的缓存导致打开需要10秒左右,清除c盘软件缓存后正常
其他的不记得了。。
这里暂时不提供vue3和electron介绍,有需要的可以先看看社区其他的有关文章或者后期再详细专门提供。软件命名为i-notes
。
vue3中文教程
https://vue3js.cn/docs/zh/guide/migration/introduction.html
electron教程
https://www.electronjs.org/
typescript教程
https://www.typescriptlang.org/
electron-vue
里面的包环境太低了,所以是手动配置electron+vue3(虽然说是手动。。其实就两个步骤)
目录结构
1 | electron-vue-notes |
使用脚手架搭建vue3环境
没有脚手架的可以先安装脚手架
1 | npm install -g @vue/cli |
创建vue3项目
1 | vue create electron-vue-notes |
创建完之后的目录是这样的
1 | electron-vue-notes |
安装electron的依赖
1 | # yarn |
安装完之后完善一些配置,比如别名
、eslint
、prettier
等等基础配置,还有一些颜色
、icons
等等具体可以看下面
项目的一些基础配置
eslint
使用eslint主要是规范代码风格,不推荐tslint是因为tslint已经不更新了,tslint也推荐使用eslint
安装eslint
1 | npm i eslint -g |
进入项目之后初始化eslint
1 | eslint --init |
修改eslint配置,·.eslintrc.js
,规则rules
可以根据自己的喜欢配置
https://eslint.org/docs/user-guide/configuring
1 | module.exports = { |
prettier
在根目录增加.prettierrc.js
配置,根据自己的喜好进行配置,单行多少个字符、单引号、分号、逗号结尾等等
1 | module.exports = { |
tsconfig.json
如果这里没有配置识别@/
路径的话,在项目中使用会报错
1 | "paths": { |
package.json
1 | "author": "heiyehk", |
配置入口文件background.ts
因为需要做一些打开和关闭的动效,因此我们需要配置electron
为frame无边框
和透明transparent
的属性
1 | /* eslint-disable @typescript-eslint/no-empty-function */ |
启动
1 | yarn electron:serve |
到这里配置就算是成功搭建好这个窗口了,但是还有一些其他细节需要进行配置,比如electron打包
配置,模块化
的配置等等
常规配置
这里配置一些常用的开发内容和一些轮子代码
reset.csss
1 | html{font-family:'Microsoft YaHei UI','Microsoft YaHei',sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}address,applet,article,aside,audio,blockquote,body,canvas,caption,dd,details,div,dl,dt,embed,figcaption,figure,footer,h1,h2,h3,h4,h5,h6,header,html,iframe,li,mark,menu,nav,object,ol,output,p,pre,progress,ruby,section,summary,table,tbody,td,tfoot,th,thead,time,tr,ul,video{margin:0;padding:0;border:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent;text-decoration:none}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0;line-height:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}::-ms-clear,::-ms-reveal{display:none}input:-webkit-autofill{-webkit-animation:autofill-fix 1s infinite ;-webkit-text-fill-color:#666;-webkit-transition:background-color 50000s ease-in-out 0s ;transition:background-color 50000s ease-in-out 0s ;background-color:transparent ;background-image:none ;-webkit-box-shadow:0 0 0 1000px transparent inset }[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}input[type=number],input[type=password],input[type=text],textarea{-webkit-appearance:none} |
common.css
1 | /* 空元素显示的内容 */ |
config
这个对应项目中的config文件夹
1 | config |
browser.options
这个文件的主要作用就是配置主窗口和编辑窗口区分开发正式的配置,宽高等等,以及要显示的主页面
1 | /** |
classNames.options
如果想要更多的颜色直接添加即可
1 | /** |
editorIcons.options
1 | /** |
shortcuts.keys
1 | /** |
index
导出
1 | import classNames from './classNames.options'; |
调整background.ts
配置完config之后需要再调整一下background.ts
1 | // 修改createWindow方法 |
vue.config.js
创建vue.config.js文件
1 | /* eslint-disable @typescript-eslint/no-var-requires */ |
使用全局less变量
这里需要使用全局less变量,安装style-resources-loader
,安装完之后会默认在vue.config.js中配置,只需要修改一下路径即可
1 | vue add style-resources-loader |
index.less配置
1 | @primary-color: #027aff; |