Skip to content

全栈开发面试题集

全栈开发核心技能、架构设计与高频面试题

更新时间:2025-02

目录

A. 面试宝典

基础题

1. 什么是全栈开发?

核心答案:

全栈开发是指掌握前端、后端、数据库等多个技术栈,能够独立完成完整项目开发的能力。

核心技能:

  1. 前端技能

    • HTML/CSS/JavaScript
    • React/Vue/Angular
    • 响应式设计
    • 前端工程化
  2. 后端技能

    • 服务端语言(Java/Node.js/Python)
    • 框架(Spring Boot/Express/Django)
    • RESTful API 设计
    • 数据库设计
  3. 数据库技能

    • 关系型数据库(MySQL/PostgreSQL)
    • 非关系型数据库(MongoDB/Redis)
    • SQL 优化
    • 数据建模
  4. 运维技能

    • Linux 基础
    • Docker 容器化
    • CI/CD
    • 云服务(AWS/阿里云)

2. 前后端分离架构

核心答案:

前后端分离是将前端和后端代码分开开发、部署的架构模式。

架构图:

┌─────────────────────────────────────────────────────────────┐
│                    前后端分离架构                            │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  前端(React/Vue)                                          │
│     │                                                       │
│     ▼                                                       │
│  HTTP/HTTPS 请求                                            │
│     │                                                       │
│     ▼                                                       │
│  Nginx(反向代理)                                          │
│     │                                                       │
│     ├─▶ 静态资源(HTML/CSS/JS)                            │
│     │                                                       │
│     └─▶ API 请求                                            │
│         │                                                   │
│         ▼                                                   │
│  后端(Spring Boot/Express)                                │
│     │                                                       │
│     ├─▶ 业务逻辑                                            │
│     │                                                       │
│     └─▶ 数据库(MySQL/MongoDB)                            │
│                                                              │
└─────────────────────────────────────────────────────────────┘

优点:

  • 前后端独立开发、部署
  • 技术栈解耦
  • 提升开发效率
  • 便于团队协作

缺点:

  • 增加部署复杂度
  • 跨域问题
  • 首屏加载慢(SSR 可解决)

3. RESTful API 设计

核心答案:

RESTful API 是一种基于 HTTP 协议的 API 设计风格。

设计原则:

  1. 资源导向

    • URL 表示资源
    • 使用名词而非动词
    • 使用复数形式
  2. HTTP 方法

    • GET:查询
    • POST:创建
    • PUT:更新(全量)
    • PATCH:更新(部分)
    • DELETE:删除
  3. 状态码

    • 200:成功
    • 201:创建成功
    • 400:请求错误
    • 401:未授权
    • 403:禁止访问
    • 404:资源不存在
    • 500:服务器错误

示例:

# 用户资源
GET    /api/users          # 获取用户列表
GET    /api/users/:id      # 获取单个用户
POST   /api/users          # 创建用户
PUT    /api/users/:id      # 更新用户(全量)
PATCH  /api/users/:id      # 更新用户(部分)
DELETE /api/users/:id      # 删除用户

# 嵌套资源
GET    /api/users/:id/orders      # 获取用户的订单列表
POST   /api/users/:id/orders      # 为用户创建订单

# 查询参数
GET    /api/users?page=1&size=10&sort=createdAt:desc
GET    /api/users?name=John&status=active

响应格式:

json
{
  "code": 200,
  "message": "success",
  "data": {
    "id": 1,
    "name": "John",
    "email": "john@example.com"
  }
}

// 列表响应
{
  "code": 200,
  "message": "success",
  "data": {
    "items": [...],
    "total": 100,
    "page": 1,
    "size": 10
  }
}

// 错误响应
{
  "code": 400,
  "message": "Invalid request",
  "errors": [
    {
      "field": "email",
      "message": "Email is required"
    }
  ]
}

4. 认证与授权

核心答案:

认证(Authentication)验证用户身份,授权(Authorization)验证用户权限。

常用方案:

  1. Session + Cookie

    用户登录 → 服务器创建 Session → 返回 SessionID(Cookie)
    → 后续请求携带 Cookie → 服务器验证 Session
  2. JWT(JSON Web Token)

    用户登录 → 服务器生成 JWT → 返回 Token
    → 后续请求携带 Token(Header) → 服务器验证 Token
  3. OAuth 2.0

    第三方登录(微信、GitHub)
    授权码模式、隐式模式、密码模式、客户端模式

JWT 示例:

javascript
// 后端生成 JWT
const jwt = require('jsonwebtoken');

function generateToken(user) {
  return jwt.sign(
    { id: user.id, email: user.email },
    process.env.JWT_SECRET,
    { expiresIn: '7d' }
  );
}

// 验证 JWT
function verifyToken(token) {
  try {
    return jwt.verify(token, process.env.JWT_SECRET);
  } catch (error) {
    throw new Error('Invalid token');
  }
}

// 中间件
function authMiddleware(req, res, next) {
  const token = req.headers.authorization?.split(' ')[1];
  
  if (!token) {
    return res.status(401).json({ message: 'No token provided' });
  }
  
  try {
    const decoded = verifyToken(token);
    req.user = decoded;
    next();
  } catch (error) {
    return res.status(401).json({ message: 'Invalid token' });
  }
}

前端使用:

javascript
// 请求拦截器
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

// 响应拦截器
axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response?.status === 401) {
      localStorage.removeItem('token');
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

5. 跨域问题解决

核心答案:

跨域是浏览器的同源策略限制,协议、域名、端口任一不同即为跨域。

解决方案:

  1. CORS(推荐)

    javascript
    // Express
    const cors = require('cors');
    app.use(cors({
      origin: 'http://localhost:3000',
      credentials: true
    }));
    
    // Spring Boot
    @Configuration
    public class CorsConfig {
        @Bean
        public CorsFilter corsFilter() {
            CorsConfiguration config = new CorsConfiguration();
            config.addAllowedOrigin("http://localhost:3000");
            config.addAllowedMethod("*");
            config.addAllowedHeader("*");
            config.setAllowCredentials(true);
            
            UrlBasedCorsConfigurationSource source = 
                new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", config);
            
            return new CorsFilter(source);
        }
    }
  2. Nginx 反向代理

    nginx
    server {
        listen 80;
        server_name example.com;
        
        location / {
            root /var/www/html;
            try_files $uri $uri/ /index.html;
        }
        
        location /api {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
  3. 开发环境代理

    javascript
    // Vite
    export default {
      server: {
        proxy: {
          '/api': {
            target: 'http://localhost:8080',
            changeOrigin: true,
            rewrite: (path) => path.replace(/^\/api/, '')
          }
        }
      }
    }
    
    // Webpack
    module.exports = {
      devServer: {
        proxy: {
          '/api': {
            target: 'http://localhost:8080',
            changeOrigin: true,
            pathRewrite: { '^/api': '' }
          }
        }
      }
    }

进阶题

6. 微服务架构

核心答案:

微服务是将单体应用拆分成多个小型服务的架构模式。

架构图:

┌─────────────────────────────────────────────────────────────┐
│                    微服务架构                                │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  前端(React/Vue)                                          │
│     │                                                       │
│     ▼                                                       │
│  API 网关(Gateway)                                        │
│     │                                                       │
│     ├─▶ 用户服务(User Service)                           │
│     │   └─▶ MySQL                                           │
│     │                                                       │
│     ├─▶ 订单服务(Order Service)                          │
│     │   └─▶ MySQL                                           │
│     │                                                       │
│     ├─▶ 商品服务(Product Service)                        │
│     │   └─▶ MongoDB                                         │
│     │                                                       │
│     └─▶ 支付服务(Payment Service)                        │
│         └─▶ MySQL                                           │
│                                                              │
│  服务注册与发现(Eureka/Consul)                            │
│  配置中心(Config Server)                                  │
│  消息队列(RabbitMQ/Kafka)                                 │
│  分布式追踪(Zipkin/Skywalking)                            │
│                                                              │
└─────────────────────────────────────────────────────────────┘

优点:

  • 服务独立部署
  • 技术栈灵活
  • 易于扩展
  • 故障隔离

缺点:

  • 系统复杂度增加
  • 分布式事务
  • 服务间通信开销
  • 运维成本高

7. 性能优化

前端优化:

✅ 资源优化
  - 代码分割(Code Splitting)
  - 懒加载(Lazy Loading)
  - 图片优化(WebP、压缩)
  - CDN 加速

✅ 渲染优化
  - 虚拟滚动
  - 防抖节流
  - 避免重排重绘
  - 使用 Web Workers

✅ 网络优化
  - HTTP/2
  - 资源预加载
  - 缓存策略
  - 减少请求数量

后端优化:

✅ 数据库优化
  - 索引优化
  - 查询优化
  - 连接池配置
  - 读写分离

✅ 缓存优化
  - Redis 缓存
  - 本地缓存
  - CDN 缓存
  - 浏览器缓存

✅ 代码优化
  - 异步处理
  - 批量操作
  - 避免 N+1 查询
  - 使用消息队列

B. 避坑指南

常见误区

误区正确理解
全栈 = 前端 + 后端还需要数据库、运维等技能
RESTful 只是 URL 规范还包括 HTTP 方法、状态码等
JWT 绝对安全需要 HTTPS + 合理过期时间
微服务适合所有项目小项目不适合微服务
跨域只能用 CORS还可以用代理、JSONP 等

最佳实践

✅ 前后端分离
✅ RESTful API 设计
✅ 统一错误处理
✅ 日志记录
✅ 接口文档(Swagger)
✅ 单元测试
✅ CI/CD 自动化
✅ 监控告警

C. 面试技巧

1. 回答框架

1. 概念定义
   - 全栈开发是什么
   - 核心技能
   - 技术栈选择

2. 技术细节
   - 前后端分离
   - RESTful API
   - 认证授权
   - 跨域处理

3. 实战经验
   - 项目架构
   - 技术选型
   - 问题解决
   - 性能优化

4. 对比分析
   - 不同技术栈对比
   - 架构模式对比
   - 认证方案对比

2. 加分项

✅ 掌握多个技术栈
✅ 有完整项目经验
✅ 了解微服务架构
✅ 掌握性能优化
✅ 熟悉 DevOps
✅ 有开源贡献
✅ 持续学习能力

❌ 只会基础 CRUD
❌ 没有项目经验
❌ 不了解架构设计
❌ 不会性能优化

3. 高频问题

1. 什么是全栈开发?
2. 前后端分离架构?
3. RESTful API 设计原则?
4. JWT 认证流程?
5. 如何解决跨域问题?
6. 微服务架构优缺点?
7. 如何进行性能优化?
8. 如何保证接口安全?
9. 如何设计数据库?
10. 项目部署流程?

D. 参考资料

学习资源

技术栈

实战项目

  • 博客系统
  • 电商平台
  • 社交网络
  • 任务管理系统

学习路线

初级(2-3个月):
- 前端基础(HTML/CSS/JS)
- 后端基础(Node.js/Java)
- 数据库基础(MySQL)
- 简单项目实战

中级(3-6个月):
- 前端框架(React/Vue)
- 后端框架(Express/Spring Boot)
- RESTful API 设计
- 认证授权
- 中等项目实战

高级(6-12个月):
- 微服务架构
- 性能优化
- DevOps
- 系统设计
- 大型项目实战

基于 VitePress 构建