关于升级 electron 版本后,无法将网页的日志打印到本地的问题

前段时间在写公司项目时,用到了一个 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 会提示你禁止修改默认属性。

上一篇:electron-builder 使用nsis打包不显示installerSideBar图片


下一篇:想用Electron做个小工具?这个或许是终极版