添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
TONG-H

Electron踩坑指南不完全篇

1.8k 6 WEB Electron 2018-12-13

前段时间做了个客户端的项目,主要适用于老师教案管理、远程上课录屏、和学生互动答疑等场景,原生开发对公司来说成本有点大,基于guthub上有各种桌面打包框架so只能前端上了

Electron + vue = product

这是一篇踩坑的记录,没有太深入的原理什么的讲解,主要是码代码过程中碰到的一些暗坑你如果正在写Electron的项目那么你也可能会遇到,这篇文章会给你一些参考

为什么用Electron

这是目前大家知道比较多的三种跨平台的桌面框架
NWJS
https://nwjs.io/
HEX http://hex.youdao.com/zh-cn/tutorial/index.html
Electron https://Electronjs.org/docs

| ** Electron ** | ** nw.js ** | ** hex **
:—-: | :—-: |:—:| :—:
** 发布时间 ** | 2013年 | 2011年 | 2012年
** 开发公司 ** | github | intel | 有道翻译
** 代表作 ** | Atom、Visual Studio Code 、WordPress | 微信web开发工具、钉钉 | 有道云笔记,有道词典
** github start ** | 66608 | 34555 | 1429

三个框架都是 chromium + nodejs + native api , 不用考虑浏览器兼容性还能用nodejs,简直不要太爽

  • Chromium 是 Google 为发展 Chrome 浏览器而启动的开源项目,它对HTML5的支持非常优秀,其内嵌的V8引擎是业内效率最好的JavaScript脚本引擎之一,且其项目开源,又有专门的社区和团队维护,作为UI渲染引擎,它是不二之选,体验上,你可以试用下google chrome浏览器,基本一致
  • Node.js (或者简称 Node) 一个工具,选择Node.JS,是因为开发桌面应用,本地资源操作是必备的能力,这方面JavaScript无能为力,而Node.JS则很好的解决了这个问题,它使得JavaScript操作本地资源变的毫无障碍。另一方面,Node.JS核心也是采用V8引擎,使得其与Chromium的整合变得更顺理成章
  • API 应用程序接口描述了一系列可供你使用的函数库中的函数
  • 我绝对是有道词典的忠实用户但是hex用的人较少怕遇坑爬不出来,nwjs主要优点是能兼容winXP,但是我不需要。。。而且nw和Electron是同一个大佬一前一后开发,Electron相当于是nwjs的重构升级版,官网又这么好看又那么火,还犹豫?

    简单介绍

    官网传送门

  • 官方api https://Electronjs.org/docs
  • Electron-vue文档 https://simulatedgreg.gitbooks.io/Electron-vue/content/cn/getting_started.html
  • 中文社区文档 https://Electron.org.cn/doc/index.html
  • 常用的一些模块:

  • 文件打开删除等操作 shell模块 https://Electronjs.org/docs/api/shell
  • 窗口管理修改新建参数等 BrowserWindow模块 https://Electronjs.org/docs/api/browser-window
  • 主进程和渲染进程通信 ipcRenderer 模块 https://Electronjs.org/docs/api/ipc-renderer
  • 获取屏幕大小、鼠标位置等信息 screen 模块 https://Electronjs.org/docs/api/screen
  • 渲染进程使用BrowserWindow 实例 remote模块 https://Electronjs.org/docs/api/remote
  • 暗 坑

    Electron是个很成熟很完善的框架,所以这些也不叫暗坑,只是小白如果没有很仔细的阅读api就可能容易掉坑里,不要问我为什么知道,我是有故事的人

    Q、已经引了BrowserWindow 为什么使用函数会是undefined?

    A、Electron分为主进程和渲染进程,Electron 运行 package.json 的 main 脚本的进程被称为主进程只有一个,而渲染进程就是你的页面一个BrowserWindow 实例,所以api也分为主进程和渲染进程以及两者通用的api,所以用api的时候得注意,在渲染进程中使用 BrowserWindow 实例需要引入 remote 模块

    主进程可用的模块:app、autoUpdate、BrowserView、BrowserWindow、contentTracing、dialog、globalShortcut、inAppPurchase、ipcMain、Menu、MenuItem、net、netLog、powerMonitor、powerSaveBlocker、protocol、session、systemPreferences、Tray、webContents
    渲染进程(网页)可用的模块:、desktopCapturer、ipcRenderer、remote、webFrame
    两种进程都可用的模块:、clipboard、crashReporter、nativeImage、screen、shell

    Q、想在渲染进程使用主进程的api?

    A、有某些功能必须得在主进程才能实现,比如保存文件、选择文件路径什么的,这些操作可以使用 ipcRenderer 模块用于两个进程之间的通信,由渲染进程发出指令后在主进程进行功能操作

    Q、单击PDF文件的链接时,Electron会提示下载而非直接预览?

    A、单击PDF文件的链接时,在普通浏览器中它会预览该文件。但在Electron中你需要尝试使用 iframe 加载,如果无效可以再试下 webview

    Q、动态的修改静态文件的路径会报链接404?

    A、使用Electron-vue框架,动态的修改静态文件的路径会报链接404但是一开始写死就没问题,所有静态文件都建议放在根目录下 static 文件夹下,然后任何页面访问 static/… 即可

    Q、透明窗口无效?

    A、新建窗口时已经设置了frame: false,transparent: true, 为什么页面还是白色,开发模式下看透明窗口需要关掉开发者模式后刷新