Vue2跨域配置打包上线流程

611 阅读5分钟

Vue2跨域配置打包上线流程

一、Vue项目配置跨域问题

(1)跨域的概念

后端开发的时候,采用微服务来进行开发。

每个开发者都有自己的项目,最后整合在一起进行通信。微服务开发

前端还需要考虑配置跨域问题

跨域:因为浏览器的同源策略(安全策略),导致我们无法在浏览器中访问(协议、端口、ip)不同的服务器

<html>
   <link href="./index.css">
   <img src="./index.js">
<script>
   const baseURL = http://127.0.0.1:3000
   const res = await axios.get(baseURL+"/users/find")
</script>
</html>

获取css代码:http://127.0.0.1:8080/index.css

获取js代码:http://127.0.0.1:8080/index.js

获取用户数据:http://127.0.0.1:3000/users/find

(2)后端配置跨域的思路

后端配置跨域来解决我们前端报错的问题,也是一种主流方案。

var allowCrossDomain = function (req, res, next) {
 // 设置允许跨域访问的请求源(* 表示接受任意域名的请求)   
 res.header("Access-Control-Allow-Origin""*");
 // 设置允许跨域访问的请求头
 res.header("Access-Control-Allow-Headers""X-Requested-With,Origin,Content-Type,Accept,Authorization");
 // 设置允许跨域访问的请求类型
 res.header("Access-Control-Allow-Methods""PUT,POST,GET,DELETE,OPTIONS");
 // 同意 cookie 发送到服务器(如果要发送cookie,Access-Control-Allow-Origin 不能设置为星号)
 res.header('Access-Control-Allow-Credentials''true');
 next();
};
app.use(allowCrossDomain)

后端跨域,前端浏览器就可以直接访问

原理:

  1. 前端浏览器发现跨服务器获取数据的时候。
  2. 浏览器先默认发送一个请求到后端,请求类型options
  3. 当浏览器通过options请求获取到响应一些服务器资源后,
  4. 继续发送你们自己的请求到后端。
  5. 后端就可以返回数据到前端

总结:

  1. 后端 配置跨域,浏览器默认发送两次请求。其中一次options
  2. options请求目的获取后端允许跨域配置。options请求成功后,服务器响应头会将你的配置传递浏览器
  3. 浏览器接受这些信息,继续发送请求给后端,不存在跨域问题

跨域问题只存在于浏览器。H5、WEB

小程序、app不存在跨域问题

前端和后端通信

image-20230705102355278

(3)前端配置跨域

服务器和服务器之间不存在跨域。

需要配置代理服务器。前端服务器中在配置一个代理服务器,将指定的请求通过代理服务器转发给后端服务器获取数据

(1)在vue项目跟目录创建vue.config.js文件

这个文件是vue内置的一个webpack配置文件,你写的配置可以覆盖默认webpack

module.exports = {
   devServer:{
       port:8888,
       //配置代理服务器,webpack内置的
       proxy:{
           //当检测到路径包含了/api 进入代理服务器
           //http://127.0.0.1:4001/api/usersAD/getSearch
            "/api":{
               target:"http://127.0.0.1:4001",
               changeOrigin:true,
               //表达的意思就是将路径中/api,替换成空字符串
               pathRewrite:{
                   '^/api':''
              }
            },
      }
  }
}

(2)代码中修改baseURL

<template>
 <div>
   <h2>注册页面</h2>
   <button @click="fetchData">发送请求</button>
 </div>
 
</template><script>
import axios from "axios"
export default {
 created(){
   console.log("注册组件");
},
 methods:{
   async fetchData(){
     axios.defaults.baseURL = "/api"
     const res = await axios({
       url:"/usersAD/getSearch",
       method:"POST",
       data:{}
    })
     console.log(res);
  }
}
}
</script>

当前端访问地址里面包含了/api的时候,代表先默认访问前端服务器。

前端服务器检测路径有/api进入代理服务器。

代理服务器转发请求指定服务器

前端请求只会发送一次。不存在options验证的过程

代理服务器是webpack提供的。

一旦打包后,你的代码静态资源,没有任何webpack

只限于开发环境,打包后正式的前端服务器运行,上面配置都无效

image-20230705110644326

二、配置环境变量

Vue-CLI提供的配置

访问地址为:cli.vuejs.org/zh/guide/mo…

概念:脚手架工具提供了在不同的环境下,配置不同的参数,不同命令来进行项目加载的时候,读取不同文件

你们很多配置可以不用硬编码在代码中

在项目跟目录下面可以配置.env.[mode]

(1)环境配置文件

项目中情况:

  1. .env:代表了当前项目环境配置
  2. .env.development:开发环境配置
  3. .env.production:配置生产环境
  4. .env.test:配置测试环境

.env.development代码如下

VUE_APP_PROT = 8889
VUE_APP_BASE_URL = "/api"
VUE_APP_TITLE = "woniu"
VUE_APP_SERVER_PATH = "http://127.0.0.1:4001"

环境变量的key必须是VUE_APP开头的。

.env.production 代码如下

VUE_APP_PROT = 9999
VUE_APP_BASE_URL = "/myapis"
VUE_APP_TITLE = "woniu"

(2)在封装请求的时候,将baseURL替换为环境变量

methods:{
   async fetchData(){
     //任何一个地方,获取系统环境变量
     //Nodejs提供一个全局变量 process
     // console.log(process.env);
     axios.defaults.baseURL = process.env.VUE_APP_BASE_URL
     const res = await axios({
       url:"/usersAD/getSearch",
       method:"POST",
       data:{}
    })
     console.log(res);
  }
}

在Node环境下面提供的全局变量process,可以直接使用

(3)在vue.config.js文件配置代理内容

const repacePath = "^"+process.env.VUE_APP_BASE_URL
module.exports = {
   devServer:{
       port:Number(process.env.VUE_APP_PROT),
       //配置代理服务器,webpack内置的
       proxy:{
           //当检测到路径包含了/api 进入代理服务器
           //http://127.0.0.1:4001/api/usersAD/getSearch
          [process.env.VUE_APP_BASE_URL]:{
               target: process.env.VUE_APP_SERVER_PATH,
               changeOrigin:true,
               //表达的意思就是将路径中/api,替换成空字符串
               pathRewrite:{
                  [repacePath]:''
              }
            },
      }
  }
}

根据不同的环境,读取不同配置,进行加载

如果是生产环境npm run build 读取的production配置

三、打包部署

(1)nginx服务器

是一个非常优秀的静态资源服务器。

前端提供的静态资源,nginx在处理静态资源非常高效,

处理并发的能力非常好

nginx并发能达到5万,只是一台服务器。

tomcat服务器,500并发到性能瓶颈。

下载nginx服务器,在你的电脑中启动。就可以访问

conf:里面存放nginx的配置

html:存放的打包静态资源

nginx.exe服务器启动运行文件

(2)前端项目配置好生产环境打包

npm run build

项目目录下面dist目录。

(3)将dist文件夹里面的资源拷贝

将dist里面资源拷贝到nginx服务器html文件夹下面

(4)启动服务器

nginx.exe

你可以在系统进程里面可以看到nginx

(5)浏览器默认访问80端口

127.0.0.1:80

(2)配置nginx的反向代理

前端如果要访问接口,

第一种方式:直接访问后端服务器地址,后端要配置跨域

第二种方式:前端先访问nginx,检测路径有指定符号,通过nginx代理,转发给后端服务器。

在nginx的conf文件夹下面找到nginx.conf

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
		
        #access_log  logs/host.access.log  main;

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

        location /apis/ {
            rewrite ^.+apis/?(.*)$ /$1 break;
            proxy_pass http://127.0.0.1:4001;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
	... 省略后面代码
}

启动项目就可以进行访问了。

四、视频地址

www.bilibili.com/list/324321…