这里的架构方案是基于vue-cli2生成的项目应用程序产生的,是对项目应用程序或者项目模板的一些方便开发和维护的封装。针对单页面的解决方案。

主要有四个方面:

一,不同环境下的分别打包

主要是测试环境和开发环境,修改package.json文件

 "scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build:test": "cross-env NODE_ENV=testing node build/build.js",
"build:prod": "cross-env NODE_ENV=production node build/build.js"
},

  同时修改webpack.prod.conf.js文件

// const env = require('../config/prod.env')  注释默认配置
const env = process.env.NODE_ENV === 'testing'
? require('../config/test.env')
: require('../config/prod.env')

  然后修改config里面test.env.js文件,或者直接复制prod.env.js文件

'use strict'

module.exports = {
NODE_ENV: '"testing"',
testApiAddress:'"http://localhost:3000"'
}

注释掉build.js中的 process.env.NODE_ENV = 'production'

二,axios的封装

import axios from 'axios'
import { Notification } from 'element-ui' //这是element-ui提示信息
let qs = require('qs')
let myAjax = axios.create() /**
* 统一定义默认类型请求context-type
*
*/
export const ajaxGetData = dataParams => {
return myAjax.get(dataParams.url, { params: dataParams.params })
} export const ajaxPostData = dataParams => {
return myAjax.post(dataParams.url, qs.stringify(dataParams.params))
} export const ajaxPutData = dataParams => {
return myAjax.put(dataParams.url, qs.stringify(dataParams.params))
} export const ajaxDeleteData = dataParams => {
return myAjax.delete(dataParams.url, { params: dataParams.params })
} /**
* 统一定义JSON类型请求context-type(application/json)
*
*/ export const ajaxGetJsonData = dataParams => {
return myAjax({ url: dataParams.url, method: 'get', params: dataParams.params, data: dataParams.dataBody, headers: { 'Content-Type': 'application/json' } })
} export const ajaxPostJsonData = dataParams => {
return myAjax({ url: dataParams.url, method: 'post', params: dataParams.params, data: dataParams.dataBody, headers: { 'Content-Type': 'application/json' } })
} export const ajaxPutJsonData = dataParams => {
return myAjax({ url: dataParams.url, method: 'put', params: dataParams.params, data: dataParams.dataBody, headers: { 'Content-Type': 'application/json' } })
} export const ajaxDeleteJsonData = dataParams => {
return myAjax({ url: dataParams.url, method: 'delete', params: dataParams.params, data: dataParams.dataBody, headers: { 'Content-Type': 'application/json' } })
} /**
* 统一定义JSON类型请求context-type(multipart/form-data)
*
*/ export const ajaxPostFormData = (dataParams) => {
return myAjax.post(dataParams.url, dataParams.params, { headers: { 'Content-Type': 'multipart/form-data' } })
} /**
* 全部请求拦截器处理
*/
myAjax.interceptors.request.use(function (config) {
/**
* 统一封装tokenId信息
*/
var LoginUser = 'test'
if (LoginUser != undefined) {
if (config.params == undefined) {
config.params = new Object()
}
// console.log('config.params.tokenId=LoginUser.tokenId;',config.params.tokenId=LoginUser.tokenId)
config.params.tokenId = 'tockeid'
}
return config
},
function (error) { return Promise.reject(error) }
) myAjax.interceptors.response.use(
response => {
if (response.status) {
if (response.status == 200) {
return response
} else {
return Promise.reject({ status: response.status, response: { data: response.data.err || '请求失败!' } })
}
} else {
return response
}
},
error => {
//后端挂掉或者跨域时候时候返回
if (!error || !error.response) {
return Notification.error({title: '提示', message: '网络或请求异常,请稍后再试!',offset:100})
}
// 如果返回错误统一处理 后端错误时候返回错误信息
Notification.error({title: '失败', message: error.response.data, type: 'error',offset:100})
//return Promise.reject({ response: { data: '请求失败2!' } }) // 返回接口返回的错误信息
})

  以上拦截器还可以进行更加细致的封装,前提是需要和后端同学协商好接口返回状态码。

三,导航的封装

如果做后台管理应用,导航会要求后端返回数据。于是最好单独拿出导航数据,封装成一个单独的部分。举例基于element-ui做的一个封装实例

//配置导航
const router = [{
name: '默认页',
type: "nav",
children: [{
name: '选项1',
url: '/page1',
type: "menu"
}]
}, {
name: '我的页面',
url: '',
type: "nav",
children: [{
name: '选项1',
url: '/app/list',
type: "menu"
}, {
name: '选项2',
url: '/app/app-edit',
type: "menu"
}]
}, {
name: '我的页面2',
url: '',
type: "nav",
children: [{
name: '选项1',
url: '/query/index',
type: "menu"
}]
}] export default router

四,全局组件注册 全局组件避免了单独注册,同时是开发组件库的基础

// 全局组件配置文件
import Header from './Header'
import Common from './Common'
const components = {
Header,
Common
} const install = function(Vue){
if (install.installed) return;
Object.keys(components).forEach(key=>{
Vue.component(key,components[key])
})
} if (typeof window !=="undefined" && window.vue) {
install(window.vue)
} const component = {
install
} export default component

  注意:在入口文件引入之后,然后use

import Vue from 'vue'
import component from './components' //注册全局组件
Vue.use(component)

五,src目录结构

最后,还有其他一些可以提前完成的:错误页面跳转,登录系统接入等。

vue单页面项目架构方案的更多相关文章

  1. 大型vue单页面项目优化总结

    这是之前在公司oa项目优化时罗列的优化点,基本都已经完成,当时花了点心思整理的,保存在这里,方便以后其他项目用到查漏补缺. 1.打包文件中的app.js文件放入cdn,加快页面首次加载速度 2.提取公 ...

  2. vue单页面项目返回上一页无效,链接变化了,但是页面没有变化

    在最近的项目中,返回上一页没有效果,经过好久的排查才发现问题,是路由守卫写法不规范导致. 在项目中用路由守卫做了登录拦截,没登录的跳转到登录页面.页面跳转和拦截都没问题,但是返回上一页就不行了,也没有 ...

  3. vue单页面项目中解决安卓4.4版本不兼容的问题

    1.cnpm安装 cnpm i babel-polyfill --save cnpm i es6-promise --save 2.main.js引入 import ‘babel-polyfill‘ ...

  4. Vue单页面骨架屏实践

    github 地址: VV-UI/VV-UI 演示地址: vv-ui 文档地址:skeleton 关于骨架屏介绍 骨架屏的作用主要是在网络请求较慢时,提供基础占位,当数据加载完成,恢复数据展示.这样给 ...

  5. 处理 Vue 单页面应用 SEO 的另一种思路

    vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plu ...

  6. vue单页面打包文件大?首次加载慢?按需加载?是你打开方式不对

    部署各vue项目,走了一遍坑.... vue单页面应用刷新404 找到nginx多网站配置文件:类似nginx/sites-available/www.baidu.com server { liste ...

  7. [转] 2017-11-20 发布 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新

    目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...

  8. VUE2 第六天学习--- vue单文件项目构建

    阅读目录 VUE2 第六天学习--- vue单文件项目构建 回到顶部 VUE2 第六天学习--- vue单文件项目构建 VUE单文件组件在Vue项目中,然后使用 new Vue({el: '#cont ...

  9. 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新

    目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...

随机推荐

  1. 配置Hadoop,hive,spark,hbase ————待整理

    五一一天在家搭建好了集群,要上班了来不及整理,待下周周末有时间好好整理整理一个完整的搭建hadoop生态圈的集群的系列 若出现license information(license not accep ...

  2. 台式机电脑u盘启动识别不到U盘设置

    U盘作为一个引导盘,在装机过程中显得十分的方便,有时候我们可以将U盘做成一个PE启动盘,有时我们也可以直接将U盘做成一个操作系统光盘的镜像. 但是有时候我们辛辛苦苦将U盘做成了引导盘了,关机---&g ...

  3. javascript中如何判断数组是数组

    if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === ...

  4. java线程基础巩固---线程间通信快速入门,使用wait和notify进行线程间的数据通信

    之前已经对于线程同步相关的知识点进行了详细的学习,这次来学习一下线程间的通信相关的知识,话不多说直接用代码进行演练,以一个简陋的生产者消费者模型来初步了解下线程间通信是怎么一回事. 生产消费者第一版: ...

  5. 单元测试框架之unittest(三)

    一.摘要 前边的文章我们看到执行测试用例的是通过调用unittest.mian()函数,它会将模块的测试用例收集起来并执行,然而当我们的测试用例增多了以后,这样的执行非常不灵活而且没有效率,我们更愿意 ...

  6. [转]python3 跨目录模块调用,你真的懂了吗?

    小伙伴们,你们有遇到过调用自己写的模块(跨目录模块调用),提示你ImportError:No module named ...的情况,如果有,而且到现在还没有搞明白的,我想说,你今天看对文章了. 这篇 ...

  7. python_datetime模块和time模块

    1.datetime模块 获取当前时间: import datetime # 获取当前时间 ctime = datetime.datetime.now() print(ctime) 只显示:年-月-日 ...

  8. Excle导出优化(poi)

    搜索词条 1.idea报java.lang.OutOfMemoryError: Java heap space怎么解决? 2.java.lang.OutOfMemoryError: GC overhe ...

  9. Python sleep()函数用法:线程睡眠

    如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用 time 模块的 sleep(secs) 函数来实现.该函数可指定一个 secs 参数,用于指定线程阻塞多少秒. 当前线程调用 ...

  10. map填充bean赋值,包括父类全部填充。

    有不少工具类给bean填充值.但是填充,很多都是只能填充到当前类的对象.经过需求修改,做了个工具类: import java.lang.reflect.Field; import java.lang. ...