node-firefox 二三事

编者按:本文作者为 Soledad Penadés, Sole 在 Mozilla 的 Tech Evangelism 团队工作,帮助人们在网络上创造神奇的东西。本文主要介绍node-firefox的基本知识,以及它如何帮助你加速 Firefox OS 应用开发,由 OneAPM 工程师编译呈现。

在 Mozilla 基金会,我们一直致力于寻找简化开发人员生活的方法。当胸怀抱负的应用开发者告诉我们初学开放式 Web 应用很麻烦时,我们便致力于将应用管理器转变为对更多初学者友好的环境,反过来也给 WebIDE 让路。该工具简化了许多曾经缓慢而繁琐的行为,比如创建新的应用、下载和安装模拟器或运行和调试应用。

但仍有部分开发者感觉受冷落了:计算机高手!他们已经具备了基于 node.js 的构建工具链,任务包括资产优化、代码提示、或测试运行等。他们也经常使用像 Browserify 这样的工具,或许甚至都不编写 JavaScript 代码,相反,却倾向于选择 CoffeeScript 这样的语言。不过,所有这些好东西都要求你先构建应用或网站,之后才能将其用于你的设备或浏览器中。

本来,我们想让这些开发人员离开自己心爱的命令行(或编辑快捷键!)转而使用 WebIDE,通过单击按钮来部署应用,然后再回到他们喜欢的编辑器。但是,他们却一致回答:我们不喜欢点击!我们喜欢终端!

如何使 WebIDE 更加高效?

大家不喜欢 WebIDE,因为它意味着上下文不断变化。它并不高效,我们是工程师,如果工程师喜欢一件事的程度超过构建新的应用,那它就很可能是优化并简化流程。

既然我们已经有了构建脚本,只剩下一个步骤——部署,就能让我们的应用投入运行时,这也是我们使用 WebIDE 的目的。所以,显而易见问题将是:我们能利用 WebIDE 进行部署吗?以编程的方式?

服务器与 actors

每一个 Firefox 运行时都有所谓的远程调试服务器。由于一些明显的安全原因,默认并不启用该服务器,但是当启用时,客户端可与其连接并利用它的各种功能优势,比如安装应用、访问控制台等。这就是 WebIDE 内部所做的事情。

每个功能都由一个 actor 提供。例如,假设我们想要列出已安装的应用,那么可以……

  • 首先,找到 webAppsactor
  • 然后运行 getAll 命令
  • 再然后,得到回应的应用列表

还有一个例子是安装打包的应用,步骤为:

  • 首先,使用任何库或任何你喜欢的方式压缩应用内容
  • 然后得到 webApps actor
  • 用压缩文件内容调用 webApps actor 中的 uploadPackage 命令
  • 调用结果即为File actor
  • 用返回值 File actor 调用 webApps actor 中的 install 命令
  • 完成!

因此,安装应用的魔法不在 WebIDE ,而是在服务器中!我们可以以编程方式利用这类魔法,但是从头构建一个客户端,建立 TCP 连接并语法解析包,并不是你真正想做的:相反,你想做的是编写应用并将其推到设备中运行。

不用绝望,因为 node-firefox 能帮你实现这一目标。它不是一串整体的代码,而是一系列 node.js 模块,每个模块执行不同的任务,托管在各自的代码库中,并发布于 npm 注册表中。只要你需要,你可以在脚本或任务运行器中尽情使用这些模块,因此,你终于不用离开命令行就能构建并运行应用了。

行动是金,雄辩是银

说了这么多,现在让我们看看如何编写一个能启动模拟器的脚本吧!

首先使用 npm 指令在项目中安装模块:

npm install --save node-firefox-start-simulator

下面是写好的脚本:

var startSimulator = require('node-firefox-start-simulator');

startSimulator({ version: '2.2' })

.then(function(simulator) {
 console.log('Listening in port', simulator.port);

});

好啦!只需几行代码,你就能以编程方式启动2.2版本的模拟器。如果你不关心版本问题,就不要在startSimulator中传入任何参数,这样就将启动所发现的第一个模拟器:

startSimulator().then(function(simulator) {

 // your code

});

我们还可以通过动图查看这个过程。下图就显示了通过 node.js 脚本启动模拟器、安装应用和运行应用的所有过程:

该示例使用的代码实际上就是 node-firefox-unistall-app的代表范例。每个node-firefox模块都含有一个示例文件夹,帮助你快速入门。

如我们开始所提到的,许多转向应用开发的网页开发者想继续使用任务运行器,因此我们也就如何使用带gulpnode-firefox写了一个示例。

让我们运行这个default-one任务。这样会启动模拟器、部署应用,再多点挑战,还能持续关注 CSS 变化。如果你编辑并保存了任何一个应用的样式表,文件监视器会检测其变化并发送新的文件内容到运行时,这样不用关闭、推进并重新启动整个应用就可迅速替换样式表。下面的例子将背景颜色从稳重的深蓝色改变成永恒不变的 Paul Rouget 粉红色!

实时 CSS 重载很适合搭建与试验 UI 界面。不必重载应用并导航到你想工作的具体部分,这样可以节省大量时间——要是当年笔者在编程安卓应用时也能用这个就好了。

但是我们还可以做得更好。default-all任务和default-one的功能相同,但前者是针对系统安装的所有模拟器,因此你能同时看到所有模拟器的 CSS 改变效果:

不幸的是,模拟器2.1和2.2中存在一个问题,它们不能重载样式表的变化,但这个问题已经存档并会到解决。

目前我们能做什么?

当前这套模块可帮助你找到运行时在监听的端口找到启动模拟器连接到运行时;找到安装卸载运行应用,重载样式表

基本原理

你或许已经注意到一个模式,但是以防还不够明显,我们正在努力编写一些简单的模块。每个模块应仅执行一个动作,返回一个 Promise 并尽量减少使用依赖。

小的模块很易理解、使用并进行测试。同样,将来大多数 Web API 的设计目的都是服务于 Promises ,我们想编写的代码应着眼于未来而不是过去。此外,减少使用依赖的数量也可使新手更易熟悉模块,因为要了解的不熟悉的新元素更少了。

最后,由于所有模块的工作方式都相同,所有当你知道如何使用一个模块后,你就知道了如何使用剩下的——唯一变化的就是参数和结果。

理想想法(关于我们目前还无法做到的)

有很多事情我们想知道将来能否实现,有些人称之为特色,但我们称之为‘理想想法’。

一个经常出现的例子即 WebCLI:与 WebIDE 相对应,你通过 WebIDE 所做的所有事情都可以通过一个命令行工具来实现。笔者不断纠结于这两个观点——“这想法很棒”和“或许我们根本不需要这个,有一个任务库就足够了”,不过大家似乎比较喜欢这个想法,所以应该没那么差!

还有一个很棒的特色是遇到从命令行运行却崩溃的应用,可以使用 DevTools 调试程序。通过命令行运行应用的想法很好,但是命令行调试程序却没那么给力!为什么不选择一个两全其美的方法呢?

或者,用命令行控制任何浏览器都可以干净利索,只要通过 Valence 将二者相联系!

最后是笔者最钟爱的梦想想法:Firefox OS 定制版。想象一下,如果我们仅仅编写一个脚本就能创建一个空白 Firefox OS 平板,装上我们钟爱的应用和设置,生成整体的 Firefox OS 图像,那么之后我们便可将其闪存到设备上。由于这不是一个二进制大对象而只是一个脚本,所以我们仅可在其函数库中进行发布,其他人可根据版本合成或创建他们自己的 Firefox OS。

如何实现呢?

我们面临的问题还有很多,需要很多领域的协作。或许最紧急的任务是获取更好的多平台支持。目前,我们只能通过网络与运行时进行交互,而不是实际的设备。另外,除了 Mac OS,对平台的支持还极度缺乏。

另一个重要方面是测试。如果我们更早、更多、更频繁地进行测试,将能检测到像 CSS bug 这样的问题,这个问题是笔者在创建gulp 演示程序时偶然发现的。我们想在几个平台上运行这些模块,并让这些模块连接到其他不同的平台,包括实际的设备。

当然我们需要更多模块和更多范例!为了保证两个人不会编写同一个模块,我们讨论在高级项目问题跟踪器中提出新模块。我们非常期待见到更多的范例,或者更好的范例——使用我们的代码将现有功能钩嵌到其他节点模块中。例如,可通过 firefox-app-validator-manifest模块添加清单验证。

还有,我们一如既往的需要你们。我们不是你们,因此我们不知道你们的需要和想法。当然,我们也不能像你们一样使用软件。我们需要你的输入信息,还需要你们的贡献!

我们期待你们使用node-firefox创建的成果。如果遇到任何问题,请将问题整理成文档发给我们,或者在 irc 跟我们说。我们会在 irc.mozilla.org 中的 #apps 和 #devtools 频道解疑答惑。

致谢

这里要不感谢 Nicola Greco 就太不厚道了, 去年夏天笔者指导过他,当时他还在 Mozilla 实习。是他提出了构建个人节点模块的初步设想,这种模块会帮助你开发 Firefox OS 应用。去看一下他的实习总结报告吧,真的的非常有趣且具有说明性!

非常感谢所有(极其耐心的) DevToolers:Ryan Stinnet、Alexandre Poirot、Jeff Griffiths 和 Dave Camp,他们帮助我们找到远程服务器的方向,actors 等等。尤其感谢 Heather Arthur,他编写了 firefox-client,使得编写node-firefox的方式比原来更简便舒适。

点击此处查看原文。

时间: 2024-10-13 07:00:08

node-firefox 二三事的相关文章

Google AdSense 最近二三事

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 google adsense 最近二三事, 1 google的adsense和adworks的业务基本上都交给了上海构寻广告公司,收取税收, 对adsense业务肯定会有一定的影响, 2 firefox的中国地区的单价还将降低,也不知道是什么原因,本来就不太高,可能中国站长作弊的手段太高了, 3 google推出pack的推介,价格暂时定为1

黑客二三事:熊猫烧香其实不入流

 本文讲的是 :  黑客二三事:熊猫烧香其实不入流  ,  [IT168 评论]随着李俊二度入狱的消息传来,这个沉寂多年的名字以一种颇具娱乐意味的姿态再度出现,同时随着各种泄露事件和棱镜门的不断升级,黑客和网络安全相关的一系列话题再度登上了话题榜. 360带动了杀毒软件免费潮后,没用再出现类似熊猫烧香的大规模破坏性病毒,互联网世界似乎干净了许多,甚至杀毒软件们开始使用检查软件升级.计算开机时间等方式来寻找一些存在感. 不过"圈里人"看来,网络威胁只是换了一种形式存在,公众的眼界外,存在

IOS有关内存管理的二三事

IOS有关内存管理的二三事 一.前引 随着移动设备的内存越来越大,程序员也已经度过了为了那一两M的内存在系统的抽丝剥茧的年代,对于JAVA的开发者,对内存更是伸手即取,并且从不关心什么时候还回去.但是,程序的掌控度对程序员来说是至关重要的,任何语言的内存管理机制的初衷也是在有限的空间里完成最精致的逻辑. 二.Xcode工程设置ARC ARC是xcode5中引入的自动引用计数,其原理与MRC是一样,只是系统帮助我们添加了retain和release.现在在xcode中新建的项目默认都是ARC的环境

DuplexPipe二三事(五)——来自内网的呼唤

穿越防火墙 你是否曾经尝试过去连接一台远程计算机,却因为被防火墙拦截或路由器没有转发而造成无法通信?这是主动式连接的一个弊端:它依赖服务器的状态,而对服务器有生杀大权的只有管理员.如果能让服务器主动尝试连接我们的计算机,那就没问题了!因为防火墙.路由等一般不会过滤向外的连接(反弹式木马就是利用这一原理). 但以往的服务端程序都是采用监听本地端口的方式(比如 Windows 远程桌面程序监听本地 3389 端口),我们需要将它的连接方式改成主动连接外部网络的方式.我想你也一定要将想到(如果你看过<

DuplexPipe二三事(四)——网络连接方式随心换

连接方式 在<DuplexPipe二三事(一)>中提到建立连接有两种方式:监听本地端口,等待其他程序来连接(以下简称"监听方式"):或者主动连接其他程序(以下简称"连接方式").排列组合一下,会得到三种结果:监听-连接.监听-监听.连接-连接.其中只有"监听-连接"方式能正确地建立连接,<DuplexPipe二三事(三)>中介绍的 FPipe 只是在其中添加了一节"监听-连接-监听-连接",其中粗体部分

DuplexPipe二三事(三)——网络中转站:端口映射

端口映射 在<DuplexPipe二三事(二)>中介绍了瑞士军刀 nc 的用法:nc 就像给程序一张飞机票,让原本只能在本地执行的程序也能运行在网络上!但网络和现实交通一样,很多地方需要中转才能到达(比如外网计算机无法直接访问公司内部 Web 服务器). 为实现公网对内部网络的访问,需要对数据进行转发(即端口映射).比如内网"主机A"开启了 Web(port 80)服务,需要在"服务器的网关"上设置:凡来自 Internet 上对 80 端口的请求,全部

DuplexPipe二三事(六)——没有第七

我的设想 在着手编写 DuplexPipe 之前,我规划过我的需求:我想要一个最通用的通信工具,换言之就是能让所有具有输入/输出的程序都可以相互通信.DuplexPipe 本身远没达到这个设想,至少还得具备以下几中模式: -f file # 通过读写文件获得数据 -s # 从 stdio 中获得数据 -e exefile # 从本地程序的输入输出中获得数据 -r url # 这是一个附加功能.如果你玩过几天木马,你可能也渴望将它变成一个强大的后门!通过这个选项可以从URL中获得IP地址和端口,主

DuplexPipe二三事(二)——瑞士军刀再显锋芒:让程序相互聊天

瑞士军刀NC nc(NetCat)是我很喜欢的一个小工具.在我常用的网络小工具中使用频率仅次于 cURL .nc 属于传输层的工具(TCP/IP 四层模型请看这里),它能保证准确无误地发送和接收数据,但并不关心数据的具体含义(这些工作交给应用层的软件).难怪说 nc 是网络的瑞士军刀,因为所有应用层的软件都是通过各自的网络协议来解析来自传输层的数据.所以,只要你了解应用层协议(比如HTTP.POP3等),就可以手工模拟出任何服务端或客户端程序.而且,只要你愿意,以后设计网络程序完全可以只实现一个

DuplexPipe二三事(一)——有趣的起因:算24

写 DuplexPipe 是因为"无聊"!真的,那天很无聊,想起小时候用扑克牌和姐姐比赛算24,就随手写了一个 Shell 脚本重温一下: #!/bin/sh for ((i=0;i<4;i++)) do ((n=$RANDOM%10+1)) echo -n "$n " done echo i=0 while read exp do ((i++)) ((value=$exp)) if [[ $value -ne 24 ]] then echo -n "

2B创业泡泡二三事

过去半年A轮融资死掉的项目名单不断刷新,越刷越长,仿佛资本一夜之间就进入了冬天,与此同时,一群2B的创业者和投资者又在不断鼓吹2B创业春天的到来,矛盾的表象之下,其实是创业的泡泡.作为DBA+周末咖啡时间,随手写下二三事作为开始.  其一,过去几年创业太火了,大众创业万众创新让原本犹豫的也加入进来,火的不在于真正的创新,更多是估值的泡泡,网上流传的各种刷个二维码就是O2O.整个微信公众号就是移动互联网的段子虽然夸张,也是现实!去年上半年智能自行车一夜之间火的不行,赛道论觉得好像不投一个都不是智能