基于浏览器的应用程序需要IO控制

这是一个关于构build具有服务器端和客户端需求的应用程序的最佳方法的问题。 原谅这个长度 – 我想尽量清楚我的模糊问题。

对于独立的非networking连接艺术项目,我正在创build一个简单的基于浏览器的应用程序。 它可以被最好的比作一个华丽的半复杂的计算器。

我希望应用程序利用浏览器演示function,并在单个非重新加载页面中运行。 尽pipe我在Perl,PHP和Python中编写服务器端应用程序的经验非常丰富,但我更喜欢客户端编程,也是JavaScript的新手。

该应用程序将做一些公平的math运算,在Raspberry Pi上进行相当程度的I / O控制,以及大量的显示控制。

我最初的想法(和舒适区域)是用Python编写一些JS钩子,但我可能需要重新思考。 我宁愿将逻辑层从表示层分离出来,但是考虑到整个事情发生在一个非重载html页面上,JavaScript似乎是我最合理的select。

我将在Raspberry Pi上运行,我需要访问input和输出的GPIO端口。 我知道JavaScript将无法直接执行I / O操作,因此我需要转向AJAX-ishtypes的调用来接收和发送IO,类似nodejs或socket.io。

我的原则性问题是 – 在这两种方法之间进行select是否有明确的最佳做法:

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

  2. 通过调用客户端Javascript来pipe理表示层,将应用程序的逻辑写入服务器端语言(如Python)中?

这两种方法都需要客户端脚本和服务器端脚本之间的中介。 什么才是最简单的平台或图书馆来做到这一点,而不是总是矫枉过正或完全压倒学习者?

我从来没有为Raspberry Pi开发或不得不访问GPIO端口。 但是我已经开发了独立的networking应用程序,这些应用程序的function类似于繁琐的半复杂计算器。

一个相当直接的方法来考虑:

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

  1. jQuery是保持DOM访问和操作可读性和可pipe理性的绝佳工具。 它简化了使用HTML页面元素的JavaScript。

  2. 保持你的状态在浏览器本地存储 – 使用JavaScript对象和JSON使这个过程非常简单和强大。 (一行代码可以将整个全局状态对象作为JSONstring写入本地存储。)始终将任何持久的应用程序状态更改从本地variables传输到本地存储 – 并有一个页面init例程,将本地存储拉入局部variables任何浏览器刷新或系统重新启动。 testing时,不断刷新您的应用程序,作为您的testing的一部分,以确保您的状态按照您的期望进行pipe理。 这个技巧会在你进步的时候保持稳定。

  3. 使用AJAX通过jQuery进行任何I / O都是非常可读和可靠的。 这是asynchronous的方法,也可以保持应用程序响应您执行任何I / O。 错误捕获和超时处理也很容易完成。

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

我发现节点得到很好的支持,并且非常容易上手。 此外,它会让你在前后两端都使用JavaScript。 当这个function变得最强大的时候,就是当你依赖于JavaScript对象字面量和JSON的时候 – 两者几乎是可以互换的,并且允许你通过一些(甚至是一个)单个对象variables传递复杂的数据结构到/从后端。

您也可以在您想要执行math函数的地方打开选项,因为您可以在浏览器或节点后端执行完全相同的JavaScript函数。

如果你确实走上了JavaScript和HTML5的路线 – 不妨投入时间来使用浏览器的“开发工具”,这些工具提供了非常强大的debugging工具和仪表板,可以准确了解到底发生了什么。 您甚至可以轻松浏览所有本地存储键/值对。 这是一个很好的开发平台。

经过一些考虑,我看到以下select适合您的情况:

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

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

哦,这是一个很好的问题! 我现在在想这个。 我的方法是有点区别:用旧的MVC时尚,你认为V(iew)图层是使用JavaScript CSS和许多其他的东西呈现的HTML页面,M和C将运行在服务器上。 有一天,我遇到了Mr.AngularJS,我意识到:哇,一些基本的东西可能会改变: AngularJS认为视图(或者我相信的东西是视图)实际上并不是视图。 AngularJS给了我“控制器”,“数据资源”甚至“视图”中的视图模板,换句话说:客户端本身可以是一个真正的应用程序。 所以现在我的做法是:服务器做“服务器工作”就像:读写数据,发送数据到客户端,从客户端接收数据等。客户端做“客户端工作”:与用户交互,做数据的逻辑处理,如validation,或格式化从用户收集的信息…

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

呃…这听起来像你已经主要解决:

  • Python服务器。 (Python必须pipe理GPIO。)
  • HTML / JavaScript客户端,创build一个漂亮的用户界面。 (HTML必须呈现UI。)

这似乎很棒! 你只是想知道在客户端/服务器之间的差别应该做多less工作…应该在function上是等价的。

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

其他笔记浮现在脑海中:

  • 把整个服务器写成独立的python非常简单。
  • 你不需要,但是如果你从页面内容本身提供服务的话,它是很好的和独立的。
  • 如果你把大部分的状态保留在server / python端,你可以使整个应用程序对页面重新加载更健壮一些(即使我知道你提到过,这应该永远不会发生)。