欢迎来到小懒的博客~email:568705236@qq.com

亲自尝试vue代理

2020/9/27 16:03:41站长

    最近看见很多人在搞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

    一跑,再次展示我无知的时候。

image.png

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

npm run serve

 image.png

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


image.png

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

//vue.config.js
module.exports = {
	
	publicPath:  './' ,
	devServer:{
		port: 8123
	}
};

    再重新构建和运行服务器。

image.png

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

image.png

    一切正常,现在就可以进行下一步,代理了。根据官方文档指引,再在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,我保存文件就自动重新编译了。同时网页也自动刷新了,开启控制台,点点按钮。

image.png

    貌似写错了请求,修改一下

//app.vue
this.axios.get({
			url:"/api/data.json"			
		}).then(function(res){
			console.log(res);
		});

image.png

    还是出错,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后面追加一行引入。

    再次点击按钮。

image.png

    看来请求语句还是写错了。原来用get就第一个参数是地址,第二个参数是请求的额外参数,还是按第一次写的,请求方法放在参数里面

axios({
			method:"GET",
			url:"/api/data.json"			
		}).then(function(res){
			console.log(res);
		});

image.png

image.png

    请求路径对了,但是返回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"
      			}
    		}
	}
};

    重启

image.png

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

上一篇:layui code的使用

下一篇:今日笔记

赞赏