近几年,混合模式移动应用的概念甚嚣尘上,受到了一些中小型企业的青睐,究其原因,混合模式开发可以比传统移动开发节约大量的开发成本和人力成本。

Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。

说白了,如果走传统移动开发路线,公司业务覆盖多端,那么每个平台势必要请一个专属开发人员,安卓要请一个前端开发,ios同理,那么人力成本则进行了翻倍,同时,如果多端使用不同的代码,当有功能上的修改或者维护时,成本也是不可想象的。试想如果开发者编写一套代码,可编译到iOS、Android、H5、小程序等多个平台,这绝对是省时省力的良好方案。

本文介绍如果使用vue.js编写基于h5的适配多端的前端代码,打包后,利用hbuilder打包成安卓客户端安装包apk,从而达到一套代码适配多个平台的功能。

 首先,安装完整版的vue-cli,之前为了快速开发使用simple版,实际上如果做移动开发,要使用完整版的vue-cli

  1. 安装cnpm
  2. npm install -g cnpm --registry=https://registry.npm.taobao.org
  3. 安装完整版 vue.js
  4. cnpm install -g vue-cli
  5. cnpm cache clean --force
  6. 建立项目
  7. vue init webpack myvue
  8. 进入项目 热启动
  9. cd myvue
  10. cnpm run dev

建好项目之后,如何将页面进行响应式设计开发(就是适配多个屏幕)呢?我们需要利用bootstrap框架来帮我们适配大小屏幕,这里引入bootstrap的外部css,修改入口文件main.js,加入下面代码

  1. require('!style-loader!css-loader!./assets/assets_2/main.css');

如果报错说明没有安装依赖库,安装一下

  1. cnpm install style-loader --save

然后新建一个首页路由index.vue,添加下面的代码

  1. <template>
  2. <div>
  3.  
  4. <header class="">
  5. <div class="navbar navbar-default visible-xs">
  6. <button type="button" class="navbar-toggle collapsed">
  7. <span class="sr-only">Toggle navigation</span>
  8. <span class="icon-bar"></span>
  9. <span class="icon-bar"></span>
  10. <span class="icon-bar"></span>
  11. </button>
  12. <a href="/" class="navbar-brand">极速视频网络平台</a>
  13. </div>
  14.  
  15. <nav class="sidebar">
  16. <div class="navbar-collapse" id="navbar-collapse">
  17. <div class="site-header hidden-xs">
  18. <a class="site-brand" href="./index.html" title="">
  19. <img class="img-responsive site-logo" alt="" src="../assets/assets_2/images/mashup-logo.svg">
  20. 极速视频网络平台
  21. </a>
  22. <p>
  23. 视频分类
  24.  
  25. </p>
  26. </div>
  27. <ul class="nav">
  28. <li><a href="./index.html" title="">首页</a></li>
  29. <li><a href="./about.html" title="">视频详情页</a></li>
  30. <li><a href="./services.html" title="">Services</a></li>
  31. <li><a href="./contact.html" title="">Contact</a></li>
  32. <li><a href="./components.html" title="">Components</a></li>
  33.  
  34. </ul>
  35.  
  36. <nav class="nav-footer">
  37. <p class="nav-footer-social-buttons">
  38. <a class="fa-icon" href="https://www.instagram.com/" title="">
  39. <i class="fa fa-instagram"></i>
  40. </a>
  41. <a class="fa-icon" href="#" title="">
  42. <i class="fa fa-dribbble"></i>
  43. </a>
  44. <a class="fa-icon" href="#" title="">
  45. <i class="fa fa-twitter"></i>
  46. </a>
  47. </p>
  48. </nav>
  49. </div>
  50. </nav>
  51. </nav>
  52. </header>
  53.  
  54. <main class="" id="main-collapse">
  55.  
  56. <div class="hero-full-wrapper">
  57. <div v-masonry transition-duration="0.3s" item-selector=".grid-item" class="grid">
  58. <div class="gutter-sizer"></div>
  59. <div class="grid-sizer"></div>
  60.  
  61. <div v-masonry-tile class="grid-item">
  62. <img class="img-responsive" alt="" src="../assets/assets_2/images/img-12.jpg">
  63. <a href="./project.html" class="project-description">
  64. <div class="project-text-holder">
  65. <div class="project-text-inner">
  66. <h3>视频标题</h3>
  67. <p>视频简介</p>
  68. </div>
  69. </div>
  70. </a>
  71. </div>
  72.  
  73. <div class="grid-item">
  74. <img class="img-responsive" alt="" src="../assets/assets_2/images/img-05.jpg">
  75. <a href="./project.html" class="project-description">
  76. <div class="project-text-holder">
  77. <div class="project-text-inner">
  78. <h3>Vivamus vestibulum</h3>
  79. <p>Discover more</p>
  80. </div>
  81. </div>
  82. </a>
  83. </div>
  84.  
  85. <div class="grid-item">
  86. <img class="img-responsive" alt="" src="../assets/assets_2/images/img-13.jpg">
  87. <a href="./project.html" class="project-description">
  88. <div class="project-text-holder">
  89. <div class="project-text-inner">
  90. <h3>Vivamus vestibulum</h3>
  91. <p>Discover more</p>
  92. </div>
  93. </div>
  94. </a>
  95. </div>
  96. <div class="grid-item">
  97. <img class="img-responsive" alt="" src="../assets/assets_2/images/img-04.jpg">
  98. <a href="./project.html" class="project-description">
  99. <div class="project-text-holder">
  100. <div class="project-text-inner">
  101. <h3>Vivamus vestibulum</h3>
  102. <p>Discover more</p>
  103. </div>
  104. </div>
  105. </a>
  106. </div>
  107.  
  108. <div class="grid-item">
  109. <img class="img-responsive" alt="" src="../assets/assets_2/images/img-07.jpg">
  110. <a href="./project.html" class="project-description">
  111. <div class="project-text-holder">
  112. <div class="project-text-inner">
  113. <h3>Vivamus vestibulum</h3>
  114. <p>Discover more</p>
  115. </div>
  116. </div>
  117. </a>
  118. </div>
  119.  
  120. <div class="grid-item">
  121. <img class="img-responsive" alt="" src="../assets/assets_2/images/img-11.jpg">
  122. <a href="./project.html" class="project-description">
  123. <div class="project-text-holder">
  124. <div class="project-text-inner">
  125. <h3>Vivamus vestibulum</h3>
  126. <p>Discover more</p>
  127. </div>
  128. </div>
  129. </a>
  130. </div>
  131.  
  132. <div class="grid-item">
  133. <img class="img-responsive" alt="" src="../assets/assets_2/images/img-10.jpg">
  134. <a href="./project.html" class="project-description">
  135. <div class="project-text-holder">
  136. <div class="project-text-inner">
  137. <h3>Vivamus vestibulum</h3>
  138. <p>Discover more</p>
  139. </div>
  140. </div>
  141. </a>
  142. </div>
  143. <div class="grid-item">
  144. <img class="img-responsive" alt="" src="../assets/assets_2/images/img-03.jpg">
  145. <a href="./project.html" class="project-description">
  146. <div class="project-text-holder">
  147. <div class="project-text-inner">
  148. <h3>Vivamus vestibulum</h3>
  149. <p>Discover more</p>
  150. </div>
  151. </div>
  152. </a>
  153. </div>
  154.  
  155. </div>
  156. </div>
  157. </main>
  158.  
  159. </div>
  160. </template>
  161.  
  162. <script>
  163.  
  164. export default {
  165. data () {
  166. return {
  167. msg: "这是一个变量",
  168. dataList:[],
  169. clicked:0,
  170. upath: '',
  171. result: '',
  172. uping:0
  173. }
  174. },
  175. mounted:function(){
  176.  
  177. },
  178. methods:{
  179. changetest(index){
  180. this.clicked = index;
  181. }
  182. }
  183. }
  184.  
  185. </script>

此时,发现样式已经生效了,但是我们想让首页使用瀑布式的布局,也就是快手和抖音常用的那种首屏流动式布局,所以需要安装vue-masonry,这个vue.js组件可以很方便的将布局改造成瀑布式的。

安装库

  1. cnpm install vue-masonry --save

然后在入口文件进行引入和声明

  1. import {VueMasonryPlugin} from 'vue-masonry';
  2.  
  3. Vue.use(VueMasonryPlugin)

最后,针对模板文件进行改造就可以了

  1. <div v-masonry transition-duration="0.3s" item-selector=".item">
  2. <div v-masonry-tile class="item" v-for="(item, index) in blocks">
  3. <!-- block item markup -->
  4. </div>
  5. </div>

效果是这样的

然后我们对项目进行打包,在打包之前,修改config目录下的index.js,将build中的assetsPublicPath属性改成相对路径:assetsPublicPath: './',另外如果你的路由模式使用的history,请改为hash,或者使用默认模式,因为移动app不支持history模式,最后打包项目

  1. cnpm run build

vue.js将会包项目直接打包在dist文件夹中,这时,下载hbuilder安装包 http://www.dcloud.io/hbuilderx.html,要下载app开发版,将dist直接拖动到hbuilder开发界面中,然后右键转换为移动app

这时系统会帮你创建一个配置文件manifest.json,转换完毕之后,点击index.html,选择运行,浏览器运行,进行测试

打包成功后,就可以下载apk安装包在手机中安装使用了。

其效果和安卓原生系统完全没有差别,一套代码,完美适配pc端和移动端,就是这么简单,最后奉上完整代码仓库地址:https://gitee.com/QiHanXiBei/vue_app

使用基于Vue.js和Hbuilder的混合模式移动开发打造属于自己的移动app的更多相关文章

  1. [译]基于Vue.js的10个最佳UI框架,用于构建移动应用程序

    原文查看10 Best Vue.js based UI Frameworks for Building Mobile Apps 如果您期待使用Vue.js构建移动应用程序,那么您可以选择许多可用的UI ...

  2. 基于vue.js的简单用户管理

    功能描述:添加.修改.搜索过滤 效果图: <!DOCTYPE html> <html lang="en"> <head> <title&g ...

  3. Vue项目中使用基于Vue.js的移动组件库cube-ui

    cube-ui 是滴滴公司的技术团队基于 Vue.js 实现的精致移动端组件库.很赞,基本场景是够用了,感谢开源!感谢默默奉献的你们. 刚爬完坑,就来总结啦!!希望对需要的朋友有小小的帮助. (一)创 ...

  4. 基于VUE.JS的移动端框架Mint UI

    Mint UI GitHub:github.com/ElemeFE/mint 项目主页:mint-ui.github.io/# Demo:elemefe.github.io/mint- 文档:mint ...

  5. 新建一个基于vue.js+Mint UI的项目

    上篇文章里面讲到如何新建一个基于vue,js的项目(详细文章请戳用Vue创建一个新的项目). 该项目如果需要组件等都需要自己去写,今天就学习一下如何新建一个基于vue.js+Mint UI的项目,直接 ...

  6. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  7. 基于 Vue.js 2.0 酷炫自适应背景视频登录页面的设计『转』

    本文讲述如何实现拥有酷炫背景视频的登录页面,浏览器窗口随意拉伸,背景视频及前景登录组件均能完美适配,背景视频可始终铺满窗口,前景组件始终居中,视频的内容始终得到最大限度的保留,可以得到最好的视觉效果. ...

  8. 基于Vue JS, Webpack 以及Material Design的渐进式web应用 [Part 1]

    基于Vue JS, Webpack 以及Material Design的渐进式web应用 [Part 1] 原文:基于Vue JS, Webpack 以及Material Design的渐进式web应 ...

  9. 基于Vue.js PC桌面端弹出框组件|vue自定义弹层组件|vue模态框

    vue.js构建的轻量级PC网页端交互式弹层组件VLayer. 前段时间有分享过一个vue移动端弹窗组件,今天给大家分享一个最近开发的vue pc端弹出层组件. VLayer 一款集Alert.Dia ...

随机推荐

  1. svn学习与应用

    先来认识下svn svn是之前公司一直在用的代码版本控制系统,采用了分支管理系统.顾名思义,可以对代码的版本做系统化管理.通俗讲就是可用于多个人共同开发同一个项目,实现共用资源的目的. 开发同学使用s ...

  2. 语法解析器续:case..when..语法解析计算

    之前写过一篇博客,是关于如何解析类似sql之类的解析器实现参考:https://www.cnblogs.com/yougewe/p/13774289.html 之前的解析器,更多的是是做语言的翻译转换 ...

  3. mybatis-plus使用记录

    如何and和or: QuoteSalaryEnum salaryMax = QuoteSalaryEnum.of(memberObjectInfo.getQuoteSalaryMax()); Quot ...

  4. 测试:DOCX

    先拿到的是需求文档和接口文档以及测试用例模块,[以及之前写好的测试用例]再根据分配的任务进行编写用例 [智能看懂业务需求]现有功能点,在编写用例 [项目介绍]: 辽阳农商惠生活项目是作为一个农户和银行 ...

  5. 【常见踩坑】】USB调试安装失败(Installation failed with message INSTALL_CANCELED_BY_USER)

    [参考]http://www.cnblogs.com/liushilin/p/6553918.html 问题:在USB安装调试(小米手机),出现如下错误 解决:1.小米手机解决办法见参考.登录小米账号 ...

  6. 基于ARM64的Qemu/KVM学习环境搭建

    作者:pengdonglin137@163.com 在没有aarch64架构的开发板的情况下,可以使用Qemu来模拟一个支持KVM的AArch64位的host,然后再在其上运行一个开启KVM加速的Qe ...

  7. JZOJ2020年8月11日提高组T3 页

    JZOJ2020年8月11日提高组T3 页 题目 Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场 ...

  8. Prometheus 使用之 node exporter

    本文使用的 Prometheus 版本为 2.22.0,node exporter 版本为 1.0.1:部署在 Linux 服务器Prometheus 是开源的监控报警系统和时序列数据库 (TSDB) ...

  9. 初学者值得拥有【Hadoop伪分布式模式安装部署】

    目录 1.了解单机模式与伪分布模式有何区别 2.安装好单机模式的Hadoop 3.修改Hadoop配置文件---五个核心配置文件 (1)hadoop-env.sh 1.到hadoop目录中 ​ 2.修 ...

  10. 第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识

    Python被视为一种面向对象的语言,在介绍Python类相关的内容前,本节对面向对象程序设计相关的概念进行简单介绍. 一.    类和对象(实例) 在面向对象的程序设计(OOP)过程中有两个重要概念 ...