最近看见很多人在搞vue代理,作为实践派的我也来亲手尝试,首先去寻找相关文章,vue代理靠的是node的一个组件。那就直接用开发环境开干。首先百度一下node的服务器搭建,发现是直接写命令调用node的库。这和记忆中的运行有些出入,回想一下一起看见的一些错误,是端口被占用,那么应该是编译js后就直接运行服务器的。再去百度一下vue server,看见文章使用的是webpack 命令中运行server了,那估计就是webpack已经封装了一个静态服务器命令了。但我现在的测试开发项目是用vue cli构建的,这个不合适。再百度一下。这次去到vue cli service官网看,哦,同样有server,还有相关参数,“vue-cli-service serve 命令会启动一个开发服务器 (基于 webpack-dev-server) 并附带开箱即用的模块热重载 (Hot-Module-Replacement)。”,可以可以原来是在别人的基础上再利用,马上在项目根目录执行一波命令。我这里是windows,linux不熟就没搞。
vue-cli-service serve --port 8123
一跑,再次展示我无知的时候。

理论上是放package.json文件中的。打开package.json,我去,原来已经写了serve的,只是我没调用而已,现在加上个指定端口,执行真正的命令
npm run serve

8080端口,我擦,不对呀,难道我的端口没写正确?再看文档,

这是默认值了,我指定的8123没生效。那就应该不是写在命令行(后面发现是我自己没保存文件-_-),而是配置文件了。再认真看了下文档,“除了通过命令行参数,你也可以使用 vue.config.js 里的 devServer 字段配置开发服务器”。那删掉package.json中刚刚添加的参数,再去config中设置下。
//vue.config.js
module.exports = {
publicPath: './' ,
devServer:{
port: 8123
}
}; 再重新构建和运行服务器。

这样就符合我的想法了。访问127.0.0.1:8123看看。

一切正常,现在就可以进行下一步,代理了。根据官方文档指引,再在config上修改下。
//vue.config.js
module.exports = {
publicPath: './' ,
devServer:{
port: 8123,
proxy: {
'/api': {
target: 'http://127.0.0.1/api/',
ws: true,
changeOrigin: true
}
}
}
}; 我的开发环境80端口是IIS使用了,在目录下api/data.json文件用作测试代理请求。那么再在项目上添加一个请求的方法。不过作为一个只用过JQ的人,vue里面不想用原生js发送异步请求还是要百度一下。先引入axios。
npm install axios -S
添加请求,写法和JQ的ajax差不多。
//main.js
...
import axios from 'axios';
...
new Vue({
render: h => h(App),
router:router, //增加router对象
store:store, //增加store对象
axios:axios //增加axios
}).$mount('#app');//app.vue
<template>
<div id="app">
<div>这是计数{{count}}</div>
<p>
<!-- 使用 router-link 组件来导航. -->
<!-- 通过传入 `to` 属性指定链接. -->
<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld ref="hw" msg="Welcome to Your Vue.js App" :studyInfo="studyInfo" :question="question" :checkstr="checkstr" @update:checkstr="checkstr = $event"/>
<div>
<div>这里是父控件 </div>
<div>checkstr:{{checkstr}}</div>
</div>
<!-- 增加部分 -->
<input type="button" value="代理测试" @click="btC" />
<!-- 结束增加部分 -->
</div>
</template>
<script>
"use strict"
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
components: {
HelloWorld
},
data(){
return {
count:this.$store.state.count, //赋予计数器的值
//增加3个变量
allquestionlist:{
"page_1":[{
content:[
{id:1,check:true},
{id:2,check:false},
{id:3,check:false}
]
}]
},
studyInfo:{
now_page:1
},
question:{
index:0,
content:[
{id:1,name:"选项1"},
{id:2,name:"选项2"},
{id:3,name:"选项3"}
]
},
checkstr:'未选中'
};
},
methods:{
btC(){
//测试请求
this.axios({
method:"GET",
url:"/api/data.json"
}).then(function(res){
console.log(res);
});
}
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>开启了serve,我保存文件就自动重新编译了。同时网页也自动刷新了,开启控制台,点点按钮。

貌似写错了请求,修改一下
//app.vue
this.axios.get({
url:"/api/data.json"
}).then(function(res){
console.log(res);
});
还是出错,axios是空对象,去调下bug。去axios的官网一看,还需要引入vue-axios。或者在需要的vue页面中直接import。我就选择每个页面都import一次,那么,删除main.js添加的内容,app.vue增加imoprt。
//main.js
...
//import axios from 'axios';
...
new Vue({
render: h => h(App),
router:router, //增加router对象
store:store, //增加store对象
//axios:axios //增加axios
}).$mount('#app');//app.vue import HelloWorld from './components/HelloWorld.vue'; import axios from 'axios';//在helloworld后面追加一行引入。
再次点击按钮。

看来请求语句还是写错了。原来用get就第一个参数是地址,第二个参数是请求的额外参数,还是按第一次写的,请求方法放在参数里面
axios({
method:"GET",
url:"/api/data.json"
}).then(function(res){
console.log(res);
});

请求路径对了,但是返回404,这就需要去看看代理了。需要往代理增加日志方便查找问题。修改config文件。
//vue.config.js
module.exports = {
publicPath: './' ,
devServer:{
port: 8123,
proxy: {
'/api': {
target: 'http://127.0.0.1',
ws: true,
changeOrigin: true,
logLevel:"debug"
}
}
}
}; 重启

请求正常了,目测修改src里面的文件会自动重新编译,但修改外面的文件需要重启服务器。
