第 4 卷
请求,代理服务器根据规则转发请求到后端真实服务器,客户端只知道代理服务器的地址,不知道真实后端服务器的地址。
核心特征
- 代理服务于服务器,客户端无需配置,无感知代理存在;
- 代理服务器隐藏真实后端服务器IP和集群架构;
- 代理服务器统一接收客户端请求,实现请求分发。
典型应用场景
- 负载均衡:将客户端请求分发到后端多台服务器,避免单台服务器过载(如Nginx负载均衡);
- 跨域解决方案:前端请求同源的代理服务器,代理服务器转发到跨域接口,规避浏览器同源策略;
- 静态资源缓存:代理服务器缓存CSS/JS/图片,直接返回给客户端,减轻后端服务器压力;
- 安全防护:隔离后端服务器,防止直接暴露外网,抵御DDOS攻击、过滤恶意请求;
- HTTPS部署:代理服务器统一配置SSL证书,处理TLS握手,后端服务器无需配置HTTPS。
正向代理 vs 反向代理核心区别
| 维度 | 正向代理 | 反向代理 |
|---|---|---|
| 代理对象 | 客户端 | 服务器 |
| 隐藏对象 | 真实客户端IP | 真实后端服务器IP |
| 配置方 | 客户端手动配置 | 服务器端配置,客户端无感知 |
| 核心目的 | 方便客户端访问外网 | 保护服务器、负载均衡、跨域 |
| 典型工具 | 代理服务器、VPN | Nginx、Apache、HAProxy |
13. 描述如何使用Nginx作为解决跨域问题的一种方法,并概述其工作原理
Nginx解决跨域的核心原理
利用反向代理规避浏览器的同源策略限制:前端请求同源的Nginx代理服务器,Nginx再将请求转发到跨域的后端接口服务器,由于浏览器只校验前端与Nginx的同源性,而Nginx与后端服务器的通信是服
务器间请求,无跨域限制,从而实现跨域请求。
步骤2:修改Nginx配置文件(nginx.conf)
核心配置:在 http{} 中添加 server{},配置同源代理地址和跨域接口转发规则,并开启CORS跨域头。
Code block
1http { 2server {
3listen 80; # 前端访问的Nginx端口(与前端同源,如http://localhost:80)
4server_name localhost; # 前端域名,与前端页面一致 5
| 6 | #配置跨域接口转发规则:匹配/api开头的请求 |
|---|---|
| 7 | location /api { |
| 8 | # 1.转发到真实的跨域后端接口地址 |
| 9 | proxy_pass http://192.168.1.100:3000;#后端接口地址(跨域地址) |
| 10 | # 2.传递请求头,保留客户端真实信息 |
| 11 | proxy_set_header Host $host; |
| 12 | proxy_set_header X-Real-IP $remote_addr; |
| 13 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| 14 | proxy_set_header X-Forwarded-Proto $scheme; |
15 16# 3. 开启CORS跨域头(可选,兜底保障)
17add_header Access-Control-Allow-Origin *; # 允许所有域名跨域,生产环境指定具体域名
18add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; # 允许的请求方法
19add_header Access-Control-Allow-Headers Content-Type,Authorization; # 允许的请求头
20add_header Access-Control-Allow-Credentials true; # 允许携带Cookie 21
| 22 | # 4.处理OPTIONS预检请求(必配,AJAX跨域会先发预检请求) |
|---|---|
| 23 | if ($request_method = OPTIONS) { |
| 24 | return 204;#预检请求直接返回204,不转发到后端 |
| 25 | } |
| 26 | } |
| 27 | } |
| 28 } |
步骤3:前端请求配置
4console.log(res.data);
5});
步骤4:重启Nginx生效
Code block
1# Windows 2nginx -s reload
3# Linux/Mac 4sudo nginx -s reload
Nginx跨域的优势
- 无前端代码侵入:前端仅需修改请求地址,无需添加任何跨域配置;
- 安全性高:后端接口不直接暴露外网,由Nginx统一转发,规避攻击风险;
- 性能优异:Nginx轻量高效,转发请求的性能损耗极低,支持高并发;
- 功能扩展:可同时实现负载均衡、静态资源缓存、HTTPS部署;
- 兼容性强:支持所有浏览器,无AJAX/fetch请求限制。
关键注意点
- 生产环境 Access-Control-Allow-Origin 不要写 *,需指定具体前端域名(如
http://www.xxx.com),避免安全风险;
- 需处理 OPTIONS 预检请求,否则POST/PUT/DELETE请求会跨域失败;
- 若前端需要携带Cookie,需满足3个条件: withCredentials: true、 Access-
Control-Allow-Credentials: true、 Access-Control-Allow-Origin 为具体域名(非*)。
14. 解释浏览器的事件循环机制,包括它是如何处理异步操作的
事件循环(Event Loop)的定义
浏览器的事件循环是单线程的JS引擎处理异步任务的核心机制,由于JS是单线程,无法同时执行多个任务,事件循环通过任务队列的方式,将同步任务和异步任务按顺序执行,实现非阻塞的异步执行效
果,保证页面不卡死。
全站分卷索引 · 10 卷
- 1第 1 卷
- 2第 2 卷
- ◦ 处理样式优先级(!important > 行内样式 > ID选择器 > 类/伪类/属性选择器 > 标签/伪元素选择
- 关键特性
- 6. 详述浏览器加载和执行JavaScript文件的机制
- JS加载执行核心机制(单线程+阻塞特性)
- • 浏览器解析HTML时,遇到 <script> 标签,立即暂停后续HTML解析,发起HTTP请求加载JS文
- • 可通过属性优化加载:
- ◦ async:异步加载,加载完成后立即执行(执行顺序不确定,不阻塞HTML解析,阻塞渲
- ◦ defer:异步加载,HTML解析完成后、DOMContentLoaded事件前执行(执行顺序与标签
- ◦ type="module":ES6模块加载,默认异步,遵循 defer 规则,支持按需加载、作用域隔
- • V8引擎采用即时编译(JIT):将AST转换为字节码,再将热点代码(频繁执行)编译为机器码,
- 关键特性
- • 异步JS(async/defer/module)仅解除对HTML解析的阻塞,仍会阻塞 DOMContentLoaded 事
- 3第 3 卷
- 4第 4 卷
- 5第 5 卷
- 6第 6 卷
- ✅ 2. 微任务的优先级和执行时机不同
- ✅ 3. 宏任务的类型和优先级不同
- ✅ 4. 页面渲染的差异
- • Node.js事件循环:无页面渲染环节,Node.js是服务端运行环境,无需渲染页面,专注于I/O处
- ✅ 5. 异步API的支持差异
- • 浏览器:支持DOM事件、AJAX、requestAnimationFrame、MutationObserver等前端专属异步
- • Node.js:支持文件I/O、网络I/O、child_process、setImmediate、process.nextTick等服务端专
- ✅ 6. 任务队列的数量差异
- ✅ 核心差异总结表
- 17. 描述process.nextTick在Nodejs事件循环中的执行顺序及其与微任务
- 的关系
- process.nextTick的定义
- 7第 7 卷
- 8第 8 卷
- 9第 9 卷
- 10第 10 卷
- • 不再使用的全局变量,手动置空释放:`window.data = null`(浏览器)、`delete global.data`
- • 避免闭包长期引用大对象,若必须引用,业务结束后手动清空闭包引用:`persistentClosure =
- • DOM元素移除前,通过`removeEventListener`移除对应的事件监听(注意:监听函数必须与绑
- • 组件生命周期销毁时(如React的`componentWillUnmount`、Vue的`beforeUnmount`),批
- • 定时器/计时器使用后,务必通过`clearTimeout`/`clearInterval`清理,尤其是在组件销毁、页
- • 将定时器ID存储在实例属性中,便于后续清理:`this.timer = setTimeout(...)`,销毁时执行
- • 避免在JS中长期缓存DOM元素,优先通过`document.querySelector`动态获取,减少不必要的
- • 异步任务(Promise/AJAX)确保完成:无论成功/失败,都调用`resolve/reject`;使用
- • 内存缓存设置上限和过期机制:使用`lru-cache`等成熟缓存库(自动淘汰最近最少使用的缓
- • 优先使用`WeakMap/WeakSet`作为缓存:它们的键是弱引用,当键对应的对象无其他引用时,会
- • 浏览器端:使用Chrome开发者工具(Memory面板),通过HeapSnapshot(堆快照)对比内存
- • Node.js端:使用`--inspect`参数启动服务,通过Chrome开发者工具调试;使用`clinic.js`、