Open AnnGreen1 opened 5 months ago
mp.weixin.qq.com一溪风月 稀土掘金技术社区
❝ 💡Tips:不知道小伙伴在前端开发的时候有没有这样的困惑 ❞
❝
💡Tips:不知道小伙伴在前端开发的时候有没有这样的困惑 ❞
1. 前端项目打包后,我打包过的静态资源是如何访问后端服务的? 2. 访问后端服务的时候难道不存在跨域的问题吗?如何解决的? 3. 假如我想自己简单修改下部署后的目录该如何去做?
其实不仅仅是你会有这样的疑惑,包括我在内刚接触前端的时候,由于没有后端的开发经验也会被这些问题所困扰,但是今天我们将一次性弄清楚这个问题,让我们前端的知识体系由点成线,由线成面\~
我们知道,我们平时在开发的时候一般都是使用proxy进行代理的,它的原理是:浏览器会先去访问本地的node服务器,然后node服务器再去代理到你要访问的后端api接口,但是我们可能平时没有node服务器的概念,因为node服务器在webpack中,我们一般是通过下面这种方式来设置
proxy
api
node
但是我们的项目上线后这种方式就不能用了,(因为Node是我们本地开发的环境,并没有办法在线上使用。)其实,我们一般会通过后端的Nginx代理来解决跨域的问题,但是你知道前端的生产地址配置是什么吗?如何通过Nginx访问后端接口呢?是直接配置的类似于http://www.xxxx.com/api/aaa这样的路径呢?还是直接是一个相对路径/prod?要想搞清楚这些,首先就要了解什么是Nginx。
Nginx
http://www.xxxx.com/api/aaa
/prod
🐻是一个开源的高性能、轻量级的Web服务器和反向代理服务器,它具有事件驱动,异步非阻塞的架构,被广泛应用于构建高性能的网站,应用程序和服务。
🤡在平时开发中我们经常听到正向代理和反向代理这两个名词,那么什么是反向代理,什么是正向代理哪?
正向代理
反向代理
1. 反向代理:服务器的IP是被屏蔽的,也就是说客户端不知道服务器真实的地址是哪个,客户端访问的地址或者域名是访问的Nginx服务器的地址。
2. 正向代理:和反向代理刚好相反,这个时候服务器不知道真正的客户端是哪个,也就是相当于直接访问服务器的是nginx代理服务器。
🤗什么是跨域,跨域是指在浏览器的环境下,当一个网页的JavaScript代码通过Ajax Websocket或其他技术发送HTTP请求的目标资源位于不同的域名,端口或者协议下,就会发生跨域。
JavaScript
Ajax
Websocket
🐻Nginx如何解决跨域,因为服务器和服务器之间互相请求不发生跨域,所以解决跨域的方法之一就是使用这种方案
1. 浏览器或者客户端发送请求:http:www.xxx.com:80Nginx服务器对80端口进行监听,Nginx服务器将请求转发到后端真实的服务器地址,这样就实现了代理。
http:www.xxx.com:80
2. Nginx基本配置项解析
server { listen 80; server_name yourdomain.com; location / { // 无论访问所有路径都返回前端静态资源dist内容 root /path/to/your/frontend; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend-server-address/api/; // 真实后端api地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
当在前端代码中使用相对路径/api/users发起请求时候Nginx会将这个请求转发到真实的后端地址,不过你发现了没很多前端项目种生产环境地址都仅仅是一个/api类似这样的相对路径,很少直接是一个绝对路径。
/api/users
/api
当你请求 yourdomain.com 时,Nginx 会将前端静态资源返回给前端。前端代码中使用的相对路径 /api会基于当前域名 yourdomain.com构建完整的请求 URL。因此,前端代码请求后端地址的完整 URL 将是 http://yourdomain.com/api/xxx,其中 /xxx表示具体的后端接口路径。
http://yourdomain.com/api/xxx
Nginx 的反向代理配置中的 location /api/ 指令将匹配以 /api/ 开头的请求,并将这些请求代理到后端服务器上。因此,当前端代码发起相对路径请求 /api/xxx 时,Nginx 会将请求转发到 http://yourdomain.com/api/xxx,实现与后端接口的通信。
总结来说,前端代码中的相对路径 /api会根据当前域名构建完整的请求 URL,而 Nginx 的反向代理配置将这些请求转发到后端服务器上的相应路径。这样,前端代码就能够与后端接口进行通信。
🥲既然Nginx如何代理的,以及前端打包的路径一般是什么样的我们知道了,那么我们就来唠唠作为一个前端小白该如何快速的完整的构建一个基础项目吧,其实如果基础开发的话,我们往往会使用脚手架,就以Vue开发的话,我们可以使用vuecli来快速构建项目,其实构建完之后你就可以直接npm run build打出的包就可以部署在后端服务器的,这个打出的包的根路径是默认的/,通过上面的Nginx的知识我们应该不难理解。
npm run build
/
🤡如果我们要自己想去修改一个路径哪?我们可以在vue.config.js中进行配置,配置如下
vue.config.js
module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/prod' : '/' };
👹这样打出的包的静态资源的路径就是下边这样的
🥰如果是直接使用的默认的打包路径就是如下这种
🤡最后总结一下,前端上线打包完就是一个静态文件,是一个相对路径,后端会通过Nginx来监听这个资源的请求,当匹配到/就返回静态资源,当匹配到某个/prod就将请求反向代理到后端真实服务器的地址,前端打包的是一个相对路径,Nginx会在前面拼上去具体的域名或者ip,这样就打通了线上前端访问的基本内容。
mp.weixin.qq.com一溪风月 稀土掘金技术社区
1. 前端项目打包后,我打包过的静态资源是如何访问后端服务的? 2. 访问后端服务的时候难道不存在跨域的问题吗?如何解决的? 3. 假如我想自己简单修改下部署后的目录该如何去做?
其实不仅仅是你会有这样的疑惑,包括我在内刚接触前端的时候,由于没有后端的开发经验也会被这些问题所困扰,但是今天我们将一次性弄清楚这个问题,让我们前端的知识体系由点成线,由线成面\~
一.明确问题
我们知道,我们平时在开发的时候一般都是使用
proxy
进行代理的,它的原理是:浏览器会先去访问本地的node服务器,然后node服务器再去代理到你要访问的后端api
接口,但是我们可能平时没有node
服务器的概念,因为node服务器在webpack中,我们一般是通过下面这种方式来设置但是我们的项目上线后这种方式就不能用了,(因为Node是我们本地开发的环境,并没有办法在线上使用。)其实,我们一般会通过后端的
Nginx
代理来解决跨域的问题,但是你知道前端的生产地址配置是什么吗?如何通过Nginx访问后端接口呢?是直接配置的类似于http://www.xxxx.com/api/aaa
这样的路径呢?还是直接是一个相对路径/prod
?要想搞清楚这些,首先就要了解什么是Nginx
。二.什么是Nginx
🐻是一个开源的高性能、轻量级的Web服务器和反向代理服务器,它具有事件驱动,异步非阻塞的架构,被广泛应用于构建高性能的网站,应用程序和服务。
🤡在平时开发中我们经常听到
正向代理
和反向代理
这两个名词,那么什么是反向代理,什么是正向代理哪?1. 反向代理:服务器的IP是被屏蔽的,也就是说客户端不知道服务器真实的地址是哪个,客户端访问的地址或者域名是访问的Nginx服务器的地址。
2. 正向代理:和反向代理刚好相反,这个时候服务器不知道真正的客户端是哪个,也就是相当于直接访问服务器的是nginx代理服务器。
三.前端使用Nginx解决跨域
🤗什么是跨域,跨域是指在浏览器的环境下,当一个网页的
JavaScript
代码通过Ajax
Websocket
或其他技术发送HTTP请求的目标资源位于不同的域名,端口或者协议下,就会发生跨域。🐻Nginx如何解决跨域,因为服务器和服务器之间互相请求不发生跨域,所以解决跨域的方法之一就是使用这种方案
1. 浏览器或者客户端发送请求:
http:www.xxx.com:80
Nginx服务器对80端口进行监听,Nginx服务器将请求转发到后端真实的服务器地址,这样就实现了代理。2. Nginx基本配置项解析
当在前端代码中使用相对路径
/api/users
发起请求时候Nginx会将这个请求转发到真实的后端地址,不过你发现了没很多前端项目种生产环境地址都仅仅是一个/api
类似这样的相对路径,很少直接是一个绝对路径。当你请求 yourdomain.com 时,Nginx 会将前端静态资源返回给前端。前端代码中使用的相对路径 /api会基于当前域名 yourdomain.com构建完整的请求 URL。因此,前端代码请求后端地址的完整 URL 将是
http://yourdomain.com/api/xxx
,其中 /xxx表示具体的后端接口路径。Nginx 的反向代理配置中的 location /api/ 指令将匹配以 /api/ 开头的请求,并将这些请求代理到后端服务器上。因此,当前端代码发起相对路径请求 /api/xxx 时,Nginx 会将请求转发到
http://yourdomain.com/api/xxx
,实现与后端接口的通信。总结来说,前端代码中的相对路径 /api会根据当前域名构建完整的请求 URL,而 Nginx 的反向代理配置将这些请求转发到后端服务器上的相应路径。这样,前端代码就能够与后端接口进行通信。
四.前端生产环境配置
🥲既然Nginx如何代理的,以及前端打包的路径一般是什么样的我们知道了,那么我们就来唠唠作为一个前端小白该如何快速的完整的构建一个基础项目吧,其实如果基础开发的话,我们往往会使用脚手架,就以Vue开发的话,我们可以使用vuecli来快速构建项目,其实构建完之后你就可以直接
npm run build
打出的包就可以部署在后端服务器的,这个打出的包的根路径是默认的/
,通过上面的Nginx的知识我们应该不难理解。🤡如果我们要自己想去修改一个路径哪?我们可以在
vue.config.js
中进行配置,配置如下👹这样打出的包的静态资源的路径就是下边这样的
🥰如果是直接使用的默认的打包路径就是如下这种
五.总结
🤡最后总结一下,前端上线打包完就是一个静态文件,是一个相对路径,后端会通过Nginx来监听这个资源的请求,当匹配到
/
就返回静态资源,当匹配到某个/prod
就将请求反向代理到后端真实服务器的地址,前端打包的是一个相对路径,Nginx会在前面拼上去具体的域名或者ip,这样就打通了线上前端访问的基本内容。