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请求,向服务器获取数据.不刷新特指当进入此 ...
随机推荐
- vue中用div的contenteditable属性实现v-for遍历,双向数据绑定的动态表格编辑
1.HTML部分 <tr v-for="(item,index) in customerVisitList2" :key="index"> < ...
- 异常-Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 1, column 596. Encountered: <EOF> after :
1 详细异常 Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at ...
- php首页定向到内页代码
php首页定向到内页代码,index.php头部加上以下代码, /afish-c-1/换成内页链接即可. if($_SERVER["REQUEST_URI"]=='/' || $_ ...
- [ 转载 ] vue.js面试题一
转载自:https://www.cnblogs.com/aimeeblogs/p/9501490.html 如有侵权 联系删除 Vue.js面试题整理 一.什么是MVVM? MVVM是Model-Vi ...
- C#百度api 根据经纬度获取地址
public string GetAddress(string lat, string lng) { try { string res = ""; string url = @&q ...
- Codeforces Round #429 (Div. 2/Div. 1) [ A/_. Generous Kefa ] [ B/_. Godsend ] [ C/A. Leha and Function ] [ D/B. Leha and another game about graph ] [ E/C. On the Bench ] [ _/D. Destiny ]
PROBLEM A/_ - Generous Kefa 题 OvO http://codeforces.com/contest/841/problem/A cf 841a 解 只要不存在某个字母,它的 ...
- pyecharts v1 版本 学习笔记 折线图,面积图
折线图 折线图 基本demo import pyecharts.options as opts from pyecharts.charts import Line c = ( Line() .add_ ...
- 011_9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表)
#!/bin/bashfor i in `seq 9`do for j in `seq $i` do echo -n "$i*$j=$[i*j] &q ...
- 富文本编辑器复制word
这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用 后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下) ...
- [Luogu] 消息扩散
https://www.luogu.org/problemnew/show/2002 Tarjan 缩点 + 入度判断 #include <iostream> #include <c ...