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请求,向服务器获取数据.不刷新特指当进入此 ...
随机推荐
- window service 批处理安装/卸载命令
开启服务 @echo.服务启动...... @echo off @sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32sr ...
- SpringCloud之Zuul网关原理及其配置
Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...
- 5.管道 Pipe
/*管道(Pipe)*/ Java NIO 管道是 /*2 个线程*/ 之间的 /*单向*/数据连接 Pipe 有一个 source 通道 和 一个 sink 通道.数据会被写到 sink 通道,从s ...
- burpsuite暴力破解dvwa的登录密码
前提准备条件: 1.下载安装dvwa,下载链接地址:http://www.dvwa.co.uk/. 2.安装php+mysql环境,我用的是这个软件(phpStudy)下载地址:https://www ...
- sqlAlchemy搭建sqliteOrm
一:引入文件 from sqlalchemy import Column, Integer, VARCHAR, Text from sqlalchemy import create_engine fr ...
- Computer Vision_18_Image Stitching:Automatic Panoramic Image Stitching using Invariant Features——2007
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- PAT Basic 1078 字符串压缩与解压 (20 分)
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...
- git rev-list 按照时间来列出两个 commit id 之间的相差数
git rev-list 按照时间来列出两个 commit id 之间的相差数 git rev-list: Lists commit objects in reverse chronological ...
- [ 转载 ] Java基础
1.String a = “123”; String b = “123”; a==b的结果是什么? 这包含了内存,String存储方式等诸多知识点.ans:同样序列的字符串直接量为一个实例,所以其实引 ...
- [转载]Java 应用性能调优实践
Java 应用性能调优实践 Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具 ...