关注 Vue社区,回复“加群”

加入我们一起学习,天天进步

praise

juejin.im/post/5e612534e51d4527017971a2

模板基于 vue-cli4 和 Vant-ui 搭建,进行大型 H5 项目开发最佳实践方案,让我们来一探究竟

模板地址 (github.com/push-over/vue-h5-template)动动你可爱的小手点亮一颗 star

项目结构

本项目已经为你生成了一个完整的开发框架,下面是整个项目的目录结构。

# git log

安装

# 克隆项目

TIP

强烈建议不要用直接使用 cnpm 安装,会有各种诡异的 bug,可以通过重新指定 registry 来解决 npm 安装速度慢的问题。若还是不行,可使用 yarn 替代 npm

Windows 用户若安装不成功,很大概率是node-sass安装失败,解决方案(https://github.com/PanJiaChen/vue-element-admin/issues/24)。

另外因为 node-sass 是依赖 python环境的,如果你之前没有安装和配置过的话,需要自行查看一下相关安装教程。

启动完成后会自动打开浏览器访问 [http://localhost:9000, 你看到下面的页面就代表操作成功了。

接下来你可以修改代码进行业务开发了,本项目内建了典型业务模板、模拟数据、状态管理、国际化、全局路由等等各种实用的功能来辅助开发

常用命令

# 项目打包

分层架构

目前前端的一个开发趋势是以搭建单页应用 (SPA) 为主的。当应用体系比较大,或者你的应用业务逻辑足够复杂的时候,会遇到各种各样的问题,我们随便提两点:

  • 产品需要多人协作时,每个人的代码风格和对业务的理解不同,导致业务逻辑分布杂乱无章

  • 对产品的理解停留在页面驱动层面,导致实现的技术模型与实际业务模型出入较大,当业务需求变动时,技术模型很容易被摧毁

  • ...

针对上面所遇到的问题,我们以下面这张架构图做讲解:

其中 视图层/View 是大家接触最多的,想必大家都很了解,就不在这里介绍了,重点介绍其他几个层的含义:

Services 层

Services 层是用来对底层技术进行操作的,例如封装 AJAX 请求,操作浏览器 CookieLocaStorageIndexedDB,操作 Native 提供的能力(如调用摄像头等),以及建立 Websocket 与后端进行交互等。

Axios 封装

.....

export defaultasyncfunction(options) {const { url } = optionsconst requestOptions = Object.assign({}, options)

try {const { data, data: { errno, errmsg }} = await instance.request(requestOptions)if (errno) {      errorReport(url, errmsg, requestOptions, data)thrownewError(errmsg)    }return data  } catch (err) {    errorReport(url, err, requestOptions)throw err  }}

IndexedDB

...

export class DBRequest {  instance

static getInstance() {if (!this.instance) {this.instance = new DBRequest()    }returnthis.instance  }async create(options = {}) {const { name, data } = optionsconst db = await indexDB(name)returnawait db.add(name, data)  }    ...}

.......

Entities 层

实体 Entity 是领域驱动设计的核心概念,它是领域服务的载体,它定义了业务中某个个体的属性和方法。区分一个对象是否是实体,主要是看他是否有唯一的标志符(例如 id)

通过上面的代码可以看到,这里主要是以实体本身的属性以及派生属性为主,当然实体本身也可以具有方法,用于实现属于实体自身的业务逻辑。

并不是所有的实体都应该按上面那样封装成一个类,如果某个实体本身业务逻辑很简单,就没有必要进行封装,例如本模板中的 Test 只是做个演示。

Interactors 层

Interactors 层是负责处理业务逻辑的层,主要是由业务用例组成

import { Request } 

通过上面的代码可以看到,Sevices 层提供的类的实例主要是通过 Interactors 层的类的构造函数获取到,这样就可以达到两层之间解耦,实现快速切换 service 的目的了,当然这个和依赖注入 DI 还是有些差距的,不过已经满足了我们的需求。

另外 Interactors 层还可以获取 Entities 层提供的实体类,将实体类提供的与实体强相关的业务逻辑和 Interactors 层的业务逻辑融合到一起提供给 View 层,例如:

当然这种分层架构并不是银弹,其主要适用的场景是:实体关系复杂,而交互相对模式化,例如企业软件领域。相反实体关系简单而交互复杂多变就不适合这种分层架构了。

然后需要明确的是,架构和项目文件结构并不是等同的,文件结构是你从视觉上分离应用程序各部分的方式,而架构是从概念上分离应用程序的方式。你可以在很好地保持相同架构的同时,选择不同的文件结构方式。没有完美的文件结构,因此请根据项目的不同选择适合你的文件结构。

布局

页面整体布局是一个产品最外层的框架结构, 这里使用了 vue-router 路由嵌套, 所以一般情况下,你增加或者修改页面只会影响 app-main这个主体区域。其它配置在 layout 中的内容如:底部导航都是不会随着你主体页面变化而变化的。

/foo                                  /bar+------------------+                  +-----------------+| layout           |                  | layout          || +--------------+ |                  | +-------------+ || | foo.vue      | |  +------------>  | | bar.vue     | || |              | |                  | |             | || +--------------+ |                  | +-------------+ |+------------------+                  +-----------------+

这里在 app-main 外部包了一层 keep-alive 主要是为了缓存 的,如不需要可自行去除。

样式

CSS Modules

在样式开发过程中,有两个问题比较突出:

  • 全局污染 —— CSS 文件中的选择器是全局生效的,不同文件中的同名选择器,根据 build 后生成文件中的先后顺序,后面的样式会将前面的覆盖;
  • 选择器复杂 —— 为了避免上面的问题,我们在编写样式的时候不得不小心翼翼,类名里会带上限制范围的标示,变得越来越长,多人开发时还很容易导致命名风格混乱,一个元素上使用的选择器个数也可能越来越多,最终导致难以维护。

好在 vue 为我们提供了 scoped 可以很方便的解决上述问题。它顾名思义给 css 加了一个域的概念。

/* 编译前 */

只要加上 style scoped 这样 css 就只会作用在当前组件内了。

TIP

使用 scoped 后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件的 scoped CSS 和子组件的 scoped CSS 的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。

目录结构

vue-h5-template 所有全局样式都在 @/src/styles 目录下设置

├── styles│   ├── _animation               # 全局动画│   ├── index.scss               # 全局通用样式│   ├── _mixin.scss              # 全局mixin│   ├── _transition.scss         # 过渡效果│   └── _variables.scss           # 全局变量

一次完整的与服务器端交互

在 vue-h5-template 中,一个完整的前端 UI 交互到服务端处理流程是这样的:

  1. UI 组件交互操作
  2. 调用统一管理的 api service 请求函数
  3. 使用封装的 request.js 发送请求
  4. 获取服务端返回
  5. 更新 data

request.js

其中,@/src/utils/request.js 是基于 Server 目录的 http 的二次封装,便于统一处理 POST,GET 等请求方式。具体可以参看项目代码。

...export class Request {  instance

static getInstance() {if (!this.instance) {this.instance = new Request()    }returnthis.instance  }

async post(options = {}) {const { data } = await service({method: 'post',      ...options    })return data  }    ...}

例子

定义接口地址统一管理 src/constants/api/test.js

export

请求方法 src/core/interactors/test-interactor.js

async getTest() {

请求方式 src/utils/request.js

async

TIP

目录结构不要纠结,个人习惯而定

页面使用 src/pages/test/index.vue

# 生命周期async created() {if (this.id) {awaitthis.handleGetTest()   }}

# 请求async handleGetTest() {try {const test = await testInteractor.getTest(this.id)this.addressInfo = Object.assign({}, test)  } catch (error) {console.log(error)  }}

可能大家会觉得很繁琐,这么多文件容易搞混,重复编写代码等等,不要着急,本模板配置了自动生成文件,上述除了视图/View 层这块需要你手动去编写代码,其他的我们都会去一键生成,接下来我们就来讲讲使用方法。

生成所需文件

在开发过程中,无论我们添加页面也好还是添加组件等等。都需要不停地新建 .vue文件(或者其他框架或者 html/js/css 文件)

以 Vue 项目为例, 我们新建一个 component 或 view 的时候,需要新建一个.vue 文件,然后写 

vue lang_推荐一个基于Vue 的 H5 快速开发模板相关推荐

  1. html5快速开发模板生成器,推荐一个基于Vue 的 H5 快速开发模板

    本项目以基于 vue-cli4 和 Vant-ui 搭建的,进行移动端开发中的一些最佳实践方案 模板地址 动动你的小手点颗star 样式适配 在移动端网页开发时,样式适配始终是一个绕不开的问题.对此目 ...

  2. 推荐一个基于 Vue 的低代码平台

    发现了一个开源的低代码平台项目,用户仅仅通过简单的拖拉拽就能生成一个页面.交互方式类似于创客贴.Processon平台. 这个项目基于 Vue.js 技术栈,先来看这个开源项目有什么功能,平台主页面分 ...

  3. 推荐一个基于 Vue 的前端界面可视化设计器项目

    点击▲关注 "爪哇笔记"   给公众号标星置顶 更多摄影技巧 第一时间直达 简介 基于 Vue 开发的界面可视化设计器,前端小白可以直接拖拽生成前端代码. 特性 可视化拖拽布局 支 ...

  4. json可视化编辑器_推荐一个基于 Vue 的前端界面可视化设计器项目

    简介 基于 Vue 开发的界面可视化设计器,前端小白可以直接拖拽生成前端代码. 特性 可视化拖拽布局 支持数据关联和交互行为的可视化编辑 支持扩展组件.组件属性.属性编辑器 依赖 vjform,可视化 ...

  5. 推荐一个基于vue选择头像的库

    前言 这个库叫 vue-select-avatar,为什么推荐这个库呢,正常在一个网站更换头像,大部分都是点击选择头像按钮或是点击头像位置,然后出来一个对话框,或者直接就直接弹出文件管理器页面,让你选 ...

  6. 推荐一个基于 Python + Vue 的海报生成器

    推荐一个基于 Vue.js 的海报生成器开源项目,像海报编辑器此类的低代码平台更多的开发量在前端,所以说这是前端工程师不错的练手项目,实现起来比管理系统有趣多了. 01.  海报生成器 前几天也推荐过 ...

  7. 一个基于vue和element-ui的树形穿梭框组件

    el-tree-transfer 简介 因为公司业务使用vue框架,ui库使用的element-ui.在市面上找到一个好用的vue树形穿梭框组件都很难,又不想仅仅因为一个穿梭框在element-ui之 ...

  8. vue.js毕业设计,基于vue.js前后端分离教室预约系统(H5移动项目) 开题报告

      毕业论文 基于Vue.js的教室预约系统(H5) 开题报告 学    院: 专    业: 年    级: 学生姓名: 指导教师: 黄菊华   XXXX大学本科生毕业论文(设计)开题报告书 姓   ...

  9. vue.js毕业设计,基于vue.js前后端分离订座预约系统(H5移动项目) 开题报告

      毕业论文 基于Vue.js预约订座系统(H5) 开题报告 学    院: 专    业: 年    级: 学生姓名: 指导教师: 黄菊华   XXXX大学本科生毕业论文(设计)开题报告书 姓   ...

最新文章

  1. PyTorch 实现 Mask-RCNN
  2. [09]CSS 边框与背景 (上)
  3. 五行代码终极完美解决从IE6到Chrome所有浏览器的position:fixed;以及闪动问题
  4. 【转】介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX
  5. HTML5 Web Worker的使用
  6. php携程语比,PHP 协程
  7. MySQL常用查询语句积累
  8. windows内核对象
  9. 【渝粤教育】国家开放大学2018年秋季 0008-21T简明现代汉语 参考试题
  10. Java项目 学生信息管理系统 DAO设计模式
  11. RS-485通讯协议
  12. 泛运筹理论初探——HANP和BMLPA以及DCLP简介
  13. 什么地图可以室内导航?室内导航技术发展趋势
  14. 如何使用cygwin在windows下Linux编程
  15. 安卓无法下载excel文件
  16. SqlDBHelper(基础增删改查)
  17. Excel快速入门01
  18. gif在html里为何会自动停止,CSS或JS实现gif动态图片的停止与播放
  19. php对接阿里巴巴开放平台
  20. TCP粘包、拆包与解决方案、C++ 实现

热门文章

  1. c语言变量强制转换,C语言——“=”中的强制类型转换
  2. python random()*10的值不可能是_Python
  3. php抽象类继承抽象类,PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)...
  4. Java即时类| plus()方法与示例
  5. java 方法 示例_Java语言环境getISOCountries()方法与示例
  6. 计算理论 形式语言与自动机_下推式自动机(PDA)| 计算理论
  7. php 判断 in,tinkphp常用判断条件in、notin、between、AND、OR
  8. ug10许可证错误一8_面对排污许可证后监督检查,企业应做好哪些准备?
  9. Java Dictionary get()方法与示例
  10. Java SimpleTimeZone toString()方法与示例