浏览器之外的 HTML

在我朋友中,我被称为“星球大战迷”。我长期使用的昵称是 cfjedimaster(两个爱好的结合,另一个是 ColdFusion),我的工作是在一个塞满星球大战玩具的房间里,我已经两次在身上纹了星球大战图案。话虽如此,是另一部电影对我现在的职业生涯影响最大——《电子世界争霸战》。

Tron_poster

在那之前,我已经对计算机产生了兴趣,但正是《电子世界争霸战》让我真正坚定了这个想法。突然间,我仿佛看到了自己成为程序员的样子——创建智能程序,统治网络世界。是的,我知道,当时我也是个书呆子。

然而,我在大学学习计算机科学专业时,我的梦想很快就变成了现实。首先——我发现“嘿,我擅长数学!”这句话在遇到微积分 3 时毫无意义,其次,我发现我对这种或那种排序的性能并不感兴趣。我转到了英语专业(一直是个不错的选择),但一直都在接触电脑。正是在这段时间里,我接触到了 Mosaic 和早期网络。

我很快进入了网络,因为——好吧,我直白地说——比我之前接触过的编程要容易得多。我还记得 LiveScript。我还记得我的第一个 Perl CGI 脚本。这并不完全是“光轮”编码,但它更简单、更有趣,而且实际上很前沿。我已经将成年生活的大部分时间都花在了作为 Web 开发者的工作上,虽然我确实幻想着网络是一个原始的环境,但它对我(以及其他数百万人)来说一直都是很好的选择,而且我很乐意看到它随着时间的推移而发展。

Web 技术发展最令人着迷的方式之一是网络之外。在本文中,我将探讨所有可以在非网络环境中重用我们的基于 Web 的技术(HTML、JavaScript 和 CSS)的方法。虽然说一个人不应该学习其他技术,或者说 Web 标准在任何地方、任何情况下都能正常工作是荒谬的,但我坚信 Web 背后的技能对于各个学科的许多人来说都是开放的——无论你是否获得了计算机科学博士学位!

移动

这通常是我讨论移动设备重要性的部分,但现在是 2014 年,我认为我们已经过了那个阶段。移动开发通常涉及 Java(Android)或 Objective-C(iOS)。开发人员还可以使用 Web 标准来构建原生应用程序。其中一个解决方案是 Apache Cordova(又名 PhoneGap)。

Cordova 使用一个包装在原生应用程序中的 Web 视图,允许 Web 开发人员构建通常被称为混合应用程序的应用程序。除了提供一种将 HTML 轻松放入应用程序的方法外,Cordova 还提供了一系列不同的插件,可以让你做一些典型的网页在设备上无法做的事情。例如,你可以轻松访问相机

navigator.camera.getPicture(onSuccess, onFail, { quality: 50,
    destinationType: Camera.DestinationType.DATA_URL
});

function onSuccess(imageData) {
    var image = document.getElementById('myImage');
    image.src = "data:image/jpeg;base64," + imageData;
}

function onFail(message) {
    alert('Failed because: ' + message);
}

你还可以使用加速度计、GPS、联系人、文件系统等等。Cordova 提供了一个 JavaScript API,用于处理与后端原生代码的通信。最棒的是,同一代码可用于构建适用于多个不同平台(包括 Firefox OS,现在已在 Cordova 和 PhoneGap 中提供支持)的原生应用程序。

需要澄清的是,这并不是说你可以将现有的网站打包起来。移动应用程序的本质——与简单的网站完全不同。但是,你可以使用你现有的知识,这为开发人员节省了大量的时间。

另一个例子(希望本网站的读者都很熟悉)是 Firefox OS。与 Cordova 不同,开发人员不必将 HTML 包装在 Web 视图包装器中。整个操作系统都是基于 Web 标准的。让 Firefox OS 更令人着迷的是对托管应用程序的支持。Firefox OS 是一个新的平台,你的访问者使用该平台的设备的可能性很小。但是,使用托管应用程序,我可以轻松地为设备上的安装提供支持,同时仍然从传统的 URL 运行我的应用程序。

考虑一下我构建的一个名为 INeedIt 的简单演示。如果你在 Chrome 中访问此应用程序,它可以正常工作。如果你在 Android 或 iOS 上的移动浏览器中访问它,它也可以正常工作。但是,如果你使用 Firefox 访问它,代码将触发,询问你是否要安装该应用程序。以下是处理此问题的代码块。

if(!$rootScope.checkedInstall && ("mozApps" in window.navigator)) {

    var appUrl = 'http://'+document.location.host+'/manifest.webapp';
    console.log('havent checked and can check');
    var request = window.navigator.mozApps.checkInstalled(appUrl);

    //silently ignore
    request.onerror = function(e) {
        console.log('Error checking install '+request.error.name);
    };

    request.onsuccess = function(e) {
        if (request.result) {
            console.log("App is installed!");
        }
        else {
            console.log("App is not installed!");
            if(confirm('Would you like to install this as an app?')) {
                console.log('ok, lets try to install');
                var installRequest = window.navigator.mozApps.install(appUrl);

                installRequest.onerror = function() {
                    console.log('install failure: '+this.error.name);
                    alert('Sorry, install failed.');
                };

                installRequest.onsuccess = function() {
                    console.log('did it');
                    alert('Thanks, app installed!');
                };
            }
            $rootScope.checkedInstall=true;
        }
    };

} else {
    console.log('either checked or non compat');
}

非常简单,对吧?我喜欢的部分是,除了 Firefox OS 之外的任何地方都完全忽略了这段代码,但对于使用该操作系统的用户来说,它会自动增强。我不会冒任何风险,但可以为他们提供一种将我的应用程序下载到设备屏幕上的方法。

FF OS prompting you to install the app

桌面

当然,仍然有一些人每天坐在灰色盒子(或笔记本电脑)前工作。许多桌面应用程序已被网页取代,但仍有一些事情超出了 Web 应用程序的范围。有时,桌面应用程序更有意义。幸运的是,也有多种方法可以使用 Web 标准来构建它们。

所以你知道我刚刚给你的代码示例吗?那个让 Firefox OS 用户有机会从网页上安装应用程序的代码?完全相同的代码在桌面上也能工作。虽然它仍在开发中(事实上,我构建的应用程序由于地理定位错误而无法工作),但它最终将允许你将基于 Web 的应用程序推送到移动 Firefox OS 用户以及其他十亿台桌面用户。这是我自己的应用程序文件夹中安装的应用程序。

INeedIt as a desktop app

但我之前说过,这仍然是一个相对较新的技术,需要再过一段时间才能投入使用。你现在可以使用的技术是 Node Webkit。这个开源项目允许你将 Node.js 应用程序包装在桌面外壳中。然后可以为 Windows、Mac 和 Linux 创建可执行文件。你可以获得“真实”桌面应用程序的所有功能,同时使用 Web 标准作为你的平台,操作起来更加轻松。已经有越来越多的 应用程序列表 在使用该框架——我甚至在意识到它们在幕后使用 Node Webkit 之前就使用过其中一些应用程序。

例如,可以查看 A Wizard’s Lizard,这是一个随机地牢和精彩游戏玩法的 RGP 游戏。

Screen shot - Wizard's Lizard

原生应用程序扩展

在上一节中,我们介绍了使用 Web 标准构建的应用程序。如今,也有许多原生构建的应用程序可以通过 Web 标准进行扩展。作为 Web 开发人员,你可能已经熟悉 Firefox 附加组件和 Chrome 扩展程序。对于你能想到的任何需求,都存在着一个非常丰富的浏览器扩展生态系统。然而,我感兴趣的是使用 Web 标准来打开其他产品。

你知道吗?Photoshop(是的,Photoshop)现在可以通过 Node.js 进行扩展?这个名为“Adobe Generator”的可扩展性层允许使用基于脚本的界面访问该产品。其中一个例子是根据简单的命名方案从图层生成 Web 资源。如果你曾经不得不手动创建 Web 资源并从 PSD 中更新它们,你就会很欣赏这一点。但是,整个功能都是由 JavaScript 驱动的,并且都使用了你可以构建在之上的公共 API。你可以通过 GitHub 访问 代码和示例

Generator running within Photoshop

接下来呢?

从一个在该行业工作了太久的人的角度来看,我可以说,我很幸运 Web 标准已经成为创新和创造力的驱动力。但这不是促成这种进步的原因。正是许多人、公司和组织(如 Mozilla)的辛勤努力创造了我们今天拥有的肥沃土壤。为了继续这种动力,我们需要每个人都参与进来,向其他人宣传,并成为由每个人为每个人创建的网络的支持者。

关于 Raymond Camden

Raymond Camden 是 Adobe 的开发人员。他的工作重点是客户端开发、移动应用程序、Node.js 和 ColdFusion。他是一名已出版的作家,并在各种会议和用户组上发表演讲。可以通过他的博客 (www.raymondcamden.com)、Twitter 上的 @raymondcamden 或通过电子邮件 raymondcamden@gmail.com 联系 Raymond。

更多 Raymond Camden 的文章…

关于 Robert Nyman [名誉编辑]

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

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


14 条评论

  1. Brett Zamir

    还没有读完整篇文章,但就 Node Webkit 而言,我惊讶于人们对我的附加组件 AsYouWish(位于 https://github.com/brettz9/asyouwish/)的兴趣相对较小,如果与 Firefox 配置文件结合使用(以提供与单独可执行文件大致相同的等效功能),在我看来,它应该能够提供所有相同的功能,除了不需要特殊打包,并且还可以通过用户批准连接到许多特定于浏览器的 API。

    2014 年 4 月 17 日 上午 4:59

    1. Evert

      任何需要单独插件才能工作的软件都会让我却步。更不用说专门用于提权的软件了。

      2014 年 4 月 17 日 上午 10:07

      1. Brett Zamir

        我理解单独插件并非理想选择(我希望这能成为标准,因为其他潜在危险的软件都可以在用户权限下运行,尤其是在移动设备上),但如果插件是个问题,为什么你认为每个 Node-Webkit 应用程序都需要单独下载一个版本(更不用说开发者每次修改代码都要打包的麻烦了)?而且这些可执行文件没有告诉你将使用哪些确切的权限,比如销毁文件等等?

        AsYouWish 会准确地告诉你需要哪些权限,并且只在允许的情况下对应用程序进行提权。它甚至不会允许网站向你请求权限,除非你将它们列入白名单(或者你将 https 之类的协议列入白名单,但即使这样,你仍然需要在它们获得任何提权之前批准请求)。

        2014 年 4 月 17 日 下午 4:39

        1. Evert Pot

          如果你真的想获得关于你项目的反馈,你不应该在博客文章(你承认你甚至没有完全阅读)上发表评论,而这篇博客文章只与你正在做的事情略有重叠。

          回到 FirefoxOS 和它的可安装应用程序。实际上,它们仍然在浏览器沙箱中运行,不像你的工具。

          它们使用的额外特权 API 实际上是定义明确的 API,其中许多正在成为 Web 标准。

          所有这一切都将“正常工作”,并且不需要用户下载任何插件。

          运营一个没有流行起来的开源项目,这是我熟悉的事情,许多其他人也一样。如果你想要诚实的反馈,也许你应该考虑去论坛或 subreddit,礼貌地询问人们的意见。

          2014 年 4 月 17 日 下午 4:52

          1. Brett Zamir

            我不认为我跑题了:我承认我只阅读了与我评论相关的部分,这篇博文涵盖了各种主题。我的插件不仅与提到的主题相关,而且我认为它会引起那些已经熟悉 Mozilla 自身 SDK API(毕竟这是 Mozilla 博客)的人的兴趣,如果不是那些已经熟悉的 Node.js API 在 SDK 中。

            但我确实承认其他地方更适合全面征集反馈,所以感谢你对这方面的建议。你的观点都很有道理,但 1)它们没有解决与我回应文章中的主题(即 Node Webkit)相关的任何特定优势,2)它们没有解决某些 Web 应用程序对访问其他 API 的迫切需求,例如任意文件读取或操作,而这些 API 尚未标准化,也可能永远不会标准化。

            2014 年 4 月 22 日 下午 7:12

          2. Brett Zamir

            哦,至于(网络)沙箱,我同意任何 HTML 应用程序(尤其是 AsYouWish 应用程序)都应该具备沙箱功能,并且我已经在 WhatWG 列表中建议过:http://comments.gmane.org/gmane.org.w3c.whatwg.discuss/41774

            2014 年 4 月 22 日 下午 7:45

  2. Raymond Camden

    Brett,你的插件会创建可执行文件吗?

    2014 年 4 月 17 日 上午 8:59

    1. Brett Zamir

      @Raymond:不,我的插件允许白名单上的网站(或者,如果你选择,来自所有与 https 和文件等白名单协议匹配的网站)能够向你请求任何数量的请求的 Addon SDK 权限(包括 chrome,它将提供完整的 XPCOM 权限),然后你可以批准或拒绝这些权限。

      我提到可执行文件,因为你可以通过设置一个独立的 Firefox 配置文件来获得基本上等效的效果,并且至少在 Windows 上,你可以为该配置文件设置一个快捷方式,使其拥有自己的图标,然后你可以以单独的进程打开该配置文件。查看

      * http://kb.mozillazine.org/Shortcut_to_a_specific_profile
      * http://kb.mozillazine.org/Opening_a_new_instance_of_your_Mozilla_application_with_another_profile
      * http://kb.mozillazine.org/Bypassing_the_Profile_Manager

      然后,你可以让该配置文件默认只包含你的特权 Web 应用程序(在该配置文件上安装 AsYouWish 或可能在所有配置文件上全局安装,如果这仍然有效:http://kb.mozillazine.org/Installing_extensions#Global_installation)。Web 应用程序可能是固定标签或只是一个普通的标签(你的选项设置为记住上一次会话,因此标签会在下次出现)。

      单独的配置文件还允许你仅安装可能与该专用 Web 应用程序相关的那些插件。不幸的是,我还没有弄清楚如何在 Windows 任务栏中允许单独的实例为同一个配置文件创建单独的窗口,但不同的配置文件仍然胜于没有。

      然而,我正在开发一个插件(尚未准备好),其目标是构建可执行文件(或者它最终只会构建批处理文件,如果它们可以做到的话):https://github.com/brettz9/executable-builder。一旦它可能完成,它应该自动创建上述配置文件快捷方式和这些快捷方式的图标(以及可用于我的另一个插件 WebAppFind,它允许你从 OS 桌面(目前仅限 Windows)直接打开桌面文件到 Web 应用程序,无论是常规应用程序还是 AsYouWish 应用程序)。

      2014 年 4 月 17 日 下午 4:19

      1. Patryk Zawadzki

        如果用户点击了这样一个“应用程序”中的链接会怎么样?特别是,如果该链接对应于另一个位于单独浏览器配置文件中的应用程序呢?

        2014 年 4 月 18 日 上午 0:59

        1. Brett Zamir

          @Patryk:AsYouWish 应用程序中的链接与任何网站中的链接一样工作,并且它们与任何网站一样在浏览器标签中运行;它们只是在用户同意的情况下获得提升的 JavaScript。如果你想强制打开特定的配置文件,你的 AsYouWish 应用程序需要使用 chrome 权限和 nsIProcess,或者可能更好的是,使用 x-subprocess 模块来调用 Firefox 以及所需的配置文件。

          但请记住,除非这只是为了你自己,否则用户可能会决定为他们的配置文件使用不同的名称,因此你可能不知道他们存储应用程序时配置文件的名称是什么。

          你可以通过启动自己的配置文件命名约定来解决这个问题,也许可以使用自定义的基于 Web 的协议,该协议可以在链接中使用以方便使用。

          例如,可以注册 AsYouWish 页面来处理诸如“web+registeredprofilefinder:PatrykCalculator”之类的链接,这样一来,当用户点击该链接时,该页面将在获得用户许可后(请参见下面关于为什么)启动一个子进程来打开一个名为“registered-PatrykCalculator”的配置文件(在执行此操作之前,你甚至可以使用 AsYouWish 使用的 Addons SDK 来创建该配置文件,如果它不存在,则在其中固定你的应用程序等等)。

          然而,非常非常重要的是,与所有 AsYouWish 应用程序一样,在访问该页面时,不应该发生任何不希望出现的副作用,以防恶意网站代表你打开此类链接(即 XSRF);你的 AsYouWish 应用程序可以通过在要打开协议/配置文件时确认用户许可来解决此问题。

          2014 年 4 月 22 日 下午 7:40

  3. Adam

    还记得 Mozilla Prism 和 Chromeless 吗?它们允许我们从 Web 应用程序创建桌面应用程序。为什么它们被放弃了?有没有一种简单的方法可以使用 Gecko 引擎创建独立的桌面应用程序,就像 Brackets 使用 CEF 一样?你也可以在 Adobe AIR 或 JavaFX 中嵌入 Web 视图,但它是 WebKit,而不是 Gecko。

    2014 年 4 月 22 日 上午 8:58

    1. Brett Zamir

      我真的很想得到这个问题的答案,但我指出它们的一个缺点是,无法使用附加组件、用户历史记录等。它们与用户的正常浏览器环境是分开的。当然,这在某些情况下可能是有用的,但我个人更喜欢利用单独的配置文件作为“可执行文件”,这样就可以获得一个具有独立环境的独立进程。

      2014 年 4 月 22 日 下午 7:15

    2. Robert Nyman [编辑]

      关于跨平台的独立应用程序,我建议阅读跨平台开放 Web 应用程序的进展报告

      2014 年 4 月 22 日 下午 11:56

  4. Marco

    在 Firefox 29 中,我们也为打包应用程序提供了桌面支持。可能仍然存在错误(因为该功能没有被广泛使用),但我认为它已经很成熟了。

    附注:最近修复了地理位置错误(实际上是一个回归)。

    2014 年 5 月 8 日 下午 1:55

本文的评论已关闭。