企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 附 FAQ ## Electron 何时升级到最新的 Chrome Electron 中 Chrome 的版本通常在一个新的稳定 Chrome 版本发布后的一到两周进行更新。这个结论并不能被保证,这取决于升级牵涉到的工作量。 只使用稳定渠道的 Chrome 。如果一个重要的修复在 beta 或者 dev 频道,我们将会移植它。 更多信息,可以查阅 【安全说明】。 ## Electron 何时升级到最新的 Node.js 当有一个最新版本的 Node.js 发行版,我们通常在升级之前等待一个月。所以可以避免在新的 Node.js 中经常引入的 bug 的影响。 Node.js 的新特性通常由 V8 的升级带来,由于 Electron 使用 Chrome 浏览器装载的 V8,新 Node.js 版本中带入的 JavaScript 新特性通常已经存在于 Electron 中。 ## 如何在 web 页面中共享数据 要在 web 页面(渲染进程)之间共享数据,简单的方式是使用浏览器中已经可用的 HTML5 APIs。不错的选择是 [Storage API][storage], [`localStorage`][local-storage], [`sessionStorage`][session-storage],和 [IndexedDB][indexed-db]。 或者你可以使用针对 Electron 的 IPC 系统,在主进程中存储对象为一个全局变量,然后在渲染进程通过 `electron` 模块的 `remote` 属性访问它们: ```javascript // 主进程中 global.sharedObject = { someProperty: 'default value' } ``` ```javascript // 页面 1 require('electron').remote.getGlobal('sharedObject').someProperty = 'new value' ``` ```javascript // 页面 2 console.log(require('electron').remote.getGlobal('sharedObject').someProperty) ``` ## 我的应用的窗口/托盘在几分钟之后消失 当用来存储窗口/托盘的变量被垃圾回收时发生。 如果你遇到这个问题,下面的文章可以提供帮助: * [内存管理][memory-management] * [变量作用域](https://msdn.microsoft.com/library/bzt2dkta\(v=vs.94\).aspx) 你可以通过这样修改你的代码,以使变量全局化来快速解决这个问题: 从: ```javascript const {app, Tray} = require('electron') app.on('ready', () => { const tray = new Tray('/path/to/icon.png') tray.setTitle('hello world') }) ``` 修改为: ```javascript const {app, Tray} = require('electron') let tray = null app.on('ready', () => { tray = new Tray('/path/to/icon.png') tray.setTitle('hello world') }) ``` ## 在 Electron 中我不能使用 jQuery/RequireJS/Meteor/AngularJS 由于 Electron 集成了 Node.js,有一些额外的符号被插入到 DOM,比如 `module`, `exports`, `require`。这对于某些库会引发问题,因为它们可能需要插入同名的符号。 要解决这个问题,可以在 Electron 中关闭 Node 集成: ```javascript // In the main process. const {BrowserWindow} = require('electron') let win = new BrowserWindow({ webPreferences: { nodeIntegration: false } }) win.show() ``` 但是如果你希望保留使用 Node.js 和 Electron APIs 的能力,必须要在引用其它库之前在页面中重命名这些符号: ```html <head> <script> window.nodeRequire = require; delete window.require; delete window.exports; delete window.module; </script> <script type="text/javascript" src="jquery.js"></script> </head> ``` ## `require('electron').xxx` 为 undefined. 使用 Electron 的内置模块时你能遇到这样的错误: ``` > require('electron').webFrame.setZoomFactor(1.0) Uncaught TypeError: Cannot read property 'setZoomLevel' of undefined ``` 这是因为你已经全局或者局部安装了 [npm `electron` module][electron-module] ,它覆盖了 Electron 的内置模块。 要验证你是否使用正确的内建模块,可以打印 `electron` 模块的路径: ```javascript console.log(require.resolve('electron')) ``` 然后检查它是否是下面的格式: ``` "/path/to/Electron.app/Contents/Resources/atom.asar/renderer/api/lib/exports/electron.js" ``` 如果它是类似 `node_modules/electron/index.js`,那么你必须移除 npm 的 `electron` 模块,或者重命名它。 ```bash npm uninstall electron npm uninstall -g electron ``` 尽管如此,如果你使用内建模块时仍然碰到这个问题,非常可能是因为在错误的进程中使用这个模块。例如, `electron.app` 只能用于主进程中,而 `electron.webFrame` 只能用于渲染进程。 **一些参考:** * [内存管理]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management * [变量作用域]: https://msdn.microsoft.com/library/bzt2dkta\(v=vs.94\).aspx * [electron-module]: https://www.npmjs.com/package/electron * [storage]: https://developer.mozilla.org/en-US/docs/Web/API/Storage * [local-storage]: https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage * [session-storage]: https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage * [indexed-db]: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API