美文网首页
vue技术栈项目实战设计方案

vue技术栈项目实战设计方案

作者: 寒潇2018 | 来源:发表于2018-11-23 14:17 被阅读0次

本篇文章基于实战下的线上项目,给出基于vue技术栈实现方案。

一、所需工具

npm:包管理工具,前端开发基本都会用到

webpack: 模块打包工具,作用是将js模块或者一些不能被浏览器直接识别的第三方扩展语法(比如less、jsx语法等)进行打包编译,以便浏览器运行。

babel:可以让你用最新的js语法来写代码,如es6

二、框架体系

vue + vue-router + vuex

vue: 主流框架之一,以其数据驱动视图闻名于世,写代码简洁明了。组件化便利。

vue-router: vue路由套件,方便前端各种路由定义及跳转

vuex: 数据状态管理。vue多是组件化开发,但是各个组件如果需要共享同一个数据状态的时候,层层的数据传递显然不够优雅,而且容易出错,vuex可有效解决这样的问题。

三、架构设计

1、页面设计

组件化。每个功能模块都以组件化的方式存在,在页面中根据需要组装不同组件。组件共用的数据通过vuex共享数据状态。

组件化含义划分。组件化可包括以下几类:

(1)没有任何业务含义的组件。这类组件没有任何业务含义,可以在任何需要的地方是使用。比如公共标题栏、底部信息栏、通知等等。此时需要将这些组件单独放到一个模块(包)下。

(2)有共用业务基础的组件。如:短信验证组件、手机号码检测组件等等。这类组件多依赖于业务,但是又是各个业务公共的需要,因此可以单独放到一个公共业务模块(包)下。

(3)各个业务组件。这些组件有自己的业务逻辑,每个业务模块都应单独放到一起,简单清晰。

整体结构。这里的整体结构是考虑页面级别的,比如讲公共的区域放到同一个vue文件中,作为首先加载的页面,这样每个页面都可以共享该区域。典型结构如下

     <nav></nav>

     <body></body>

     <bottom></bottom>

其中nav和bottom就是公共的区域。而body是具体的页面区域,所有的页面渲染、变更都在此区域。如果基于vue-router来讲,body即可替换为

<router-view></router-view>

2、路由设计

上文说过,本技术栈是基于vue-router来进行页面路由的,为什么还需要路由设计?其实这里并不是设计路由,而是基于vue-router来更好的做路由管控。

(1)路由控制

这里所说的路由控制是指,所有的路由都必须经过一层管控,这层管控可以做很多东西,诸如打点、白名单控制等等。基于vue-router的路由控制代码如下:

router.beforeEach((to, from, next) => {next()});

这样,我们就可以在这个方法中做一些公共的处理或者拦截等。

(2)router配置
这里的router配置更多的是指router路径的定义和存放位置。router路径的定义首先要有一定的命名意义,其次应将他们统一写到一个类似于router.js中。

3、网络访问模块

这个网络访问是指整个系统的api访问入口。因为每个网络请求后端都会返回统一的处理结果的状态值。比如该接口处理失败、处理超时、处理成功等都会有统一的状态响应code,如果放到单个的网络请求中进行处理,显然相当麻烦,因此需要抽象出一个公共的网络访问模块进行统一处理。接口只需要拿到自己需要的数据区域的值即可。
此外,为了便于管理各个网络请求api接口,我们将这些网络接口api统一到一个文件中,做成可配置的。这个文件允许我们定义api接口及其需要的参数。如下所示

const config = {
//获取通知api
 getNotice: {
    api: 'getNotice'//api 名称
  },
//获取首页数据api
  getHomeData: {
    api: "homeData",
    params: {//api需要传入的参数
      productId: {
        type: [String, Number],//参数类型
        required: true//是否必须
      }
  },
}
最后增加一个api校验模块,用于在api网络请求调用的时候校验参数的合法性。最终请求网络封装接口如下所示(注意是伪代码示例):
const isRequesting = {};//防重复请求
const invalidRequest = new Promise((resolve, reject) => {
});
for (let item in AllAPI) {
  if (AllAPI.hasOwnProperty(item)) {
    if (isRequesting[apiId]) {  
 Vue.prototype.$message(Constant.MSG_NETWORK_REQUESTING);
        return invalidRequest;
      }
      return AllAPI[item](params).then(res => {
        loading && loading.close();
        isRequesting[apiId] = false;
        if (res.success ) {//业务逻辑执行成功,返回data域,不附带code
          return res.result
        }
        if (res.code === Code.ERROR) {
Vue.prototype.$message(res.message || Constant.MSG_NETWORK_ERROR);
          return false
        }
      }, (error) => {
        loading && loading.close();
        isRequesting[apiId] = false;
        Vue.prototype.$message(Constant.MSG_NETWORK_ERROR)
      })
    }
  }
}

相关文章

网友评论

      本文标题:vue技术栈项目实战设计方案

      本文链接:https://www.haomeiwen.com/subject/laqjqqtx.html