我似乎无法找到存储用户设置的内置机制.我希望电子提供了一种在所有桌面平台上存储用户设置的标准方法.如果没有先例,我可以自己实现它,我只是不想立即跳转到自定义解决方案.该领域的在线研究相当稀少.谢谢!
在流血和流泪之后,我终于设法建立了一个Node C++插件,并将一个Web平台标准MediaStream对象推送到其C++方法之一.为了兼容不同的V8和Node.js版本,我使用Native Abstractions for Node.js(nan):
addon.cc
NAN_METHOD(SetStream)
{
Nan::HandleScope scope;
v8::Local<v8::Object> mediaStream = info[0]->ToObject();
}
Run Code Online (Sandbox Code Playgroud)
addon.js
setStream(new MediaStream());
Run Code Online (Sandbox Code Playgroud)
对于它的价值,它可以正常工作(即它不会立即删除渲染器进程),并且我可以验证MediaStream对象的存在,例如通过从C++方法返回其构造函数名称:
addon.cc
info.GetReturnValue().Set(mediaStream->GetConstructorName());
Run Code Online (Sandbox Code Playgroud)
当从JavaScript调用时setStream,这将返回字符串MediaStream,因此对象肯定存在.我也可以返回mediaStream对象本身,一切都会正常工作,所以它确实是我需要的对象.
那么,我如何MediaStream在C++中从这个对象中读取音频数据(即音频样本)?作为旁注,实际数据读取(和处理)将在单独的情况下完成std::thread.
我明白如果我自己编译Electron和/或Chromium,这将更容易/可能,但我宁愿不参与维护地狱.
我想知道如果没有这样做是否可能,并且就我的研究而言,我确信我需要做两件事:
另外,正如我所说,我相信我可以自己编译chrome/blink然后我会有这个lib文件,但这对于Electron来说是一个维护地狱.考虑到这一点,我相信这个问题最终归结为C++链接问题.有什么其他方法可以做我正在寻找的东西吗?
在我的情况下,ScriptProcessorNode不是一个选项,因为它的性能使它在生产中几乎无法使用.这将需要在ui /主线程上处理音频样本,这绝对是疯狂的.
我试图围绕Electron(以前的Atom Shell)如何工作.
我来自传统的MVC风格的Web应用程序,其中浏览器通过路由系统调用Controller Action,然后Controller从商店(文件系统,数据库......)获取数据并呈现视图,将其发送回浏览器.有些动作可能会发送回JSON,因为它们是通过JavaScript/AJAX调用的,而不是实际导航到它们的浏览器.
我想创建它,但作为跨平台桌面应用程序.我知道Atom Shell结合了Chromium-Browser和Node.js/v8运行时,但我不确定它们将如何通信.
我想我可以运行一个完整的Web服务器(基本上,一些Node.js HTTP中间件,如Express),但这会创建一个网络可达的服务器(也可能会破坏防火墙) - 我想制作一个桌面的原因之一应用程序正是为了避免运行真正的服务器.基本上像"普通"桌面应用程序中的MVP/MVVM模式.
对于我正在尝试做的事情,有人能给我一些起点吗?浏览器如何与节点运行时(他们称之为"客户端"?)进行通信,告诉它"嘿,用ID 12345获取我的记录",客户端是否会返回呈现的HTML,或浏览器是否会得到一个blob JSON回来并通过JavaScript模板引擎呈现它?
我正在尝试fs在我的renderer流程中使用 Node 模块(在本例中为),如下所示:
// main_window.js
const fs = require('fs')
function action() {
console.log(fs)
}
Run Code Online (Sandbox Code Playgroud)
注意:action当我按下main_window.
但这给出了一个错误:
Uncaught ReferenceError: require is not defined
at main_window.js:1
Run Code Online (Sandbox Code Playgroud)
我可以解决这个问题,正如这个接受的答案所建议的那样,通过main.js在初始化时将这些行添加到我的main_window:
// main.js
main_window = new BrowserWindow({
width: 650,
height: 550,
webPreferences: {
nodeIntegration: true
}
})
Run Code Online (Sandbox Code Playgroud)
但是,根据 docs,这不是最好的做法,我应该创建一个preload.js文件并在那里加载这些 Node 模块,然后在我的所有renderer进程中使用它。像这样:
main.js:
main_window = new BrowserWindow({
width: 650,
height: 550,
webPreferences: {
preload: path.join(app.getAppPath(), 'preload.js') …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用Typescript,React和Redux(都在Electron中运行)的项目,当我在另一个中包含一个基于类的组件并尝试在它们之间传递参数时,我遇到了一个问题.松散地说,我有容器组件的以下结构:
class ContainerComponent extends React.Component<any,any> {
..
render() {
const { propToPass } = this.props;
...
<ChildComponent propToPass={propToPass} />
...
}
}
....
export default connect(mapStateToProps, mapDispatchToProps)(ContainerComponent);
Run Code Online (Sandbox Code Playgroud)
和子组件:
interface IChildComponentProps extends React.Props<any> {
propToPass: any
}
class ChildComponent extends React.Component<IChildComponentProps, any> {
...
}
....
export default connect(mapStateToProps, mapDispatchToProps)(ChildComponent);
Run Code Online (Sandbox Code Playgroud)
显然我只包括基础知识,这两个类还有更多,但是当我尝试运行看起来像有效代码的东西时,我仍然会收到错误.我得到的确切错误:
Run Code Online (Sandbox Code Playgroud)TS2339: Property 'propToPass' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<{}, ComponentState>> & Readonly<{ childr...'.
当我第一次遇到错误时,我认为这是因为我没有通过定义我的道具的界面,但是我创建了它(如上所示)并且它仍然不起作用.我想知道,有什么我想念的吗?
当我从ContainerComponent中的代码中排除ChildComponent prop时,它渲染得很好(除了我的ChildComponent没有关键道具)但是在JSX Typescript中拒绝编译它.我认为它可能与基于本文的连接包装有关,但该文章中的问题发生在index.tsx文件中并且是提供者的问题,我在其他地方遇到了问题.
我正在为自己的目的创建Electron应用程序。我的问题是,当我在HTML页面中使用节点函数时,它引发以下错误:
未定义'require()'。
有没有办法在我所有的HTML页面中使用Node功能?如果可能的话,请给我举个例子,或者提供一个链接。以下是我要在HTML页面中尝试使用的变量:
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
Run Code Online (Sandbox Code Playgroud)
这些是我在Electron的所有HTML窗口中使用的值。
我正在尝试向index.html文件中的按钮添加功能如下:我有一个按钮元素index.html
<button id="auth-button">Authorize</button>
Run Code Online (Sandbox Code Playgroud)
在main.js应用程序中,我有
require('crash-reporter').start();
console.log("oh yaeh!");
var mainWindow = null;
app.on('window-all-closed', function(){
if(process.platform != 'darwin'){
app.quit();
}
});
app.on('ready',function(){
mainWindow = new BrowserWindow({width:800, height : 600});
mainWindow.loadUrl('file://' + __dirname + '/index.html');
var authButton = document.getElementById("auth-button");
authButton.addEventListener("click",function(){alert("clicked!");});
mainWindow.openDevTools();
mainWindow.on('closed',function(){
mainWindow = null;
});
});
Run Code Online (Sandbox Code Playgroud)
但是出现如下错误:
Uncaught Exception: ReferenceError: document is not defined
在构建电子应用程序时是否可以访问DOM对象?或者是否有其他替代方法可以提供所需的功能?
我正在使用Electron制作桌面应用.在我的应用程序中,我正在加载一个外部站点(Atom应用程序外部),可以说http://mydummysite/index.html页面.
这是Atom编辑器中我的应用程序的结构:
即它有以下部分:
源代码:
main.js:
'use strict';
var app = require('app');
app.on('ready', function() {
var BrowserWindow = require('browser-window');
var win =
new BrowserWindow({ width: 800, height: 600, show: false,
'node-integration':true });
win.on('closed', function() {
win = null;
});
win.loadUrl('http://mydummysite/index.html ');
win.show();
});
Run Code Online (Sandbox Code Playgroud)
的package.json:
{
"name": "my-mac-app",
"version": "5.2.0",
"description": "My Mac Desktop App",
"main": "main.js",
"scripts": {
"start": "electron ."
},
"author": "Me",
"license": "ISC",
"dependencies": {
"jquery": "^2.1.4"
} …Run Code Online (Sandbox Code Playgroud) 我试图理解电子主要和渲染过程之间的通信.文档https://github.com/electron/electron/blob/master/docs/api/remote.md指出"远程模块提供了一种在渲染器进程和渲染器之间进行进程间通信(IPC)的简单方法.主要过程."
但是,关于如何设置它的文档很少.
我可以将IPC示例与我的应用程序一起使用,这看起来很简单.在什么情况下应该使用远程模块?
electron ×10
javascript ×7
node.js ×5
atom-editor ×1
blink ×1
c++ ×1
dom ×1
html ×1
jquery ×1
jsx ×1
reactjs ×1
redux ×1
typescript ×1
v8 ×1