【问题标题】:NodeJS /Electron Confusion about client/server codeNodeJS /Electron 关于客户端/服务器代码的混淆
【发布时间】:2019-04-01 23:19:30
【问题描述】:

这是一个初学者的问题。我以前没有使用过 NodeJS,所以对我来说有点困惑。我看不到服务器模块和客户端模块之间的明确区分。看来我可以使用“npm”(Node 的包管理器)来安装客户端模块和服务器模块。

我的问题与此页面特别相关: http://electron.atom.io/docs/v0.36.8/api/synopsis/

它说我可以在客户端使用 Node 模块:

渲染器进程与普通网页没有什么不同,除了使用节点模块的额外能力:

    <!DOCTYPE html>
    <html>
    <body>
    <script>
      const remote = require('electron').remote;
      console.log(remote.app.getVersion());
    </script>
    </body>
    </html>

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

【问题讨论】:

    标签: node.js electron


    【解决方案1】:

    主进程和渲染器!= 服务器和客户端

    NodeJS 是服务器端,而不是客户端。
    在桌面应用程序上,您不必拥有服务器。 但是使用电子,您可以在您的应用程序中直接使用节点。

    简单的方法: 使用电子,将 NodeJS 视为一个工具箱来做一些很酷的事情。 就像文件系统操作一样,忘记客户端和服务器的事情。

    (你不能用 jquery 等做的事情,但是你需要一个桌面应用程序)

    Electron:主进程和渲染器

    主进程用于处理/创建 BrowserWindows(Renderer) 对于从一个渲染器窗口到另一个渲染器的一些通信。 (也许还有一些其他特殊的东西)

    渲染器是您真正运行大部分应用程序的地方。 使用节点,您拥有所需的一切。 一站式轻松调试(Chrome 开发工具)。

    渲染器中的节点示例

    您可以要求"fs" > NodeJS File System
    从硬盘读取文件或文件夹。

    您可以在 html 文件(脚本标记)中执行此操作 由渲染器/浏览器窗口显示。


    这对我来说也很困惑,我的回答肯定不完美且完全正确。 但我的建议是,尝试在渲染器中执行所有操作。当您必须使用主进程时,您会注意到这一点。

    【讨论】:

      【解决方案2】:

      感谢大家的回答。我想我在阅读此页面后现在明白了:

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

      所以,我完全误解了 Electron 是什么。我认为它基本上是一个运行在 NodeJS 上的 HTTP 服务器和一个 Chromium 浏览器,所以我认为客户端和服务器之间的分离应该和创建网站时一样。

      然而,事实并非如此。看来您实际上可以通过IPC(进程间通信)直接与服务器通信,因此它与HTTP客户端/服务器完全不同:

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

      【讨论】:

        【解决方案3】:

        我认为他们想说的是,您可以使用通常为 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 存储,然后将其与很简洁的导入一起拉入,但再次不确定它有多大用处。

        【讨论】:

          【解决方案4】:

          official electron tutorial 他们声明:

          您可以在应用程序中使用 Node.js 模块。选择你最喜欢的 npm 模块。 npm 提供目前世界上最大的 开源代码——能够使用维护良好且经过测试的代码 以前为服务器应用程序保留的,是关键之一 Electron 的特点。

          例如,要在您的应用程序中使用官方 AWS 开发工具包,您需要 首先将其安装为依赖项:

          npm install --save aws-sdk
          

          然后,在您的 Electron 应用程序中,像您一样需要并使用该模块 构建 Node.js 应用程序:

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

          通过这种方式,Electron 与普通的 Web 应用程序不同,您不能只使用 npm 中的一些节点模块来完成工作。

          正如官方电子教程中指出的那样“这是 Electron 的主要功能之一。” 因为它使解决某些问题变得更加容易。

          例如,假设您想编写一个简单的降价应用程序。有一个名为markdown-it 的节点模块。使用 Electron,您只需 require 并直接在客户端/渲染进程代码中使用它,就像在 implementation for StudyMD 中所做的那样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-11-03
            • 2020-04-16
            • 2010-10-29
            • 2016-03-19
            • 1970-01-01
            • 1970-01-01
            • 2010-10-28
            相关资源
            最近更新 更多