前段时间在写公司项目时,用到了一个 chrome 89 版本以后才支持的特性,这个项目需要用 electron,查了下 electron 各版本支持的 chrome 版本,便决定将目前在使用的 electron v10 升级到 electron v12,升级后简单测试一下,发现没问题便没再管了。
直到昨天,在 electron 应用中 debug 时,发现网站的日志并没有保存到本地,在一番查找后,将错误原因定位到了 electron 版本变化上。抱着一试的态度,将 electron 退版本到 v10,发现新特性还是可以使用。这是未正确执行的代码:
const log = require('electron-log'); const path = require('path'); const fs = require('fs'); const dayjs = require('dayjs'); const config = require('./config.json'); window.addEventListener('load', () => { log.transports.file.resolvePath = (variables, LogMessage) => { // 将日志按照类型保存到不同的文件中 return path.join(config.logPath, `web.${LogMessage.level}.log`); }; // 保证每类日志文件只存在五份历史内容 log.transports.file.archiveLog = (file) => { file = file.toString(); const info = path.parse(file); const fileList = fs.readdirSync(config.logPath).filter((ele) => ele.includes(info.name)); fileList.sort().reverse(); const deleteFileList = fileList.slice('5'); for (let i = 0; i < deleteFileList.length; i++) { const element = deleteFileList[i]; fs.unlinkSync(`${config.logPath}/${element}`); } try { fs.renameSync(file, path.join(info.dir, `${info.name}.${dayjs().format('YYYY-MM-DD_HH+mm+ss')}${info.ext}`)); } catch (e) { console.warn('无法重命名日志', e); } }; window.console = Object.assign(window.console, log.functions); });
原本打算就这样算了,但是一细想,为什么不去研究一下为什么导致这个问题呢?便去翻官方的更新说明,在 v12.0.0 的更新说明中,有一项Breaking Changes(重大变化),可以看到在 v12 中,electron 将 crashReporter.start({ compress })、contextIsolation、worldSafeExecuteJavaScript 的默认值修改为 true,这三个修改项中,就词语意思来说,contextIsolation(上下文隔离)的默认值修改最有可能产生无法将网页日志打印到本地的问题。
于是便去查看 electron 官方文档对 contextIsolation 属性的介绍,在 contextIsolation 的说明页面,有一个迁移案例,这个案例显示上下文隔离关闭时的代码,与我的代码 window.console = xxx 相同,于是我便参照说明文档将 contextIsolation 设置为 false,之后网站日志便正确的保存到本地了。
注意,虽然官方建议将 contextIsolation 设置为 true,并且提供了对应的修改说明,但是如果你需要修改 window 上默认属性时, electron 会提示你禁止修改默认属性。