0前端开发经验,初次接触Vue,从后端到前端,从开发、打包到部署,完整的历程。
首先粗略通读了一遍官方文档,动手用webpack搭建了一个简单的demo。
看了Echarts的官方demo,了解了几种数据图表的数据结构。因为我要做的项目就是要将后端接口的数据拿到,然后图形化的形式展示出来。
对接后端,进行axios二次开发
在构建应用时需要访问一个 API 并展示其数据,调研Vue的多种方式后选择了官方推荐的axiox。
从ajax到fetch、axios
前端是个发展迅速的领域,前端请求自然也发展迅速,从原生的XHR到jquery ajax,再到现在的axios和fetch。
jquery ajax
1 | $.ajax({ |
它是对原生XHR的封装,还支持JSONP,非常方便;真的是用过的都说好。但是随着react,vue等前端框架的兴起,jquery早已不复当年之勇。很多情况下我们只需要使用ajax,但是却需要引入整个jquery,这非常的不合理,于是便有了fetch的解决方案。
fetch
fetch号称是ajax的替代品,它的API是基于Promise设计的,旧版本的浏览器不支持Promise,需要使用polyfill es6-promise
举个例子:
1 | // 原生XHR |
看起来好像是方便点,then链就像之前熟悉的callback。
在MDN上,讲到它跟jquery ajax的区别,这也是fetch很奇怪的地方:
当接收到一个代表错误的 HTTP 状态码时,从 fetch()返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ), 仅当网络故障时或请求被阻止时,才会标记为 reject。 默认情况下, fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于用户 session,则会导致未经认证的请求(要发送 cookies,必须设置 credentials 选项).
突然感觉这还不如jquery ajax好用呢?别急,再搭配上async/await将会让我们的异步代码更加优雅:
1 | async function test() { |
看起来是不是像同步代码一样?简直完美!好吧,其实并不完美,async/await是ES7的API,目前还在试验阶段,还需要我们使用babel进行转译成ES5代码。
还要提一下的是,fetch是比较底层的API,很多情况下都需要我们再次封装。 比如:
1 | // jquery ajax |
由于fetch是比较底层的API,所以需要我们手动将参数拼接成’name=test’的格式,而jquery ajax已经封装好了。所以fetch并不是开箱即用的。
另外,fetch还不支持超时控制。
哎呀,感觉fetch好垃圾啊,,还需要继续成长。。
axios
axios是尤雨溪大神推荐使用的,它也是对原生XHR的封装。它有以下几大特性:
- 可以在node.js中使用
- 提供了并发请求的接口
- 支持Promise API
简单使用
1 | axios({ |
并发请求,官方的并发例子:
1 | function getUserAccount() { |
axios体积比较小,也没有上面fetch的各种问题,我认为是当前最好的请求方式
详情参考官方文档
#二次封装axios
首先创建一个request.js,内容如下:
1 | import axios from 'axios'; |
创建一个api.js,存放后端的接口:
1 | //导入上面的request模块 |
在.vue文件中使用定义的方法,获取后端接口的数据:
1 | export default { |
开发环境配置跨域
为了更方便地与后台联调,需要在用vue脚手架创建地项目中,在config目录地index.js设置proxytable来实现跨域请求,具体代码如下:
1 | module.exports = { |
vue 项目打包部署,通过nginx 解决跨域问题
最近将公司vue 项目打包部署服务器时,产生了一点小插曲,开发环境中配置的跨域在将项目打包为静态文件时是没有用的 ,就想到了用 nginx 通过反向代理的方式解决这个问题,但是其中有一个巨大的坑,后面会讲到。
前提条件
liunx 下 nginx 安装配置(将不做多的阐述,请自行百度)
配置nginx
- 通过 Xshell 连接 liunx 服务器 ,打开 nginx.conf 配置文件,或通过 WinSCP 直接打开并编辑nginx.conf文件 ,这里我选择后者 。(具体配置文件的路径根据你安装时决定)
- 在配置文件中新增一个server
1 | # 新增的服务 |
- 解释说明
/var/www是我当前将vue 文件打包后存放在 liunx下的路径 ,
当我们启动 nginx 后 就可以通过http://ip地址:8086/访问到vue 打包的静态文件。
2.location /v1 指拦截以
v1开头的请求,http请求格式为
http://ip地址:8086/v1/***`,这里有一个坑!一定要按照上面的配置文件**:proxy_pass http://47.106.184.89:9010/v1; # 代理接口地址,如果你像我一开始写的proxy_pass http://47.106.184.89:9010/; # 代理接口地址**,你永远也匹配不到对应的接口!。
proxy_pass http://47.106.197.89:9093/v1;` 当拦截到需要处理的请求时,将拦截请求代理到的 接口地址。
webpack打包
下面是config/index.js配置文件
1 | // see http://vuejs-templates.github.io/webpack for documentation. |
Dockerfile
打包Docker镜像
1 | FROM Nginx:base |
后记
这是首次接触前端的第一个项目,期间经历了从后端接口开发,前端框架选型(一度想要用react,后来还是放弃),熟悉Vue,到组件开发,webpack构建,Nginx部署,Docker发布的完整过程。虽然页面比较简单,但是期间的采坑无数,后面还要继续努力!