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请求,向服务器获取数据.不刷新特指当进入此 ...
随机推荐
- KVM之配置桥接网卡
配置桥接网卡 添加桥接网卡br0,注释掉已有的eth0配置 [root@ubuntu01 ~]# vi /etc/network/interfaces # This file describes th ...
- Kubernetes 的 Client Libraries 的使用
说明 kubernetes 估计会成为 linux 一样的存在,client-go 是它的 go sdk,client-go/examples/ 给出了一些用例,但是数量比较少. api Resour ...
- 开源框架---通过Bazel编译使用tensorflow c++ API 记录
开源框架---通过Bazel编译使用tensorflow c++ API 记录 tensorflow python API,在python中借用pip安装tensorflow,真的很方便,几句指令就完 ...
- 系统---《windows + ubuntu双系统》
安装 Windows + Ubuntu双系统 不是第一次安装 Windows + Ubuntu双系统了,每一遇见的问题都不一样,收获也不一样. 制作U盘的部分截图: 电脑的基本配置截图:
- 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)
牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
- MySql忘记密码了咋办
对内 忘记密码终端修改操作: #停止mysql服务 sudo /opt/lampp/lampp stopmysql #参数启动mysqld sudo /opt/lampp/sbin/mysqld -- ...
- 操作系统-chapter1
课程:https://mooc.study.163.com/learn/1000002004?tid=2402971010&_trace_c_p_k2_=f79694c7fc04429bb9b ...
- 【JUC系列第一篇】-Volatile关键字及内存可见性
作者:毕来生 微信:878799579 什么是JUC? JUC全称 java.util.concurrent 是在并发编程中很常用的实用工具类 2.Volatile关键字 1.如果一个变量被volat ...
- redis使用例子
package test.iafclub.redis; import java.util.ArrayList; import java.util.HashMap; import java.util.I ...
- tap 事件会触发两次问题
因项目中使用 coffeeScript (http://coffee-script.org/),此处记录下用 coffeeScript 语法解决 tap 事件触发两次的问题. 在 id="b ...