NodeJS / Electron 混淆中关于客户端/服务端代码的疑惑

8
这是一个初学者问题。我以前没有使用过NodeJS,所以有点困惑。我没有看到明确的服务器模块和客户端模块之间的区别。似乎我可以使用“npm”(Node的包管理器)来安装客户端模块和服务器模块。
我的问题特别涉及到这个页面: http://electron.atom.io/docs/v0.36.8/api/synopsis/ 它说我可以在客户端使用Node模块:
渲染进程与普通网页没有区别,除了额外的能力可以使用node模块:
    <!DOCTYPE html>
    <html>
    <body>
    <script>
      const remote = require('electron').remote;
      console.log(remote.app.getVersion());
    </script>
    </body>
    </html>

这有什么意义呢?Node在服务器端运行,浏览器(他们称之为“渲染器”进程)如何能够使用Node的包呢?
4个回答

6

主进程和渲染器不等于服务器和客户端。

NodeJS是服务器端,不是客户端。
在桌面应用程序中,你不必拥有服务器。 但使用Electron时,你可以直接在你的应用程序中使用Node。

简单来说:使用Electron,把NodeJS想象成一个工具箱,用于做很酷的事情。 像文件系统操作一样,忘记客户端和服务器的概念。

(这些是jquery等无法完成的任务,但却是桌面应用程序所需的)

Electron:主进程和渲染器

主进程用于处理/创建浏览器窗口(渲染器) 并用于从一个渲染器窗口到另一个渲染器窗口的某些通信。 (可能还有其他特殊功能)

渲染器是你真正运行大部分应用程序的地方。 使用Node,你在那里拥有所有需要的东西。 易于调试(Chrome开发者工具)都在一个地方。

在渲染器中使用Node的示例

你可以require "fs" > NodeJS文件系统
从硬盘上读取文件或文件夹。

例如,你可以在由渲染器/浏览器窗口显示的HTML文件(脚本标签)中执行此操作。


这对我来说也很困惑,我的答案肯定不完美也不完全正确。 但我的建议是,尽可能在渲染器中完成所有任务。当需要使用主进程时,你会注意到这一点。


1
感谢各位的回答。我在阅读本页后现在理解了。

http://electron.atom.io/docs/v0.36.8/api/remote/

所以,我完全误解了什么是Electron。我认为它基本上是在NodeJS和Chromium浏览器上运行的HTTP服务器,因此我认为创建网站时客户端和服务器之间的分离应该与创建网站时相同。
然而,事实并非如此。看起来你实际上可以通过IPC(进程间通信)直接与服务器通信,因此它与HTTP客户端/服务器根本不同:

remote模块提供了一种简单的方法,在渲染进程(网页)和主进程之间进行进程间通信(IPC)。


0

我认为他们试图表达的是,你可以使用通常被指定用于 Node 的模块在前端上也被使用。由于 Electron 被设计成用作桌面应用程序而不是浏览器,因此它让你更轻松地交换代码。

我不完全确定大多数情况下何时想要使用这个功能。我想他们这样做是为了更容易地集成像 bluebird.js 这样的东西,它是一个 Promise 库,即使它主要是用于 NodeJS,也可以很容易地用于前端和后端包。

那段代码向你展示的是,你可以通过以下方式导入一个模块:

const remote = require('electron').remote;
console.log(remote.app.getVersion());

这段话的意思是,使用('electron').remote加载我的“服务器端”应用程序,现在让我通过remote.app.bluebird调用这些包。你可能不需要或者不想使用它,但它是可用的。

我认为这个很棒的地方在于,如果你为Electron构建一个专门的库,你可以以一种使其在服务器端和客户端之间更无缝的方式编写它。如果你曾经使用过socket.io,就会知道这种情况。服务器端和客户端几乎具有相同的语法,但他们必须分别编写,以便一个在服务器端工作,另一个在客户端工作。有了这个,可能可以使用相同的代码库来处理所有事情。

虽然我不知道一个好的/完美的使用案例是什么。尽管如此,我认为你可以在一侧保留JSON存储,并通过导入将其引入,这是相当不错的,但我不确定它有多有用。


0
官方的Electron教程中,他们指出:

You can use Node.js modules in your application. Pick your favorite npm module. npm offers currently the world's biggest repository of open-source code – the ability to use well-maintained and tested code that used to be reserved for server applications is one of the key features of Electron.

As an example, to use the official AWS SDK in your application, you'd first install it as a dependency:

npm install --save aws-sdk

Then, in your Electron app, require and use the module as if you were building a Node.js application:

// A ready-to-use S3 Client
const S3 = require('aws-sdk/clients/s3')

这样,Electron与普通的Web应用程序有很大不同,因为你不能仅仅使用npm中的一些节点模块来完成工作。

正如官方Electron教程所指出的“这是Electron的关键特性之一”,因为它使解决某些问题变得更加容易。

例如,想象一下,你想编写一个简单的Markdown应用程序。有一个名为markdown-it的节点模块。使用Electron,你可以直接从客户端/渲染进程代码中require并直接使用它,就像在StudyMD的实现中所做的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接