0

我需要将 keytar 与电子一起使用,但我使用的是 Angular 和 Typescript。我已经在 main.ts 中导入了模块

import * as keytar from 'keytar';

但它无法加载。

或者,在一个模块中,我正在使用 import * as keytar from '../../../node_modules/keytar';

但是 Electron 在开发控制台中返回这个错误

未捕获的错误:节点加载器:错误:无效的包 /home/project/angularelectron/node_modules/electron/dist/resources/electron.asar 在对象。(keytar.node:5) 在 Object../node_modules/keytar/build/Release/keytar.node (keytar.node:6) 在webpack_require (bootstrap:79) 在 Object../node_modules/keytar/lib/keytar。 js (keytar.js:1) 在webpack_require (bootstrap:79) 在 Module../src/app/home/home.component.ts (main.js:4089) 在webpack_require (bootstrap:79) 在 Module../ src/app/home/home-routing.module.ts (detail.module.ts:13) 在webpack_require (bootstrap:79) 在 Module../src/app/app-routing.module.ts

如何正确加载 keytar?谢谢

4

2 回答 2

1

首先,请不要使用远程模块,因为它已被弃用是有原因的。

我只是遇到了同样的问题,并设法通过一些修补来解决它。

由于 keytar 是一个具有本地依赖关系的节点模块,可与电子渲染器进程一起使用,因此需要跳过几个环节。确保在创建浏览器窗口时将 nodeIntegration 设置为 true,并将 contextIsolation 设置为 false。在早期版本中,设置 nodeIntegration 就足够了,但现在已经不行了。

然后将它与角度一起使用,还有其他步骤。您必须使用 @angular-builders/custom-webpack 和 node-loader。然后在您的组件或服务中导入 keytar 作为import * as keytar from "keytar";并在您的组件定义中声明private keytar: typeof keytar;。现在这是重要的一点:在您的构造函数中,this.keytar = window.require("keytar"); 您必须使用电子的 require 函数,否则您会收到问题中的错误。顶部的标准导入将为您提供输入信息。

于 2021-04-30T08:54:47.947 回答
0

我在使用 Vue 和 Electron 时遇到了同样的问题。所以问题在于在渲染器进程中使用keytar,您无法如此轻松地访问本机api。

const keytar = require("electron").remote.require("keytar");

在我的组件中使用这样的 keytar 解决了这个问题

于 2020-11-19T11:10:04.907 回答