1

这是一个关于构建同时具有服务器端和客户端需求的应用程序的最佳方法的问题。原谅我的冗长——我试图尽可能清楚地回答我模糊的问题。

对于一个独立的非网络连接艺术项目,我正在创建一个简单的基于浏览器的应用程序。最好将其与华丽的半复杂计算器进行比较。

我希望该应用程序能够利用浏览器演示功能并在单个非重新加载页面中运行。虽然我有很多使用 perl、PHP 和 Python 编写服务器端应用程序的经验,但我对客户端编程比较陌生,并且是 JavaScript 的新手。

该应用程序将进行一些数学运算,在 Raspberry Pi 上进行一些 I/O 控制,以及大量显示控制。

我最初的想法(和舒适区)是用一些 JS 钩子用 Python 编写它,但我可能需要重新考虑这一点。我更愿意将逻辑层与表示层分开,但鉴于整个事情发生在一个非重新加载的 html 页面上,似乎 JavaScript 是我最合理的选择。

我将在 Raspberry Pi 上运行它,我需要访问 GPIO 端口以进行输入和输出。我知道 JavaScript 将无法直接执行 I/O,因此我需要转向执行 AJAX-ish 类型调用以接收和发送 IO 的东西,例如 nodejs 或 socket.io。

我的主要问题是——在这两种方法之间进行选择是否有明确的最佳实践:

  1. 用客户端 JavaScript 编写应用程序的主要逻辑并使用服务器端脚本进行 I/O,或

  2. 用 Python 等服务器端语言编写应用程序的逻辑,并调用客户端 Javascript 来管理表示层?

这两种方法都需要客户端和服务器端脚本之间的中介。什么是最简单的平台或图书馆可以做到这一点,并且不会对学习者造成过度杀伤或完全压倒性的服务?

4

4 回答 4

1

经过一番考虑,我看到了适合您情况的以下选项:

  1. 禁用浏览器安全并直接与 GPIO 通信。没有标准库?
  2. 使用具有 GPIO 访问和 AJAX 的 JavaScript 服务器环境。AJAX 引入的复杂性
  3. 使用熟悉的 Python 并使用嵌入式 Web 浏览器如果有库,很容易

如果您不熟悉工具和语言,请不要增加太多复杂性

于 2013-07-13T10:27:44.707 回答
1

我从来没有为 Raspberry Pi 开发过,也没有访问过 GPIO 端口。但我已经开发了独立的网络应用程序,它们的作用就像华丽的半复杂计算器。

一种相当直接的方法供您考虑:

将应用程序创建为使用 AJAX 通过 Node.JS 或 Python 访问 GPIO 端口的单页 HTML5 独立 Web 应用程序。根据我的经验,对这种方法的一些想法:

  1. jQuery 是一个出色的工具,可以让 DOM 访问和操作保持可读性和可管理性。它简化了处理 HTML 页面元素的 JavaScript。

  2. 将您的状态保存在浏览器本地存储中 - 使用 JavaScript 对象和 JSON 使这个过程变得非常简单和强大。(一行代码可以将整个全局状态对象作为 JSON 字符串写入本地存储。)始终将任何持久的应用程序状态更改从本地变量传输到本地存储 - 并有一个页面初始化例程将本地存储拉入本地变量在任何浏览器刷新或系统重新启动时。在开发过程中不断刷新您的应用程序作为测试的一部分进行测试,以确保按照您希望的方式管理状态。随着您的进步,这个技巧将使事情保持稳定。

  3. 通过 jQuery 对任何 I/O 使用 AJAX 是非常易读和可靠的。它的异步方法还使应用程序在您执行任何 I/O 时保持响应。错误捕获和超时处理也很容易完成。

  4. 对于后端,如果平台支持,请考虑 Node.JS。看起来至少有一个模块可以满足您的特定 I/O 需求:https ://github.com/EnotionZ/GpiO

我发现 node 得到很好的支持并且很容易上手。此外,它会让你在前端和后端都使用 JavaScript。当您依赖 JavaScript 对象文字和 JSON 时,这变得最强大 - 两者几乎可以互换,并允许您通过几个(甚至一个!)单个对象变量将复杂的数据结构传入/传出后端。

您现在还可以在要执行数学函数的位置保持选项打开 - 因为您可以在浏览器或节点后端执行完全相同的 JavaScript 函数。

如果您确实走 JavaScript 和 HTML5 方法的路线 - 请花时间使用浏览器“开发人员工具”,这些工具提供非常强大的调试工具和仪表板,以准确了解正在发生的事情。您甚至可以轻松浏览所有本地存储键/值对。是一个不错的开发平台。

于 2013-07-13T13:50:35.073 回答
0

哦,多么好的问题!我现在正在考虑。我的方法有点不同:在旧的 MVC 时尚中,你认为 V(iew) 层是用 Javascript CSS 和许多其他东西渲染的 HTML 页面,而 M 和 C 将在服务器上运行。有一天,我遇到了 AngularJS 先生,我意识到:哇,一些基本的事情可能会改变: AngularJS认为视图(或我认为是视图)实际上不是视图。AngularJS 在那个“视图”中给了我控制器、数据资源甚至视图模板,换句话说:客户端本身可以是一个真正的应用程序。所以现在我的方法是:服务器做“服务器工作”,比如:读取和写入数据,向客户端发送数据,从客户端接收数据等......客户端做“客户端工作”:与用户交互,做数据发送前的逻辑过程,例如验证,或格式化从用户等收集的信息...

也许您可以重新考虑您的方法:问问自己应该在客户端运行什么逻辑,在服务器应该运行什么逻辑。使用 javascript 的客户端执行其 I/O,使用服务器端脚本执行其 I/O 的服务器。服务器将为客户端提供所需的资源,并且 javascript 使用该资源作为其 MVC 的 M(odel)。希望你能理解,我的英语不好 :D

于 2013-07-13T07:00:12.120 回答
0

嗯......听起来你大多已经解决了:

  • 蟒蛇服务器。(Python 必须管理 GPIO。)
  • HTML/JavaScript 客户端,创建漂亮的 UI。(HTML 必须呈现 UI。)

这看起来很棒!您只是想知道在客户端/服务器分界的每一侧要做多少工作......在功能上应该是等效的。

简而言之:用你更有效率的语言做大部分工作。

想到其他注意事项:

  • 将整个服务器编写为独立的 python 非常简单。
  • 您不必这样做但如果您从中提供页面内容本身,它会很好且独立。
  • 如果您将大部分状态保留在服务器/python 端,则可以使整个应用程序对页面重新加载更加健壮(即使我知道您提到过,这永远不会发生)。
于 2013-07-13T12:46:49.883 回答