electron知识整理和问题汇总(持续更新中)


electron npm 地址

https://registry.npmmirror.com/binary.html?path=electron/
https://mirrors.huaweicloud.com/electron-builder-binaries/

知识整理

1.electron 进程间通讯

快速通道 electron 进程间通讯

2.关于 electron-vue 里的 app.asar

快速通道 关于 electron-vue 里的 app.asar

3.获取版本号等信息

remote.app.getVersion(); //加载应用程序的版本号。 如果应用程序的 package. json 文件中找不到版本号, 则返回当前包或者可执行文件的版本。
app.getName(); //当前应用程序的名称,即为该应用程序 package.json 文件的 name 字段。

app.getAppPath(); //当前应用程序目录,如D:\product\dist

app.getPath(name); // 您可以通过名称请求以下路径(https://www.electronjs.org/zh/docs/latest/api/app#appgetpathname)

4.复制内容

const { c } = window.require("electron");
clipboard.writeText("aaaa");

更多详情查看:clipboard 的用法

扩展

//js用法:
let Copytext = document.getElementById("copytext");
Copytext.value = "111111";
Copytext.select();
document.execCommand("copy");
// alert('复制成功!')
this.$message({
    message: "复制成功!",
    type: "success",
});

5.electron 软件奔溃捕获

// 获取奔溃堆栈文件存放路径
// electron 低版本 path.join(app.getPath("temp"), app.getName() + " Crashes");
// electron 高版本 app.getPath("crashDumps");

mainWin.webContents.on("crashed", async (e, killed) => {
    let result = await dialog.showMessageBox({
        type: "error",
        title: "应用程序崩溃",
        message: "当前程序发生异常,是否要重新加载应用程序?",
        buttons: ["是", "否"],
    });
    if (result.response == 0) {
        mainWin.webContents.reload();
    } else {
        app.quit();
        console.log("系统奔溃,可在此进行日志收集,将奔溃原因写入日志文件");
    }
});

// 或者
app.on("render-process-gone", async (e, w, d) => {
    const _path = path.join(app.getPath("crashDumps"), "crashederror.log");
    if (!fs.existsSync(_path)) {
        fs.writeFileSync(
            _path,
            `[${new Date()}] 系统出错日志
    ·clean-exit - 以零为退出代码退出的进程
    ·abnormal-exit - 以非零退出代码退出的进程
    ·killed - 进程发送一个SIGTERM,否则是被外部杀死的。
    ·crashed - 进程崩溃
    ·oom - 进程内存不足
    ·launch-failed - 进程从未成功启动
    ·integrity-failure - 窗口代码完整性检查失败
    \n`,
            { encoding: "utf-8" }
        );
    }
    if (d.reason == "crashed" || d.reason == "oom") {
        // 进程崩溃 / 进程内存不足
        let result = await dialog.showMessageBox({
            type: "error",
            title: "应用程序崩溃",
            message: "当前程序发生异常,是否要重新加载应用程序?",
            buttons: ["是", "否"],
        });
        const msg = `[${new Date()}] 渲染进程被杀死-${d.reason}`;
        if (result.response == 0) {
            fs.appendFileSync(_path, `${msg}重新加载软件\n`);
            mainWin.webContents.reload();
        } else {
            fs.appendFileSync(_path, `${msg}\n`);
            app.quit();
        }
    } else {
        fs.appendFileSync(_path, `[${new Date()}] 渲染进程被杀死${d.reason}\n`);
    }
});
  • reason string - 渲染进程消失的原因。 可选值:

    • clean-exit - 以零为退出代码退出的进程
    • abnormal-exit - 以非零退出代码退出的进程
    • killed - 进程发送一个 SIGTERM,否则是被外部杀死的。
    • crashed - 进程崩溃
    • oom - 进程内存不足
    • launch-failed - 进程从未成功启动
    • integrity-failure - 窗口代码完整性检查失败
  • exitCode Integer - 进程的退出代码,除非在 reasonlaunch-failed 的情况下, exitCode 将是一个平台特定的启动失败错误代码。

const { app, BrowserWindow, crashReporter, ipcMain, systemPreferences } = require("electron");
const path = require("path");

// 开启crash捕获 官方建议写在app.on('ready')前
crashReporter.start({
    productName: "Your-Application-Name",
    companyName: "Your-Company-Name",
    submitURL: "https://www.xxx.com", // 上传到服务器的地址
    uploadToServer: false, // 不上传服务器
    ignoreSystemCrashHandler: false, // 不忽略系统自带的奔溃处理,为 true 时表示忽略,奔溃时不会生成奔溃堆栈文件
});

// 简写
crashReporter.start({ uploadToServer: false });

6.showOpenDialog

<div class="file">
    补充检材文件
    <input ref="file" type="file" accept="audio/wav" multiple="multiple" @click.stop @change.stop="newAddMaterial" />
</div>
<script>
    let file1 = this.$refs.file.files;
    let file2 = "";
    dialog
        .showOpenDialog({
            buttonLabel: "确认",
            properties: ["openFile", "multiSelections"],
            filters: [
                {
                    name: "audio/video",
                    extensions: ["wav", "WAV"],
                },
                { name: "All Files", extensions: ["*"] },
            ],
        })
        .then(({ filePaths }) => {
            console.log(filePaths);
            const form = new FormData();
            const buffers = fs.readFileSync(filePaths[0]);
            const file = new File([buffers], "".split(".")[0], {
                type: "audio/wav",
            });
            console.log(file);
            file2 = file;
        });

    // 此时 file1 和 file2 相同
</script>
fix:表示该提交用于修复错误或问题。
feat:表示该提交用于添加新功能。
docs:表示该提交用于更新文档。
style:表示该提交用于代码格式化或结构调整。
refactor:表示该提交用于代码重构,不添加新功能或修复错误。
perf:表示该提交用于提高性能。
test:表示该提交用于测试代码。

问题汇总

1.electron 打包时报错

使用 electron 打包时候报ExecError: D:\zlwl\el\win-dahui\node_modules\app-builder-bin\win\x64\app-builder.exe exited with code ERR_ELECTRON_BUILDER_CANNOT_EXECUTE和cannot resolve https://npm.taobao.org/mirrors/electron/13.0.0/electron-v13.0.0-win32-x64.zip: status code 404的错误,如下图:

1.首先处理ExecError: D:\zlwl\el\win-dahui\node_modules\app-builder-bin\win\x64\app-builder.exe exited with code ERR_ELECTRON_BUILDER_CANNOT_EXECUTE的问题
在项目中的.npmrc 中加上 ELECTRON_BUILDER_BINARIES_MIRROR=https://mirrors.huaweicloud.com/electron-builder-binaries/ 如果没有这个文件新建一个即可;

2.然后就是cannot resolve https://npm.taobao.org/mirrors/electron/13.0.0/electron-v13.0.0-win32-x64.zip: status code 404的错误
这个错误其实就是这个地址不知道为啥搞错了应该是 https://npm.taobao.org/mirrors/electron/v13.0.0/electron-v13.0.0-win32-x64.zip 这个地址,手动访问下载后放到 C:\Users\用户名\AppData\Local\electron\Cache\下面;如下图

然后再打包这两个问题就没有了

2.electron 如何解决白屏问题

快速通道 electron 如何解决白屏问题

3.导入 electron.remote 后,remote 为 undefine

快速通道 导入 electron.remote 后,remote 为 undefined

4.electron 打包“ERR_ELECTRON_BUILDER_CANNOT_EXECUTE”

electron 打包遇到的问题, 因为网络的问题,一下文件无法下载。

文件下载地址 :https://npm.taobao.org/mirrors/electron-builder-binaries/

1.下载 与当前 elecron 本版一致的 electron-v13.2.3-win32-x64 然后放到 参考路径 : C:\Users\Admin/AppData\Local\electron\Cache

2 下载 对应的 winCodeSign 解压后 放到 C:\User\Admin/AppData\Local\electron-builder\Cache 没有 winCodeSign 文件夹 自己新建

3.下载对应的 nsis 和 对应的 nsis-resources 放到 C:\User\Admin/AppData\Local\electron-builder\Cache/nsis 下面

5.errorOut=Fatal error: Unable to commit changes

1.关闭杀毒软件尝试

2.关闭软件,重新进入,再尝试

3.若是还是不行,就多试几次

目前对我来说,写完代码,去打包,基本上都是成功的,失败了关闭 vscode 再 build 也会成功,但是连续打包,就必然失败,反正一脸懵逼

6.electron 错误提示 Unable to move the cache

原因:你目前开了不止一个 Electron 程序。

解决方案:关掉其它的就可以了。


文章作者: 弈心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 弈心 !
评论
  目录