前言:

  18年年底,就一个字,忙,貌似一到年底哪个公司都在冲业绩,包括我们自己开发自己公司的项目也一样得加把劲。自从18年年初立了个flag17年年终总结——走过2017,迎来2018Flag到现在又一年了。想想当时立的flag还是很多没有完成到,说的第一点就没有完成了(ps:这确实不能怪我,真的忙),健身也是落下了,而node.js的呢还在进程中,说不定稍后会出了系列的文章(ps:当然不会像之前那几篇那样,感觉写得有点云里雾里的)。当然,今天的重点不是说这些,而是我在vue项目上实践的一些小汇总和踩坑指南。另,结尾有福利喔~~~

正文:

  这一年前前后后大概做了有四个vue相关的项目(ps:vue-cli脚手架搭建),其中包括两个移动端和两个管理后台的(ps:有一个管理端还在进行中),其中不免遇到了不少坑,还有不少的总结。

  vue-cli开发相关

  一、一般的vue-cli src的项目骨架:

├── App.vue
├── main.js
├── permission.js
├── router
│ └── index.js
├── api
│ └── index.js
│ └── xx.js
├── assets
│ ├── images
│ ├── flexible.js
│ └── common
│ └── common.less
│ └── mixin.less
├── components
├── utils
├── store
│ ├── index.js
│ └── xxStore.js
└── views
├── index.vue
└── xx.vue

  对vue-cli有了解的应该知道一般我们的源码就写在src文件夹下面。其中App.vue就是根组件,其他的组件我们就可以通过App.vue的

<router-view/>渲染;main.js就是入口文件,一般用于引入通用组件,UI框架,router,axios,store挂载等;permission.js则用于在路由渲染先后需要设置的权限之类的;components则为通用组件的封装;utils则为通用的方法的封装;api则为通用api的封装调用等。

  例如:main.js

import 'babel-polyfill'
import Vue from 'vue'
import Es6Promise from 'es6-promise'
require('es6-promise').polyfill()
Es6Promise.polyfill()
import App from './App'
import './assets/flexible'
import axios from 'axios'
import router from './router'
import store from './store'
import './permission'
import {WechatPlugin,LoadingPlugin,ToastPlugin,AlertPlugin,ConfirmPlugin } from 'vux'
import VueLazyload from 'vue-lazyload' //挂载axios
Vue.prototype.axios=axios //配置微信jssdk,通过Vue.wechat直接访问wx
Vue.config.productionTip = false
Vue.use(WechatPlugin)
Vue.use(LoadingPlugin)
Vue.use(ToastPlugin)
Vue.use(AlertPlugin)
Vue.use(ConfirmPlugin)
Vue.use(VueLazyload,{
error:require('./assets/images/activity_default_loading.png'),
loading:require('./assets/images/activity_default_loading.png')
}) /* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})

  二、axios api接口的统一封装

  现在的vue-cli开发,一般都是使用axios进行接口请求,其中一大好处就是可以进行请求和响应的拦截,进而进行一些通用的配置,所以能很好的做到了接口的封装。

  例如:request.js

import axios from 'axios'
import { AlertModule } from 'vux' // 创建axios实例
const service = axios.create({
//baseURL: process.env.ENV_CONFIG=='dev'?'/api':'', // api的base_url
baseURL: process.env.ENV_CONFIG=='dev'?'/api':process.env.BASE_API,
//timeout: 10000, // 请求超时时间
headers:{ }
}) // request拦截器
service.interceptors.request.use(
config => {
if( config.method === 'post' ){
config.data.http_headers={ }
}
return config
},
error => {
// Do something with request error
// for debug
console.log(error)
Promise.reject(error)
}
) // respone拦截器
service.interceptors.response.use(
response => {
if (response.data.result && response.data.result==='failed') {
AlertModule.show({
title:'提示',
content:response.data.text,
/*onHide () {
router.push({
name:'index'
})
}*/
})
return
}
else{
return response.data
}
},
error => {
console.log('err' + error) // for debug
/*AlertModule.show({
title:'斑马提示',
content:'链接超时,请重新尝试',
})*/
return Promise.reject(error)
}
) export default service

  之后,我们就可以通过api目录暴露封装的接口调用

import request from '@/utils/request'

export function doXx(data) {
return request({
url:'/xx',
method:'post',
data
})
}

  三、axios 请求不同数据格式的处理及表单提交处理

  看axios文档我们可以了解到,axios的其中一个特点就是将数据转换成json格式,但是有些接口由于历史等原因后台不方便调整的话,就需要前端做些处理了。

  例如,以formdata格式提交参数则可以通过axios内置的qs模块进行data的格式转换,然后设置请求头即可

export function XXRequest(data) {
return request({
transformRequest: [function(data) { //在请求之前对data传参进行格式转换
data = qs.stringify(data)
return data
}],
url:'/xx.do',
method:'post',
data,
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
}

  又例如,后台返回一个form表单,需要前端提交form表单,则需要,通过路由的resolve对象,this.$router.resolve解析接口回调参数并且打开空白页面并提交form表单

// res为回调参数
let routerData = this.$router.resolve({name:'apply',query:{htmls:res}})
window.open(routerData.href,'_ blank')
const div = document.createElement('div')
div.innerHTML = res
document.body.appendChild(div)
document.forms [0] .submit() apply.vue做法
<template>
<div v-html ="apply">
   {{apply}}
</div>
</template> <script>
export default {
name:'apply',
data(){
return {
apply:''
}
},
mounted(){
let form = this.$route.query.htmls
this.apply = form
this.$nextTick(()=> {
document.forms [0].submit()
})
}
}
</script>

  四、引入css预处理器less

npm install less less-loader --save

修改webpack.base.conf.js rules
{
test: /\.less$/,
loader: "style-loader!css-loader!less-loader",
}

  五、es6在低版本及IE下的不兼容

  部分低版本的手机或者IE下是不兼容es6中的promise的,如果用到了promise语法的话,就需要进行es6编译es5,所以做法需要引入

es6-promise并且在main.js中引入

npm install es6-promise --save

main.js中引入
import Es6Promise from 'es6-promise'
require('es6-promise').polyfill()
Es6Promise.polyfill()

  六、ico调整

  一般的ico都是设置在项目根目录下,然后调整build webpack.dev.conf.js和webpack.prod.conf.js中的new HtmlWebpackPlugin设置参数

favicon:path.resolve(__dirname,'xx.ico')即可。

  七、常用组件的引入

  一般常用的vue组件的引入,例如vue-lazyload、vue-scroller等一般可以上npm查看相关是使用方法即可。

  vue-cli单页面部署相关

  一、build路径问题

  一般项目都会部署到端口的某个文件夹下面,所以需要修改config index.js的assetsPublicPath路径

 index: path.resolve(__dirname, '../文件夹名/index.html'),

assetsRoot: path.resolve(__dirname, '../文件夹名'),
assetsSubDirectory: 'static',
assetsPublicPath: './', // ./为相对文件夹路径,否则/为根目录

  二、部署到Nginx上

  由于打包完后的是静态文件,所以我们可以直接部署到Nginx上面,接口通过Nginx代理即可。但是刷新会丢失404,所以需要做个重定向即可。

location /{
root dist;
index index.html;
try_files $uri $uri/ /dist/index.html;
}

  三、部署到Tomcat上

  部署到Tomcat上的话,一样存在刷新丢失的情况,我看有人提出配置web.xml进行404重定向,这个我司也是有实践了下

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>xxx</display-name> <error-page>
<error-code>404</error-code>
<location>/index.html</location>
</error-page>
</web-app>

  但是,这样部署的话其实是第一次刷新ok的,但是再次刷新则还是404丢失。(ps:在移动设备上会,有知道的大佬可以留言喔~)

总结:

  其中,有了解过vue-cli开发的话,其实用vue开发在业务逻辑上是没有太大的问题的,因为很多大佬已经开发出各种组件供我们调用了,我呢,就在部署上面卡了很久,因为最初的想法是部署到Tomcat上的,所以一直尝试都没有成功,最初的原因的就是使用了es6的promise,然后呢又了解到了需要配置重定向xml。最后以为大功告成,还是存在二次刷新丢失的问题。所以部署到了Nginx上,然后设置重新定这样子解决。

  另,其中还有很多可能没有总结到位,到时有补充的会补充在这里~

  再另,附福利

  winter大大,前手机淘宝前端负责人在极客时间上发了《重学前端》的课程,扫我的二维码报名的话可以找我分奖励喔,另外通过我二维码报名的加我wx:UEMtQWFyb24= (ps:base64转码)可得vue教程一套。嘻嘻

vue开发小结(上)的更多相关文章

  1. vue开发小结(下)

    前言 继前几天总结了vue开发小结(上)后,发现还有很多的点没有能列举出来,于是还是打算新建一个下篇,再补充一些vue开发中需要注意的细节,确实还是都是细节的问题,我只是在这里强调下,希望对大家有帮助 ...

  2. vue开发后台管理系统小结

    最近工作需要用vue开发了后台管理系统,由于是第一次开发后台管理系统,中间也遇到了一些坑,想在这里做个总结,也算是对于自己工作的一个肯定.我们金融性质的网站所以就不将代码贴出来哈 一.项目概述 首先工 ...

  3. 03 . Gin+Vue开发一个线上外卖应用(用户数据创建,插入,跨域处理)

    功能和背景介绍 在项目的登录功能中,如果在登录时发现用户名和密码在用户表中不存在,会自动将用户名和密码保存在用户表中,创建一个新的用户. 因此,除了使用手机号和验证码登录以外,还支持使用用户名.密码进 ...

  4. vue开发体验

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. vue开发环境搭建及热更新

    写这篇博客的目的是让广大的学者在初入Vue项目的时候少走些弯路,虽然现在有很多博客也有差不多的内容,但是博主在里面添加了一些学习时碰到的小问题.在阅读这篇博客之前,我先给大家推荐一篇文章<入门W ...

  6. 用vue开发一个app(4,一个久等了的文章)H5直播平台登录注册(1)

    我上一篇关于vue的文章和这一篇时间隔了有点久了.最近终于写完了. 因为我一直想写个有点实绩的东西,而不是随便写一个教程一样东西.结合最近在项目中学到的经验和我的一点创意. 首先介绍下这是个什么! H ...

  7. 使用vue开发项目需要注意的问题和可能踩到的坑

    最近,在公司给一些刚刚使用vue进行开发的同学做了一次分享, 其中包括一些vue开发中需要注意的点, 以及一些可能会踩到的坑.具体内容如下: 一.生命钩子使用需要注意的地方 1.beforeCreat ...

  8. vue开发项目详细教程(第一篇 搭建环境篇)

    最近做vue做项目碰到了不少坑,看了三天文档便开始上手做项目了,不是我牛b,是因为项目紧,我没有时间去深入学习,所以只能一边学一边做了. 我要做的项目是一个官方网站(包括管理后台),也因为是我第一次使 ...

  9. 从零开始搭建vue开发环境及构建vue项目

    1.安装node.js 安装完成之后,打开dos(windows+R或者直接windows键打开,输入cmd,按回车键)窗口,输入命令node -v可以查看安装的 node.js版本 node.js自 ...

随机推荐

  1. mybatis学习系列一(mybatis简介/使用)

    1mybatis简介(1) 1.1工具:jbbc,jdbctemplate 功能简单,sql语句编写在java代码里面,硬编码高耦合的方式 1.2 框架:整体解决方案 1.2.1 Hibernate: ...

  2. tkinter中combobox下拉选择控件(九)

    combobox控件,下拉菜单控件 combobox控件在tkinter中的ttk下 简单的实现下: import tkinter from tkinter import ttk # 导入ttk模块, ...

  3. tkinter学习系列之(五)Checkbutton控件

    目录 目录 前言 (一)基本属性 (二)案例 1.简单的复选框 2.组合复选框 目录 前言 复选框:可以同时多选的一组框,其只有两种状态,选中与未选中. (一)基本属性 (1)说明: tkinter里 ...

  4. SAP SQVI 快速浏览器

    SQVI可向SQL一样连接多个表浏览数据. 1.输入T-CODE:SQVI. 2.新建一个新查询case 输入CASE 名.点击新建,在弹出的窗口中输入标题,在数据源中可选择单个表查询,或者选择表连接 ...

  5. The resource configuration is not modifiable in this context.

    项目中使用了Jersey RESTful 框架, 更新代码后服务能正常起来, 在页面登录时验证码不显示 后台报错 java.lang.IllegalStateException: The resour ...

  6. <项目需求规格说明书> - 福大易宝

    福大易宝-<项目需求规格说明书> 流程 在开会时统一了项目的开发背景,具体功能,然后在同一个工作环境下进行该说明书的编写. 分工 1.李佳铭.杜宏庆共同负责引言和项目描述的内容. 2.刘双 ...

  7. Springboot 使用 RestTemplate

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code spring web 项目提供的RestTemplate,使java访问url更方便, ...

  8. js中Math之random,round,ceil,floor的用法总结

    1.Math.random(); 结果为0-1间的一个随机数(包括0,不包括1) 2.Math.floor(num); 参数num为一个数值,函数结果为num的整数部分(返回小于等于n的最大整数). ...

  9. 使用python制作时间戳转换工具

    使用python制作时间戳转换工具 python 时间戳转日期 日期转时间戳 前言:作为一个程序员一般情况下,json和时间戳是常用的两个工具,我咨询过很多个朋友,他们一般都是通过在线工具对json进 ...

  10. ORB-SLAM2(1) Linux下配置和编译

    ORB-SLAM2 官网:https://github.com/raulmur/ORB_SLAM2 配置教程:http://blog.csdn.net/zzlyw/article/details/54 ...