基于浏览器的应用程序需要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是否有明确的最佳做法:
-
在客户端JavaScript中编写应用程序的主要逻辑,并使用服务器端脚本执行I / O或
-
通过调用客户端Javascript来pipe理表示层,将应用程序的逻辑写入服务器端语言(如Python)中?
这两种方法都需要客户端脚本和服务器端脚本之间的中介。 什么才是最简单的平台或图书馆来做到这一点,而不是总是矫枉过正或完全压倒学习者?
我从来没有为Raspberry Pi开发或不得不访问GPIO端口。 但是我已经开发了独立的networking应用程序,这些应用程序的function类似于繁琐的半复杂计算器。
一个相当直接的方法来考虑:
将应用程序创build为单页HTML5独立Web应用程序,该应用程序使用AJAX通过Node.JS或Python访问GPIO端口。 根据我的经验,对这种方法有一些想法:
-
jQuery是保持DOM访问和操作可读性和可pipe理性的绝佳工具。 它简化了使用HTML页面元素的JavaScript。
-
保持你的状态在浏览器本地存储 – 使用JavaScript对象和JSON使这个过程非常简单和强大。 (一行代码可以将整个全局状态对象作为JSONstring写入本地存储。)始终将任何持久的应用程序状态更改从本地variables传输到本地存储 – 并有一个页面init例程,将本地存储拉入局部variables任何浏览器刷新或系统重新启动。 testing时,不断刷新您的应用程序,作为您的testing的一部分,以确保您的状态按照您的期望进行pipe理。 这个技巧会在你进步的时候保持稳定。
-
使用AJAX通过jQuery进行任何I / O都是非常可读和可靠的。 这是asynchronous的方法,也可以保持应用程序响应您执行任何I / O。 错误捕获和超时处理也很容易完成。
-
对于后端,如果平台支持它,请考虑Node.JS。 看起来至less有一个模块适合您的特定I / O需求: https : //github.com/EnotionZ/GpiO
我发现节点得到很好的支持,并且非常容易上手。 此外,它会让你在前后两端都使用JavaScript。 当这个function变得最强大的时候,就是当你依赖于JavaScript对象字面量和JSON的时候 – 两者几乎是可以互换的,并且允许你通过一些(甚至是一个)单个对象variables传递复杂的数据结构到/从后端。
您也可以在您想要执行math函数的地方打开选项,因为您可以在浏览器或节点后端执行完全相同的JavaScript函数。
如果你确实走上了JavaScript和HTML5的路线 – 不妨投入时间来使用浏览器的“开发工具”,这些工具提供了非常强大的debugging工具和仪表板,可以准确了解到底发生了什么。 您甚至可以轻松浏览所有本地存储键/值对。 这是一个很好的开发平台。
经过一些考虑,我看到以下select适合您的情况:
- 禁用浏览器安全并直接与GPIO通信。 没有标准的库文件?
- 使用带有GPIO访问和AJAX的JavaScript服务器环境。 由AJAX引入的复杂性
- 使用熟悉的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端,你可以使整个应用程序对页面重新加载更健壮一些(即使我知道你提到过,这应该永远不会发生)。