vue单页面项目架构方案
这里的架构方案是基于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单页面项目架构方案的更多相关文章
- 大型vue单页面项目优化总结
这是之前在公司oa项目优化时罗列的优化点,基本都已经完成,当时花了点心思整理的,保存在这里,方便以后其他项目用到查漏补缺. 1.打包文件中的app.js文件放入cdn,加快页面首次加载速度 2.提取公 ...
- vue单页面项目返回上一页无效,链接变化了,但是页面没有变化
在最近的项目中,返回上一页没有效果,经过好久的排查才发现问题,是路由守卫写法不规范导致. 在项目中用路由守卫做了登录拦截,没登录的跳转到登录页面.页面跳转和拦截都没问题,但是返回上一页就不行了,也没有 ...
- vue单页面项目中解决安卓4.4版本不兼容的问题
1.cnpm安装 cnpm i babel-polyfill --save cnpm i es6-promise --save 2.main.js引入 import ‘babel-polyfill‘ ...
- Vue单页面骨架屏实践
github 地址: VV-UI/VV-UI 演示地址: vv-ui 文档地址:skeleton 关于骨架屏介绍 骨架屏的作用主要是在网络请求较慢时,提供基础占位,当数据加载完成,恢复数据展示.这样给 ...
- 处理 Vue 单页面应用 SEO 的另一种思路
vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plu ...
- vue单页面打包文件大?首次加载慢?按需加载?是你打开方式不对
部署各vue项目,走了一遍坑.... vue单页面应用刷新404 找到nginx多网站配置文件:类似nginx/sites-available/www.baidu.com server { liste ...
- [转] 2017-11-20 发布 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新
目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...
- VUE2 第六天学习--- vue单文件项目构建
阅读目录 VUE2 第六天学习--- vue单文件项目构建 回到顶部 VUE2 第六天学习--- vue单文件项目构建 VUE单文件组件在Vue项目中,然后使用 new Vue({el: '#cont ...
- 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新
目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...
随机推荐
- linux串口命令
proc # cat /proc/tty/driver/serial serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 t ...
- ASE19团队项目 beta阶段 model组 scrum3 记录
本次会议于12月4日,19时30分在微软北京西二号楼sky garden召开,持续20分钟. 与会人员:Jiyan He, Lei Chai, Linfeng Qi, Xueqing Wu, Yuto ...
- 干货,阿里P8浅谈对java线程池的理解(面试必备)
线程池的概念 线程池由任务队列和工作线程组成,它可以重用线程来避免线程创建的开销,在任务过多时通过排队避免创建过多线程来减少系统资源消耗和竞争,确保任务有序完成:ThreadPoolExecutor ...
- FreeRTOS时间管理
延时函数 vTaskDelay() 相对延时函数,在文件task.c中定义的,要使用的话宏INCLUDE_vTaskDelay必须设置为1: void vTaskDelay( const TickTy ...
- 利用CodeBlocks结合freeglut快速搭建OpenGL开发环境
利用CodeBlocks结合freeglut快速搭建OpenGL开发环境 2018-12-19 10:15:48 再次超越梦想 阅读数 180更多 分类专栏: 我的开发日记 版权声明:本文为博主原 ...
- pyecharts各省人口GDP可视化分析
版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/82503569 9月9日更:本篇博客数据下载:链接:http ...
- idou老师教你学Istio11 : 如何用Istio实现流量熔断
在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力.今天,将向大家介绍如何用Istio实现流量熔断. 熔断机制是创建弹性微服务应用程序的重要模式.熔断可以帮助您自由控制故障影 ...
- B进制星球(多进制 高精加)
https://www.luogu.org/problemnew/show/P1604 B(2<=B<=36)进制计数.编写实现B进制加法的程序. 输入输出格式 输入格式: 共3行第1行: ...
- Tensorflow2.0学习(一)
站长资讯平台:今天学习一下Tensorflow2.0 的基础 核心库,@tf.function ,可以方便的将动态图的语言,变成静态图,在某种程度上进行计算加速 TensorFlow Lite Ten ...
- 05_centos7安装python3
https://www.cnblogs.com/FZfangzheng/p/7588944.html https://www.cnblogs.com/simuhunluo/p/7704765.html ...