Ionic热更新方案之服务端部署

2,322 阅读2分钟

最近公司要开发一个移动端项目,采用了ionic框架,项目总监要求能够热更新,于是看了一下ionic的热更新功能,大致发现两个途径。

  1. Hot Code Push 插件
    作者已废弃,多年未更新,故未尝试
  2. Code Push 插件
    微软维护的一套热更新插件,支持android和ios,使用也比较方便。它需要把打包的前端资源推送到它的服务器上,项目总监不同意,故放弃。

此外没有找到其他的插件,这里不得不吐槽下ionic的生态,插件太少,质量也比较差。

一些尝试:

于是我想,如果把前端资源部署到线上,让app去加载线上资源是否可行?

首先想到通过iframe加载线上网页:

<body>
  <!-- <app-root></app-root> -->
  <iframe src="http://192.168.1.148:8000" style="width: 100%; height: 100%;" frameborder="0"></iframe>
</body>

要注意的是,由于ionic的样式会导致这个body标签显示不出来,所以要重写下样式:

body {
    display: unset !important;
}

此时,app应该就能正常显示你的网页了。

但是不要高兴的太早,这种情况下,原生功能无法使用

Ionic Native: deviceready did not fire within 5000ms. This can happen when plugins are in an inconsistent state. 
Try removing plugins from plugins/ and reinstalling them

具体什么原因没有搞清楚,可能是cordova内部的机制原因。

  1. 能不能在启动的时候重定向到线上的地址呢?
<script>
    location.href = 'http://192.168.1.148:8000';
</script>

遗憾的是,android手机会直接跳转到浏览器访问这个地址。。。

最终方案:

最后突然想到能不能直接把ionic的入口文件改为线上地址呢?ionic的入口文件是在config.xml里配置的:

<content src="index.html" />

我们改成线上的

<content src="http://192.168.1.148:8000" />

成功!原生功能也能正常使用。一行代码就能搞定,竟然走了这么多弯路。。

优点:

使用服务端部署可以加速你的app部署更新,避免了每次发布到应用市场的麻烦过程,要注意的是如果涉及到原生功能的改动,比如添加了一个新的cordova插件,你必须重新发布你的安装包。

缺点:

由于资源全部部署在线上,如果没有网络,你的app将什么都无法显示。