使用node.js创建电池:客户端
钥匙要点
- >本文介绍了如何使用Node.js构建电池可视化服务的客户端部件,该服务在不重新加载页面的情况下定期更新电池状态。客户可以暂停或恢复更新,以避免在不需要信息时使系统重载。 >
- 反应性设计和声明框架用于自动有效地更新文档对象模型(DOM),以响应数据的变化。这是使用ractive.js来实现的,ractive.js是一个将数据绑定到DOM元素并每次数据更改时都会更新DOM的库。 >作者演示了如何使用ractive.js创建电池可视化,包括设置暂停/简历更新的机制,并从静止服务中异步检索数据。
- > >本文以一个呼吁结束,以进一步探索所讨论的工具和概念,例如使用node.js设置http服务器,RESTFULE API,在Node.js服务器上运行OS终端命令以及声明框架的基础知识和ractive.js。
- 在这个迷你系列的第一部分中,我们讨论了我们正在构建的服务的细节以及您将学到的东西。然后,我们介绍了为什么我们需要服务器以及为什么我选择创建RESTFUL服务的原因。在讨论如何开发服务器时,我借此机会讨论了如何识别当前操作系统以及如何使用node.js在其上运行命令。 在本系列的第二个也是最后一部分中,您将发现如何以不错的方式构建客户部分以向用户提供信息。为了实现此目标,我们应该每x分钟(或秒)更新电池状态,而无需重新加载页面。此外,我们应该能够暂停/简历更新,以避免在不需要信息时泛滥到我们的系统,甚至当我们不查看页面时。为此,我们将:
- >安排Ajax通过常规时间间隔来打电话给我们的后端服务;
- >使用一个声明的框架,该框架会自动有效地对数据的更改进行自动更新;
> 使用一些jQuery效用功能使我们的生活更轻松; - > >使用一些不错的图像和CSS使仪表板视觉吸引人(作为奖励!)。
- 。
反应性设计
讨论Ajax和异步电话肯定不在本文的范围之内(我将在帖子结尾提供一些有用的链接)。出于我们的目的,我们甚至可以将它们视为黑匣子,使我们可以向服务器询问一些数据,并在将数据发送回数据后执行某些操作。 相反,让我们花一点时间讨论反应性设计和声明性框架。 HTML页面默认是静态实体。这意味着,对于纯HTML页面,每次在浏览器中渲染时,页面上显示的内容保持不变。但是,我们知道,通过使用JavaScript以及一些模板库(例如Mustache),我们可以动态更新它们。 有许多库可以帮助开发人员将数据绑定到DOM节点。他们中的大多数使用JavaScript来描述应转换数据的DOM元素,并需要对页面进行更新,以手动触发(通过JavaScript)。因此,我们最终依靠应用程序的逻辑来确定应何时更新可视化以及应对数据更改应进行的更改。 声明框架将数据绑定到DOM元素,并在数据更改时自动更新DOM。还使用演示文稿中的模板(HTML标记)而不是JavaScript中的模板提供了这种绑定。 这些框架的附加值可以在几个关键点中标识:-
他们在内容和呈现之间实施更大程度的分离。这是通过让您在演示层中定义数据,事件处理程序甚至视图的结构(例如迭代和复合对象,例如表);
- >他们提供了一种简单的方法,可以使您的数据模型和您的演示文稿保持同步;
> ractive.js
对于ractive.js,我们将要使用的库,数据和DOM之间的同步是通过>容器对象获得的。该库创建对象围绕数据包裹的对象。这些对象可以访问数据,因此每次您设置或获取任何属性时,库都可以捕获您的操作并内部广播给所有订户。 >动手 现在,我们已经看到了什么是ractive.js有用的,现在该将我们的第一个ractive模板添加到我们的页面了。为此,您可以在内的任何位置添加带有您选择的ID的脚本标签。我建议您明智地选择ID,因为我们以后需要它。我们还需要添加类型='text/ractive'属性:type ='text/ractive' 实际上,对您的浏览器没有任何意义,因为除非您也将ractive的脚本添加到页面上,否则它会忽略脚本:
现在,在RACTIVE脚本内部,您可以添加HTML标签,模板变量以及条件/循环。 ractive.js将负责评估{{}}组内的所有内容。<span><span><span><script</span> id<span>='meterVizTemplate'</span> type<span>='text/ractive'</span>></span><span><span></script</span>></span></span>
<span><span><span><script</span> src<span>='http://cdn.ractivejs.org/latest/ractive.js'</span>></span><span><span></script</span>></span></span>
<span><span><span><script</span> id<span>='meterVizTemplate'</span> type<span>='text/ractive'</span>></span><span> </span></span><span><span> <span>{{#batteryState}} </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><div class='battery-div'> </span></span></span><span><span> <span><div class='battery-shell'> </span></span></span><span><span> <span><div class='battery-percent-text'>{{batteryPercent.toFixed(1) + '%'}}</div> </span></span></span><span><span> <span></div> </span></span></span><span><span> <span><div class='battery-level'> </span></span></span><span><span> <span><div class='battery-mask' style="width:{{(100 - batteryPercent) + '%'}};"> </span></span></span><span><span> <span></div> </span></span></span><span><span> <span></div> </span></span></span><span><span> <span>{{#batteryCharging}} </span></span></span><span><span> <span><div class='battery-plug' intro-outro='fade:1000'></div> </span></span></span><span><span> <span>{{/batteryCharging}} </span></span></span><span><span> <span>{{#batteryPercent <= batteryRedThreshold}} </span></span></span><span><span> <span><div class='battery-warning' intro-outro='fade:1000'></div> </span></span></span><span><span> <span>{{/batteryLife}} </span></span></span><span><span> <span></div> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><span class='key'>Battery state:</span> <span class='value {{batteryStateClass(batteryState)}}'>{{batteryState}}</span> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span>{{#batteryLife}} </span></span></span><span><span> <span><span class='key'>Time to empty:</span> <span class='value {{batteryLifeClass(batteryPercent)}}'>{{batteryLife}}</span> </span></span></span><span><span> <span>{{/batteryLife}} </span></span></span><span><span> <span>{{/batteryState}} </span></span></span><span><span> <span>{{^batteryState}} </span></span></span><span><span> <span><br> </span></span></span><span><span> <span>LOADING... </span></span></span><span><span> <span>{{/batteryState}} </span></span></span><span><span></span><span><span></script</span>></span></span>
- 条件:{{#batterystate}}}
- >函数召唤:{{{BattuctStateClass(Battertstate)}}}
<span><span><span><script</span> id<span>='meterVizTemplate'</span> type<span>='text/ractive'</span>></span><span><span></script</span>></span></span>
<span><span><span><script</span> src<span>='http://cdn.ractivejs.org/latest/ractive.js'</span>></span><span><span></script</span>></span></span>
<span><span><span><script</span> id<span>='meterVizTemplate'</span> type<span>='text/ractive'</span>></span><span> </span></span><span><span> <span>{{#batteryState}} </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><div class='battery-div'> </span></span></span><span><span> <span><div class='battery-shell'> </span></span></span><span><span> <span><div class='battery-percent-text'>{{batteryPercent.toFixed(1) + '%'}}</div> </span></span></span><span><span> <span></div> </span></span></span><span><span> <span><div class='battery-level'> </span></span></span><span><span> <span><div class='battery-mask' style="width:{{(100 - batteryPercent) + '%'}};"> </span></span></span><span><span> <span></div> </span></span></span><span><span> <span></div> </span></span></span><span><span> <span>{{#batteryCharging}} </span></span></span><span><span> <span><div class='battery-plug' intro-outro='fade:1000'></div> </span></span></span><span><span> <span>{{/batteryCharging}} </span></span></span><span><span> <span>{{#batteryPercent <= batteryRedThreshold}} </span></span></span><span><span> <span><div class='battery-warning' intro-outro='fade:1000'></div> </span></span></span><span><span> <span>{{/batteryLife}} </span></span></span><span><span> <span></div> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><span class='key'>Battery state:</span> <span class='value {{batteryStateClass(batteryState)}}'>{{batteryState}}</span> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span>{{#batteryLife}} </span></span></span><span><span> <span><span class='key'>Time to empty:</span> <span class='value {{batteryLifeClass(batteryPercent)}}'>{{batteryLife}}</span> </span></span></span><span><span> <span>{{/batteryLife}} </span></span></span><span><span> <span>{{/batteryState}} </span></span></span><span><span> <span>{{^batteryState}} </span></span></span><span><span> <span><br> </span></span></span><span><span> <span>LOADING... </span></span></span><span><span> <span>{{/batteryState}} </span></span></span><span><span></span><span><span></script</span>></span></span>
异步检索数据
如所承诺的,这是一个功能,可以照顾从我们的休息服务中检索数据。通过使用jQuery延期对象,我们设置了一个回调,一旦从服务器收到某些数据,就会被调用。由于我们还在此回调中使用ractive.js,因此我们不必仔细研究如何更新演示层的逻辑。实际上,我们只是更新模板脚本中使用的变量的值,ractive.js将负责所有内容。 我刚刚描述的是由下面报告的代码实现的:ractive <span>= new Ractive({ </span> <span>el: 'panels', </span> <span>template: '#meterVizTemplate', </span> <span>data: { </span> <span>// Percentage at which the battery goes to 'red' zone (export for Ractive templates) </span> <span>batteryRedThreshold: BATTERY_RED_THRESHOLD, </span> <span>// Percentage at which the battery enters 'yellow' zone (export for Ractive templates) </span> <span>batteryYellowThreshold: BATTERY_YELLOW_THRESHOLD, </span> <span>// The capacity of the battery, in percentage. Initially empty </span> <span>batteryPercent: NaN, </span> <span>// How much more time can the battery last? </span> <span>batteryLife: "", </span> <span>// True <=> the update daemon for the battery has been paused </span> <span>batteryPaused: false, </span> <span>// True <=> the update daemon for the battery has reported an error at its last try </span> <span>batteryUpdateError: false, </span> <span>// Is the battery connected to power? </span> <span>batteryCharging: false, </span> <span>batteryStateClass: function (state) { </span> <span>return state === 'discharging' ? BATTERY_RED_CLASS : BATTERY_GREEN_CLASS; </span> <span>}, </span> <span>batteryLifeClass: function (percent) { </span> <span>return percent <= BATTERY_RED_THRESHOLD ? BATTERY_RED_CLASS : (percent <= BATTERY_YELLOW_THRESHOLD ? BATTERY_YELLOW_CLASS : BATTERY_GREEN_CLASS); </span> <span>} </span> <span>} </span><span>});</span>
将它们全部放在一起
当然,还有更多的接线可以将所有这些连接在一起。我们完全跳过了仪表板UX的设计。最终,这取决于您,一旦您获得了如何使其与模板系统一起使用!例如,如果我们可以使用图像和动画将充电百分比显示为文本,并且在视觉上以某些凉爽的功率指示器显示为文本和视觉上,那会有多酷?使用ractive.js,这并不难!看看最终结果:
结论
我们的多平台电池仪表板现在应该准备就绪。但这应该是一个起点,而不是最终结果,我希望您在此过程中了解到的重要一点是:- 如何使用node.js 设置HTTP服务器
- > RESTFUL API
- >如何在node.js服务器上运行OS终端命令
- 声明框架和ractive.js的基础知识尤其
- 建筑风格和基于网络的软件体系结构的设计
- >创建RESTFUL API 的指南
- 在本机库中使用REST API的优点/缺点是什么? 模板方法模式
- JavaScript中的异步请求
- >克罗克福德(Crockford)在JavaScript上 - 第四集:Ajax的变态 - 像往常一样的洞察力,以及关于Ajax一词起源的超级有趣的故事,作为奖励! >
- > jQuery $ .getjson方法
- ractivejs教程
- >常见问题(常见问题解答)关于使用node.js客户端创建电池可视化的问题
navigator.getBattery()。然后(function(battery){
console.log(“电池级别:“电池级别:“电池)。 );
});
此代码将当前的电池电量记录到控制台。
如何可视化电池状态数据?
为了可视化电池状态数据,您可以使用任何JavaScript图表库,例如Chart.js或d3.js。这些库允许您从数据中创建各种类型的图表和图形。您还可以使用HTML和CSS创建一个简单的栏或饼图。
>我可以在所有设备上获取电池状态吗?
>电池状态API受到大多数现代浏览器的支持,但是不是全部。还值得注意的是,某些设备(例如台式计算机)可能无法提供准确或任何电池状态信息。>
>如何处理电池状态更改?
您可以通过将事件侦听器添加到电池管理器对象中来处理电池状态更改。电池状态API提供了多个事件,例如“ ChargingChange”,“ LevelChange”,“ ChargingTimeChange”和“ AnergingTimeChange”。这是如何使用这些事件的一个示例:
navigator.getBattery()。然后(function(Batterion){
battery.addeventlistener('levelChange',function',function(){
console。 log(“电池级别:”电池级*100“%”);
});
});
>
如果不支持电池状态API,那么您没有什么可以做的来获得电池状态。您可以使用功能检测来检查是否支持API,并为用户提供替代功能或消息。以上是使用node.js创建电池:客户端的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

探索前端中类似VSCode的面板拖拽调整功能的实现在前端开发中,如何实现类似于VSCode...
