electron中在使用ESM时会有诸多限制,尤其是在非contextIsolation场景下。我遇到的情况是在使用ESM时非contextIsolation场景下configstore会导致preload.mjs加载失败,electron-store无法使用,不过后来测试在main.js中是始终可用的。
我使用的是electron-vite,其中import { electronAPI } from “@electron-toolkit/preload”在非contextIsolation场景下也会无法正常工作。
我推测在ESM且非contextIsolation场景下会缺失一些全局变量,导致一些插件工作不正常,可以明确的是process是缺失的(需要自己执行import process from ‘node:process’)。
另一个怪异的情况是只要preload.mjs执行错误就会报“Unable to load preload script”,而且不显示错误的具体信息,导致排常很困难,一度认为是electron的bug。
现在的情况是哪些代码,哪些插件在哪个脚本哪个场景下能用需要一个一个去测才知道,官网也没提到关闭contextIsolation会对执行环境有那么大的影响。
我的理解所谓上下文就是全局变量的作用域,preload.js和网页共享相同的全局变量就是非上下文隔离,反之就是上下文隔离。因为网页中能访问的变量是受限的,在共享上下文时为了保持preload.js和网页的全局变量一致会把网页中没有的全局变量也从preload.js中删掉(但是这只发生成使用ESM时),当使用上下文隔离时则preload.js则拥有与nodejs相同的全局变量。
而如果不使用上下文隔离的话则只能使用contextBridge在preload.js和网页之间通信,使用contextBridge时会限制只能可序列化的内容才能传送,也就是字符串,数字,数组这些了,无法把一个完整的对象从preload.js传递给网页。
这里有contextBridge的数据类型支持:https://www.electronjs.org/docs/latest/api/context-bridge#parameter–error–return-type-support
针对electron-vite中遇到的问题我提交了一个bug报告:https://github.com/alex8088/electron-toolkit/issues/22
Views: 2