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

时间:2013-07-13 06:34:16

标签: javascript node.js socket.io client-side-scripting server-side-scripting

这是关于构建具有服务器端和客户端需求的应用程序的最佳方法的问题。原谅长度 - 我试图用模糊的问题尽可能清楚。

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

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

该应用程序将进行相当多的数学运算,对Raspberry Pi进行相当多的I / O控制,以及大量的显示控制。

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:1)

经过一番考虑后,我会看到以下几种情况:

  1. 禁用浏览器安全性并直接与GPIO通信。 没有标准的图书馆?
  2. 使用具有GPIO访问权限和AJAX的JavaScript服务器环境。 AJAX引入的复杂性
  3. 使用熟悉的Python并使用嵌入式Web浏览器如果库在附近,那么
  4. 如果您不熟悉工具和语言,请不要添加太多复杂性

答案 1 :(得分:1)

我从未为Raspberry Pi开发或必须访问GPIO端口。但是我开发了独立的网络应用程序,其作用就像华丽的半复杂计算器。

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

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

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

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

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

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

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

嗯......听起来你大部分时间都在确定:

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

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

简而言之:用你能提高效率的语言进行大部分工作。

其他注意事项浮现在脑海中:

  • 将整个服务器编写为独立的python非常棒 straightforwad。
  • 你没有拥有,但这很好 如果您从中提供页面内容,则自包含。
  • 如果你 保持服务器/ python端的大部分状态,你可以做到 整个应用程序对页面重新加载更加强大(即使我 知道你提到过,这应该永远不会发生。)