我在用 Electron + React 写一个桌面端程序。使用了 ioredis 库连接 Redis 。
在 Electron 的启动代码中加入了连接 Redis 的操作,可以正常连通。
问题是:因为在页面 React 代码段中无法获得启动时获取到的 Redis 连接实例,所以我把连接操作直接放在了 React 方法中。但在运行时会报错,提示 net 组件不存在
有参考过 Medis 一类的 Redis 连接工具的写法,它们是在 Vue 文件中直接使用自己封装的 Redis 操作工具类,我的做法跟他们类似。
请问一下这会是什么原因,是还需要增加什么依赖或者操作?
如果上述信息不足以判断问题,我再继续补充完善信息。
1
mxT52CRuqR6o5 2020-07-25 21:18:09 +08:00
main process 调用 new BrowserWindow 时 webPreferences.nodeIntegration 传个 true
|
2
cuqk OP @mxT52CRuqR6o5 感觉您的解答。我加上以后,仍然报一样的错,错误堆栈是:
TypeError: net_1.createConnection is not a function at StandaloneConnector.js:58 at Item.push../node_modules/process/browser.js.Item.run (browser.js:153) at drainQueue (browser.js:123) |
3
mxT52CRuqR6o5 2020-07-25 21:35:30 +08:00
首先在 renderer process 的控制台中尝试执行 require('net').createConnection,看看能不能调用得到
然后再看看 react 代码的 require('net')(或是 import 了 net 模块的语句)的编译结果,看看有没有正确的把 require 保留下来,我看这个错误堆栈很可能是 webpack 直接自己把 require('net')自己编译成 webpackrequire 进行处理了,应该是需要调整 webpack 配置让其不对 require('net')进行编译 |
4
Jirajine 2020-07-25 21:35:31 +08:00 via Android
你写 electron 的时候相当于同时写两个应用:前端运行在浏览器中,后端跑在 node 上。其中后者才能调用系统相关的 API 。
你应该把逻辑放在后端,然后前端通过 IPC 调用,nodeintegration 是很不推荐的做法。 |
5
mxT52CRuqR6o5 2020-07-25 22:50:59 +08:00
看了一下应该是要在 webpack 里加上 externals: {electron:'commonjs2 electron'}
当然就像楼上说的那样,如果有安全考虑的话不是很推荐,特别是你这种都涉及到 redis 访问了 |
6
Tyaqing 2020-07-25 22:57:29 +08:00 via iPhone
你应该在后端链接 Redis,前端连接不就暴露权限了么
|
8
cuqk OP @mxT52CRuqR6o5 好的,我试试你说的这种方式,谢谢!
|
9
mxT52CRuqR6o5 2020-07-26 00:29:41 +08:00 via Android
@cuqk 我 5 楼的那个应该是解决不了问题的,需要看一下 react 的 webpack 配置
|