提问

问:为什么要写这个文章?

答:由于作者近两年使用vue较多,而作者是Native App出身(web满足大部分业务,native就用的少了)。因此就有了介绍vue开发高性能app的想法。


废话

众所周知,app开发有很多种方式,也有很多框架。近两年来,原生开发需求相比以前少了很多,一方面小程序的冲击,另一方面就是h5不断的崛起,硬件性能对web的性能完善。


回顾APP分类

  • Native App
  • Hybrid App
  • Web App

apicloud介绍

apicloud是什么我就不介绍了,大家自己看官网


搭框架

从性能和可控上考虑,决定采用apicloud的SuperWebView为原生app框架主体,vue为web app开发框架。

  • 工具:android studio 3、xcode 10、vs code、vue-cli3
  • web app类型:多页应用(一个html===一个activity\fragment\viewcontroller)

秀代码

vue
  • 项目结构
  • public:存放html模板,采用官方建议
  • web_adapter:apicloud官方提供web运行适配
  • 几个重点
  • 自定义模板
    多页配置,页面容器有独立、有返回按键、frame等,因此根据不同的需求编写不同的模板,并且需要在build/page.config.js添加模板page配置
  • 页面js大小优化
    用过vue都知道,默认第三方js库会打包到common chunk中,那么如果是按需加载,如何拆分common chunk呢?
    由于vue-cli3采用的是webpack4,因此需要配置splitChunks
configureWebpack: {
    optimization: {
      splitChunks: {
        cacheGroups: {
          echarts: { // 将echarts|zrender|vue-echarts合成一个chunk
            test: /[\\/]node_modules[\\/](echarts|zrender|vue-echarts)[\\/]/,
            name: 'echarts',
            chunks: 'all'
          },
          'vue-router': {
            test: /[\\/]node_modules[\\/](vue-router)[\\/]/,
            name: 'vue-router',
            chunks: 'all'
          }
        }
      }
    }
}
复制代码

比如以上就是将echarts|zrender|vue-echarts三个库从common chunk中分离成一个独立的chunk(名字为echarts),还有就是vue-router的分离


android

由于代码比较少,就不过多说明。

  • 减少白屏
handler?.postDelayed(Runnable {
        startActivity(Intent(this@MainActivity, WebPageModule::class.java))
        // 预计1s后webview加载出来
        handler?.postDelayed(Runnable {
            finish()
        }, 1000)
    }, 500)
复制代码
  • 取消启动页finish动画
    上面延迟finish,在部分手机会有个bug,就是finish动画会在WebPageModule上面出现,因此解决这个问题,需要关闭finish动画。直接有效的方法如下
<style name="LaunchTheme" parent="AppTheme">
    <item name="android:windowAnimationStyle">@style/Animation</item>
</style>
<style name="Animation">
    <!--<item name="android:activityOpenEnterAnimation">@null</item>-->
    <!--<item name="android:activityOpenExitAnimation">@null</item>-->
    <!--<item name="android:activityCloseEnterAnimation">@null</item>-->
    <item name="android:activityCloseExitAnimation">@null</item>
    <!--<item name="android:taskOpenEnterAnimation">@null</item>-->
    <!--<item name="android:taskOpenExitAnimation">@null</item>-->
    <!--<item name="android:taskCloseEnterAnimation">@null</item>-->
    <!--<item name="android:taskCloseExitAnimation">@null</item>-->
    <!--<item name="android:taskToFrontEnterAnimation">@null</item>-->
    <!--<item name="android:taskToFrontExitAnimation">@null</item>-->
    <!--<item name="android:taskToBackEnterAnimation">@null</item>-->
    <!--<item name="android:taskToBackExitAnimation">@null</item>-->
</style>

复制代码

启动activity的theme设置LaunchTheme即可。


ios

ios集成,重点关注以下问题

  • SuperWebViewSDK的添加,Resource/uz目录一定是Create folder references
  • Build Settings -> Linking -> Other Linker Flags : -ObjC
  • 别忘记添加库:libicucore.tbd、WebKit.framework

哪些人适合这个方案?

  • 原生开发者:这个框架本生就是hybrid app(包大小增加不到1M)。
  • vue开发者
  • h5开发者
  • 其他web爱好者

结语

这是个首秀、首秀、首秀。O(∩_∩)O哈哈~

出现问题,请多多包涵