Webapplate – 可维护的 Web 应用模板,适用于 Firefox OS 和 Chrome 应用

Web 上有许多强大的工具和技术,我们可以重复利用它们来开发跨平台的移动和桌面应用程序,特别是在 Firefox OS 等平台上出现了可安装应用程序的情况下。本文将探讨最佳的实现方式,并介绍 Webapplate,这是一个功能强大的新模板,可以帮助您简化开发过程。

为什么要重新发明轮子(为了新的领域)

就像整个 Web 的本质一样,Web 应用很容易编写,但要做好却很难。尽管 Web 没有像其他移动平台那样提供 SDK 或简单的现成模板,但您仍然可以从 Mozilla Open Web AppsChrome 应用Apache Cordova 等候选方案中开发出可行的 Web 应用。但希望快速构建 Web 应用的开发者通常比 iOS 开发者花费更长的时间。

以下是这些候选方案对 Web 应用的支持现状

  • Firefox(桌面版)、Firefox OS、Firefox for Android 支持托管 Web 应用。这些 Web 应用可以托管在静态或动态 Web 服务器上,就像普通的网站一样。由于安全方面的考虑,托管 Web 应用不允许使用某些经过认证的 Web API,例如 TCP 套接字 API。
  • Firefox OS 和 Chrome(桌面版)支持打包的 Web 应用,它们具有针对不同目的的 API,因为它们目前侧重于不同类型的设备。
  • Cordova 为许多平台提供设备适配器,包括 Android、iOS 和 Firefox OS。
  • Google 有自己的 Cordova 变体,用于将 Chrome 应用的特定 API 移植到 Android 设备上运行。

简而言之,Web 应用的概念尚未完全统一,但已经足够强大,可以与原生应用竞争。目前打包的 Web 应用是主流,因为新的 Web API 存在安全问题。Mozilla 主要侧重于将新的 Web API 暴露给移动设备,Google 则为桌面开发新的 Web API。Apache Cordova 是一个很好的容器,可以将 Web API 暴露给不同的平台。

更糟糕的是,提供的示例通常侧重于教你如何学习新的 Web API,而不是教你如何在开发过程中利用适当的 Web 应用概念。

我有幸参与了一个名为 Gaia 的不断发展的 Web 应用项目的开发,它是 Firefox OS 的用户界面。Gaia 项目包含了 Mozilla 第一个可安装的 Web 应用实现,包括音乐、照片库、电子邮件、日历等应用程序。根据 GitHub 的 Pulse 月度报告,Gaia Web 应用每月大约有 850 次提交。在 Gaia 项目中,Mozilla 开发人员和社区成员投入了大量时间和精力,在两年内将它从原型阶段发展到可发布的产品,并不断迭代,使其成为智能手机消费者的竞争选择。作为一个大型的 Web 应用项目,我们可以从中汲取很多经验教训,并将其应用于通用的 Web 应用开发。

介绍 Webapplate

与其他软件项目一样,除了编写代码之外,开发 Web 应用还需要做很多事情,例如

  • 如何组织源代码
  • 如何处理库依赖项
  • 如何保持代码风格符合约定
  • 如何优化 Web 应用的加载性能
  • 如何对 Web 应用进行单元测试/集成测试
  • 如何本地化 Web 应用
  • 如何自动化这些流程

这些都是开发高质量 Web 应用需要解决的问题。在 Gaia 中,我们通过使用一系列 构建脚本(Makefiles) 来解决这些问题。

您可能想知道为什么我们没有使用 Gruntgulp 来构建?答案是:在 Firefox OS 开始开发时,这些工具还不存在。而且模块所有者希望将核心构建过程有一天运行在 Firefox 扩展中。

对于通用的 Web 应用开发,我们不必遵循这些约束。我们可以通过重复使用第三方工具和库来快速进行一些实验。从 2013 年开始,我发起了一个名为 webapplate 的副项目,这是一个开源的 Web 应用模板,它试图使 Gaia 的解决方案与新兴的工具包(如 npmGruntBower)兼容。它还试图将 Gaia 中的最佳实践移植到新的 Web 应用中,使它们更易于维护。

如何设置 Webapplate

Webapplate 利用了许多强大的工具。借助 node.js、Grunt、Bower、KarmaMochal20n,我们可以开发出一个可维护的、完整的、自包含的 JavaScript Web 应用模板。因此,您可以从 GitHub 上复制或下载 Webapplate,并进行开发,然后部署到托管服务器或相应的 Web 应用商店。

您首先需要在桌面电脑上安装 node.js。安装 Node.js 后,您将拥有 npm 工具来管理 Node.js 模块。现在运行以下命令

$ npm install -g grunt-cli bower karma

来安装主要工具。

Grunt 是一个 JavaScript 任务运行器工具(类似于 Make),而 grunt-cli 是它的命令界面。Gruntfile.js 文件类似于 Makefile,但是用 Javascript 编写的。

Bower 是一个用于管理前端库的工具。它可以帮助开发者管理不同的库版本。在 Webapplate 中,当您运行以下命令时,Bower 会将客户端库下载到 public/vendor 文件夹中

$ bower install

命令。

Karma 是一个测试运行器,它为每个浏览器运行测试代码。karma.conf.js 定义了详细的设置,用于指定测试运行器的运行方式。

接下来,进入 Webapplate 文件夹并运行

$ npm install

npm 将引用 package.json 来安装所有依赖的 node 模块。该命令将触发 Bower 来安装客户端库依赖项。

然后,您就设置好了!您将获得以下功能:

  • 预提交代码风格检查
  • 与 Firefox 和 Chrome Web 应用兼容的模板
  • 库依赖项管理
  • 客户端本地化框架
  • 单元测试和模拟框架
  • 可部署的 Web 服务器

如果您使用的是 Firefox Nightly,可以在 WebIDE 开发工具 中将 webapplate/public 文件夹作为打包的应用打开。

WebIDE 允许您使用您喜欢的 Firefox 开发工具来编辑、调试或在模拟器或设备上执行您的 Web 应用。

借助 Chrome 应用和扩展开发工具,您可以将 webapplate/public 文件夹导入为 Chrome 应用,并在桌面电脑上检查 UI。

webapplate on Chrome devtool

预提交代码风格检查

Gaia 和 Webapplate 提供的第一个最佳实践是 git 预提交代码风格检查。

由于在 Gaia 中,每个提交都需要在代码签入之前由模块所有者进行审查和验证,因此我们遵循了 Google JavaScript 风格 约定。当时我们使用 gjslint 来进行测试。这听起来不错,但实际上,强制人们手动遵循完全相同的规范非常困难;要求审阅者找出这些风格错误是另一种浪费时间的事情。因此,一些天才引入了 git 预提交钩子,在开发人员尝试提交代码时检查几种类型的代码风格错误,并为那些不完全符合代码风格但应该允许的代码提供 白名单。目前,在 Gaia 中,我们对 JavaScript、CSS 和 JSON 进行了预提交检查!这真是一个巨大的解脱。

目前 Webapplate 利用 JSHintJSCSJSONLint 对 JavaScript 和 JSON 进行代码质量和风格检查。

它与 Gaia 的 JSHint 设置完全相同,并且还包含 白名单。Gaia 也计划迁移到 jscs 来替换 gjslint。如果您使用 git 进行版本控制,请运行以下命令

$ grunt githooks

将 git 预提交代码风格检查绑定到您的开发流程中。

与 Firefox OS 和 Chrome 应用兼容的模板

Webapplate 使用 HTML5 移动模板 作为模板基础,并在其基础上添加了 Web 应用安装助手、图标链接和 usemin 注释,用于优化 Web 应用。

目前,Firefox 网页应用使用 manifest.webapp 作为清单文件,而 Chrome 应用使用 manifest.json。 除了本地化部分(我们将在稍后解决这个问题),这两个语法是相互兼容的。

编辑完其中一个文件后,使用

# firefox to chrome
$ grunt f2c

# chrome to firefox
$ grunt c2f

manifest.webapp 覆盖到 manifest.json,反之亦然。

要生成 Firefox OS 打包应用或 Chrome 应用,请运行以下命令:

$ grunt pack

将您的网页应用打包到可上传的 zip 文件。使用默认设置,webapplate 生成的打包网页应用可以上传到 Firefox 应用商店Chrome 应用商店

库依赖项管理

对于 Gaia,我们通过 npm 管理开发工具,通常不使用许多第三方客户端库。我们在应用之间共享一个 shared/ 文件夹,然后在构建时通过构建脚本将它们复制到其中。

webapplate 在 package.json 中定义这些库,使用 npm 来要求构建工具,并且不假设任何应用框架(例如 BackboneAngular.js,或 UI 框架,例如 Bootstrap)。 客户端库可以通过 Bower 在 bower.json 中管理。

客户端本地化框架

由于网页应用可能在没有互联网连接的情况下运行,我们不能指望服务器来检测多种语言。目前 Firefox OS 使用 navigator.mozL10n,而 Chrome 应用使用 chrome.i18n 进行本地化。 这两个都是非标准的。

在 webapplate 中,我们使用 l20n 库来解决客户端本地化问题。l20n 由 Mozilla 制作,开发人员目前也在改进 Firefox OS 本地化框架。

查看 index.html; 本地化语法看起来和我们之前在 Gaia 中使用的完全一样。

Hello WebApplate

但是,语言环境文件采用不同的格式,locales.en.l20n:



另外,请查看 多语言支持框架 部分,了解 l20n 如何与 webapplate 集成。

单元测试和模拟框架

Gaia 使用自己的测试代理来触发 Firefox 上的单元测试。 Gaia 使用 Mocha 测试框架、Chai 断言库和 Sinon 测试辅助库来进行单元测试。

Webapplate 使用上述单元测试库加上 Karma 测试运行器来在所有主流浏览器上运行单元测试。

可部署的 Web 服务器

对于开发 Firefox OS 托管网页应用,我们需要一个正在运行的 Web 服务器,可能还需要一些动态 Web 服务器支持。 这就是我们所说的 21 世纪:现在可以使用 JavaScript 来编写服务器端代码了。

运行以下命令:

$ grunt server

将触发使用 Express 支持的服务器,该服务器使用 类似 Django 的 Swig 模板支持。 它已经针对性能进行了预先配置。 使用 YSlow 进行测量,您的网站将获得不错的分数。

Webapplate 已在一些免费的动态网页托管提供商上进行了测试,例如 openshift、heroku 和 appfog。 查看 部署 部分以了解更多详细信息。

如果您想将您的网页应用托管在静态 Web 服务器上,请运行:

$ grunt static

生成优化后的网页以进行托管。

如果您想将您的网页应用部署到 GitHub 页面(作为免费的静态托管服务器),请运行:

$ grunt github

使用 webapplate 启动您的新的网页应用项目!

Webapplate 是一个网页应用模板,它借鉴了 Gaia 项目中有关网页应用维护的最佳实践。 它提供现成的 Firefox OS 和 Chrome 应用支持,集成的工具箱可以优化您的网页应用并保持质量,并通过客户端/服务器端构建/测试框架使用 JavaScript。 如果您要制作网页应用或想了解如何维护网页应用,webapplate 是一个不错的起点。

参考

关于 Fred Lin

Fred Yu-Min Lin,又名“gasolin”,是一名前端网页开发者,致力于 Firefox OS 的用户界面“Gaia”。 他也是 Android 和 Firefox OS Gaia 开发的书籍作者。 他经常在 http://blog.gasolin.idv.tw 上写博客,并发表演讲来分享开放式网页和移动技术。

更多 Fred Lin 的文章……

关于 Robert Nyman [荣誉编辑]

Mozilla Hacks 的技术布道者和编辑。 发表有关 HTML5、JavaScript 和开放式 Web 的演讲和博客文章。 Robert 是 HTML5 和开放式 Web 的坚定支持者,自 1999 年以来一直在瑞典和纽约市从事 Web 前端开发工作。 他还经常在 http://robertnyman.com 上写博客,喜欢旅行和结识新朋友。

更多 Robert Nyman [荣誉编辑] 的文章……


14 条评论

  1. Ivan Dejanovic

    我必须承认,这看起来很不错。 我一定会尝试一下。 Firefox OS -> Chrome 应用,反之亦然,这真的很实用,因为它可以自动执行很多手动工作。

    希望有一天,manifest.webapp/manifest.json 能够标准化并得到所有浏览器的支持,这样网页应用就能在所有平台上成为一等公民。

    2014 年 9 月 5 日 凌晨 1:48

    1. Robert Nyman [编辑]

      感谢您! 请尝试一下! 好消息是,清单标准化 正在进行中!

      2014 年 9 月 5 日 上午 6:35

  2. Adam

    太复杂了。 Grunt、Karma、Bower、Npm、Node.js、Mocha——所有这些都是为了用 HTML5 制作一个简单的网页应用?

    2014 年 9 月 5 日 上午 5:29

    1. Robert Nyman [编辑]

      这不是必需的,但这是一种选择,可以让很多人的工作流程和维护变得更容易。 这取决于您的需求和优先事项。

      2014 年 9 月 5 日 上午 6:15

      1. Adam

        那么,我可以在没有它们的情况下使用 Webapplate 吗?

        2014 年 9 月 5 日 上午 10:17

      2. Adam

        那么,我可以在没有它们的情况下使用 Webapplate 吗? 我认为不行。

        2014 年 9 月 5 日 上午 10:18

        1. Fred Lin

          就像在“为什么要重新发明轮子”部分中提到的那样,对于单个网页应用,您可以从任何现有的网页应用生成器开始,并在短时间内生成一个可用的网页应用。 Webapplate 也是如此。

          本文包含更多技术分享,因此提到了很多细节。
          像 Karma、Mocha 这样的工具用于单元测试,它们需要在开发过程中安装,但您可以在没有它们的情况下使用 Webapplate。
          由于这些工具已很好地集成到 webapplate 中,因此您不需要了解它们的每一个细节。

          Webapplate 与其他工具的关键区别在于“维护”。
          发布网页应用后,进入维护状态时,您会对代码质量感到头疼,这些工具已经为您集成好了。 您可以在需要时稍后对它们进行修改。

          2014 年 9 月 5 日 下午 7:00

  3. Doug Reeder

    对我来说,更有用的是一个工具,它可以接受我现有的网页应用项目,并添加其中一个或多个功能。

    2014 年 9 月 5 日 下午 12:23

    1. Fred Lin

      是的,这将很有帮助。 我认为,一旦网页应用开发者遵循类似的约定(例如相同的应用文件夹结构),工具就可以使用这些约定将某些功能应用于现有项目。

      目前,我建议您查看 webapplate 如何集成这些功能,并将它们移植到您的现有项目中。

      webapplate 将其功能组织成结构组 https://github.com/webapplate/webapplate/wiki/Structure

      从 1.7 版本开始,我开始将 grunt 选项和任务分开。 因此,有一天,我们可以创建命令工具,让开发者只选择一些功能,并在需要更多功能时添加一个或多个功能。

      2014 年 9 月 5 日 下午 7:13

  4. Vincent

    我想知道您是否了解 Yeoman,如果是,为什么您没有把它作为 Yeoman 的生成器来制作?

    另外,我几乎无法在网站上阅读文本 :( http://i.imgur.com/gY9TupU.png

    2014 年 9 月 6 日 上午 5:26

    1. Fred Lin

      是的,在 https://github.com/webapplate 下有一个名为 generator-webapplate 的项目,但尚未准备好用于主要用途。 我想知道是否比仅仅复制和下载模板更容易。

      您可以针对网站错误在 https://github.com/webapplate/webapplate.github.io 中提交问题。 需要进一步调查,因为我无法重现该问题。

      2014 年 9 月 8 日 凌晨 1:35

  5. M. Edward (Ed) Borasky

    我昨晚玩了一下这个。 我设法让它运行起来,并让“Hello World”应用通过 Nightly 与 Firefox OS 模拟器通信。 但似乎缺少一部分——用于实际构建类似 Gaia 应用的 CSS 和 JavaScript。 是否有计划合并 Mozilla Brick 或 Gaia 构建块,这样我们就可以只编写一小段 HTML 和 JavaScript 来制作应用,还是需要在每个项目中都这样做?

    2014 年 9 月 29 日 下午 4:09

    1. Fred Lin

      正在进行中。 由于 webapplate 旨在跨平台,因此 webapplate 将集成材质设计 Web 组件(通过 Polymer)作为可选模板。 这里有一张截图
      https://plus.google.com/b/110128861309919618347/110128861309919618347/posts/MrbTfk3anCd

      所需的组件由 bower 预取。您可以取消注释 `webapplate/public/index.html` 中的 web 组件部分并立即使用它。`app-main` 组件定义在 `webapplate/public/parts/app-main.html` 中。限制(针对 1.7)是代码优化流程尚未准备好用于 web 组件,并且 web 组件 platform.js shim(polymer/brick 都使用它)对打包的 web 应用程序存在 CSP 违规问题。因此,如果您现在想将 web 组件用于打包的应用程序,则需要自己注意。

      请注意,Gaia Building blocks 正在被弃用(但仍然有效),并且将在将来的版本中被 gaia-elements 替换。遗憾的是,gaia-elements 还没有跨平台支持计划。

      2014 年 9 月 29 日 19:37

      1. M. Edward (Ed) Borasky

        我不确定此时我会做打包应用程序还是托管应用程序。鉴于我获得美国广泛分发的唯一途径是将其免费放到 Marketplace,我有很多选择。我倾向于 OpenShift 在线部署,因为我在那里有帐户并且是 Fedora Linux 的狂热用户。;-)

        这是我对大约一年前在 Github 上发布的一个帖子的后续内容 - http://repres4fxos.github.io。它可能确实需要能够访问网络,但其他要求非常适中。我只需要它具有应用程序样式,而不是幻灯片放映。

        2014 年 9 月 29 日 22:21

本文的评论已关闭。