一份代码构建移动、桌面、Web全平台应用

Web自己就是跨平台的,这意味着这中间存在着无限的可能性。html

我是一名Web Developer,对于我来能用Web开发的事情就用Web来完成就行了——不须要编译,不须要等它编译完。我想到哪我就能够写到哪,我改到哪我就能够发生哪发生了变化。node

最近我在写Growth——一个帮助开发人员成长的应用,在近一个月的业余时间里,完成了这个应用的:linux

  • 移动应用版:Android、Windows Phone、iOS(等帐号和上线)git

  • Web版程序员

  • 桌面版:Mac OS、Windows、GNU/Linuxgithub

截图合并以下:微信

growth-full-platforms.png

而更重要的是它们使用了同一份代码——除了对特定设备进行一些处理就没有其余修改。相信全栈的你已经看出来了:架构

Web = Chrome + Angular.js + Ionichexo

Desktop = Electron + Angular.js + Ionic运维

Mobile = Cordova + Angular.js + Ionic

除了前面的WebView不同,后面都是Angular.js + Ionic。

从Web到混合应用,再到桌面应用

在最打开的时候它只是一个单纯的混合应用,我想总结一下个人学习经验,分享一下学习的心得,如:

  • 完整的Web开发,运维,部署,维护介绍

  • 如何写好代码——重构、测试、模式

  • 遗留代码、遗留系统的造成

  • 不一样阶段所需的技能

  • 书籍推荐

  • 技术栈推荐

  • Web应用解决方案

接着我用Ionic建立了这个应用,这是一个再普通不过的过程。在这个过程里,我一直使用Chrome在调度个人代码。由于我是Android用户,我有Google Play的帐号,便发布了Android版本。这时候遇到了一个问题,我并无Apple Developer帐号(如今在申请ing。。),而主要的用户对象程序员,这是一群不土的土豪。

iPHONE

偶然间我才想到,我只要上传Web版本的代码就能够暂时性实现这个需求了。接着找了个AWS S3的插件,直接上传到了AWS S3上托管成静态文件服务。

几天前在Github上收到一个issue——关于创造桌面版, 我便想着这也是可能的,我只须要写一个启动脚本和编译脚本便可。

因此,最后咱们的流程图就以下所示:

Growth Arch

除了显示到VR设备上,好像什么也不缺了。而且在我以前的文章《Oculus + Node.js + Three.js 打造VR世界》,也展现了Web在VR世界的可能性。

在这实现期间有几个点能够分享一下:

  1. 响应式设计

  2. 平台/设备特定代码

响应式设计

响应式设计能够主要依赖于Media Query,而响应式设计主要要追随的一点是不一样的设备不一样的显示,如:

full-platforms.jpg

这也意味着,咱们须要对不一样的设备进行一些处理,如在大的屏幕下,咱们须要展现菜单:

gnu-linux.png

而这能够依赖于Ionic的expose-aside-when="large",而并不是全部的情形都是这么简单的。如我最近遇到的问题就是图片缩放的问题,以前的图片针对的都是手机版——通过了必定的缩放。

这时在桌面应用上就会出现问题,就须要限定大小等等。

而这个问题相比于平台特定问题则更容易解决。

平台特定代码

对于特定平台才有的问题就不是一件容易解决的事,分享一下:

存储

我遇到的第一个问题是数据存储的问题。最开始的时候,我只须要开始混合应用。所以我能够用Preferences、或者SQLite来存储数据。

后来,我扩展到了Web版,我只好用LocalStoarge。因而,我就开始抽象出一个$storageServices来作相应的事。接着遇到一系列的问题,我舍弃了原有的方案,直接使用LocalStoarge。

数据分析

为了开发方便,我使用Google Analytics来分析用户的行为——毕竟数据对我来讲也不是特别重要,只要能够看到有人使用就能够了。

这时候遇到的一个问题是,我不须要记录Web用户的行为,可是我但愿能够看到有这样的请求发出。因而对于Web用户来讲,只须要:

trackView: function (view) {
          console.log(view);
        }

而对于手机用户则是:

trackView: function (view) {
        $window.analytics.startTrackerWithId('UA-71907748-1');
        $window.analytics.trackView(view)
      }

这样在我调试的时候我只须要打个Log,在产品环境时就会Track。

更新

一样的,对于Android用户来讲,他们能够选择自行下载更新,因此我须要针对Android用户有一个自动更新:

var isAndroid = ionic.Platform.isAndroid();
if(isAndroid) {
  $updateServices.check('main');
}

桌面应用

对于桌面应用来讲也会有相似的问题,我遇到的第一个问题是Electron默认开启了AMD。因而,直接删之:

<script>
//remove module for electron
if(typeof module !== 'undefined' && module && module.exports){
  delete module;
}
</script>

相似的问题还有许多,不过因为应用内容的限制,这些问题就没有那么严重了。

若是有一天,我有钱开放这个应用的应用号,那么我就会再次献上这个图:

六边形架构

将来

我就开始思索这个问题,将来的趋势是合并到一块儿,而这一个趋势在如今就已是完成时了。

那么将来呢?你以为会是怎样的?

项目源码: https://github.com/phodal/growth

更多内容请关注个人微信公众号:phodal

图片描述

相关文章
相关标签/搜索