问题描述
electron从旧版升级到新版后提示"The default of contextIsolation is deprecated and will be changing from false to true"
问题解读
这句话的意思是:contextIsolation的默认值已弃用,将从false更改为true
contextIsolation是上下文隔离的意思,原本contextIsolation是有默认值的,默认值为ifalse,现在改为true了
原因是什么呢?
官方给出了一个解释这个问题的github链接
用我蹩脚的英语翻译一下:
如果没有contextIsolation,运行在渲染进程的任何代码都可以轻而易举地访问到electron实例,或者访问到你在preload.js并执行特权操作(或是越权操作),而且你不希望这些特权操作可以被任意的网站执行。
你可以查看Context Isolation的文档,从中了解如何开启上下文隔离和关于它对安全性的益处
我们这么改变是为了提升electron采用默认设置时的安全性,这样你的electron应用就会更加安全,除非你故意把它设置为false
再看Context Isolation的文档
只翻译一下第二段:
在preload.js中访问的window对象与在网页中访问的是不同的,举个例子,如果你在preload.js中为window添加了一个hello属性:window.hello = ‘wave’,并且设置了ContextIsolation为true,你在网页中访问window.hello将会是undefined
解决方法
那如果以前正好是利用window向页面注入了一些方法呢?现在为了安全性确不能这样用了怎么办?
不急,Context Isolation文档说了他们为此提供了一个新的Api:contextBridge,让你可以安全地往window注入方法
用法很简单
const { contextBridge } = require('electron')contextBridge.exposeInMainWorld('myAPI', {doAThing: () => {}
})
contextBridge模块可以用于将api从你的预加载脚本运行的独立上下文安全地暴露到网站运行的上下文中,API也可以从窗口的网站上访问。像之前一样,在网页内可以使用window.myAPI