最近公司要开发一个移动端项目,采用了ionic框架,项目总监要求能够热更新,于是看了一下ionic的热更新功能,大致发现两个途径。
- Hot Code Push 插件
作者已废弃,多年未更新,故未尝试 - 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内部的机制原因。
- 能不能在启动的时候重定向到线上的地址呢?
<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将什么都无法显示。