Electron中的坑和经验

#1 控制<webview>中弹出的窗口

需要监听一个<webview>的弹窗事件时,有两种方法:

document.getElementById('webview1').addEventListener('new-window', (e) => {
  console.log(e.url)
}

document.getElementById('webview1').addEventListener('dom-ready', () => {
  const contents = document.getElementById('webview1').getWebContents();
  contents.on('new-window', (event, url) => {
    event.preventDafault();
    console.log(url);
  });
});

第一种更简单。
第二种看起来支持阻止事件传播,但实际上,如果启用<webview>的allowpopups,窗口仍会弹出。
一种好的做法是,禁用allowpopups,使用第一种方法来监听,并发送想要的url给主进程,由主进程创建和管理window。

#2 使用require.js的页面加载报错

有些页面使用了require.js加载模组,它增加了require()方法,这和node自身require的关键字冲突,可能带来错误或其他无法预测的问题。
在这种页面中,应该设置:

new BroswerWindow({
  webPreferences: {
    nodeIntegration: false,
  }
});

特别的是,如果是webview中弹出的窗口,并不存在这个问题,因为其默认关闭了这个选项。

#3 session.webRequest中使用file://协议

如果使用session.webRequest.onBeforeRequest(listener)来拦截并替换页面中的请求,需要提供一个redirectURL。
在window的url为远程url时,不存在任何问题。但当url为file://...时,会报错:Not allowed to load local resource。这是浏览器的安全限制。
所幸Electron提供了API以修改这种限制。
设置window的属性如下:

webPreferences: {
  webSecurity: false
}

这时file://...指向的本地文件可以正常加载。
另外,webPreferences.allowRunningInsecureContent也是同类型的设置项,决定是否允许https页面中加载http资源。

这些安全属性是Electron不建议修改的,如果是在开发商业产品则不建议修改。

可以通过启动一个静态资源服务器来通过http协议暴露本地文件。

#4 <webview>设定attr.src时不能指向新页面

某些条件下会遇到这个问题。换为iframe则正常刷新。
测试的一种解决方法是,隔一定时间后,再设置src。至少10ms。

------ 2018-3-28更新 ------
经测试发现,当<webview>的样式(或其上级元素的样式)为display:none时,为其设定src会无效。
有时我们希望<webview>平时隐藏,等到src设定好后再加载。
具体实施时,可以不使用display:none隐藏元素,而是使用width:0;height:0等方式。

------ 2018-3-29更新 ------
如果更改webview的src,可能会因src加载需要时间,而产生src变更,webview内显示仍为原来页面的情况。
可以为webview注册commit-load和dom-ready监听器,在其开始加载时隐藏,在其加载好DOM时显示。注意隐藏不要用display:none

#5 持续打包

如果需要打包应用程序,最好从开发之始就经常build并验证程序是否正确执行。
否则最后打包时发现程序不能运行,再找问题就很难了。
推荐使用electron-forge来生成项目。对已经写好的项目,也可以逐步移植到electron-forge生成的初始项目里。
一般我们还需要设置忽略的文件、图标等,这些设置可能在electron-forge的文档中找不到。其实这个库本身是多个库的集合,很多设置需要去其依赖的库的文档里找。
下面列出一些重要配置项:

// package.json
{
  "productName": "扫雷", // 应用名
  "version": "1.0.0", // 版本
  "description": "游信审核器Electron版", // 鼠标移到应用图标上时显示的描述
  "config": {
    "forge": {
      "electronPackagerConfig": {
        "icon": "./static/icon.ico", // 应用图标
        "ignore": "(.idea)|(lite.db)" // 打包时忽略的文件(夹)
      }
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容