Skip to content

前后端开发常见技术手段汇总

1. 前端开发常见技术手段

1.1 接口管理与版本控制

接口版本区分

技术手段:URL路径版本号(如 /api/v1/users/api/v2/users)或请求头版本标识(如 X-API-Version: 2

应用场景

  • 接口升级时保证老版本兼容性
  • 不同客户端使用不同版本接口

实现示例

javascript
// 前端API请求封装
const api = {
  // V1版本接口
  v1: {
    users: () => axios.get('/api/v1/users'),
    user: (id) => axios.get(`/api/v1/users/${id}`)
  },
  // V2版本接口
  v2: {
    users: () => axios.get('/api/v2/users'),
    user: (id) => axios.get(`/api/v2/users/${id}`)
  }
}

// 使用不同版本接口
if (appVersion >= 2.0) {
  api.v2.users()
} else {
  api.v1.users()
}

API请求封装

技术手段:统一封装axios等HTTP客户端,处理请求拦截、响应拦截、错误处理等

应用场景

  • 统一添加认证信息
  • 统一处理错误状态码
  • 统一格式化请求/响应数据

实现示例

javascript
// 创建axios实例
const request = axios.create({
  baseURL: '/api/v1',
  timeout: 10000
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 添加token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => Promise.reject(error)
)

// 响应拦截器
request.interceptors.response.use(
  response => response.data,
  error => {
    // 统一错误处理
    if (error.response.status === 401) {
      // 跳转登录页
      router.push('/login')
    } else if (error.response.status === 403) {
      ElMessage.error('权限不足')
    } else {
      ElMessage.error('请求失败,请稍后重试')
    }
    return Promise.reject(error)
  }
)

1.2 状态管理与数据流

状态管理模式

技术手段:Vuex、Pinia、Redux等状态管理库,或Context API结合useReducer

应用场景

  • 多组件共享状态
  • 复杂业务逻辑的状态管理
  • 统一的数据更新逻辑

实现示例(Pinia):

javascript
// store/user.js
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    userInfo: null,
    token: ''
  }),
  getters: {
    isLoggedIn: (state) => !!state.token
  },
  actions: {
    async login(credentials) {
      const { data } = await request.post('/login', credentials)
      this.token = data.token
      this.userInfo = data.user
      localStorage.setItem('token', data.token)
    },
    logout() {
      this.token = ''
      this.userInfo = null
      localStorage.removeItem('token')
    }
  }
})

单向数据流

技术手段:采用单向数据流模式,避免直接修改props或全局状态

应用场景

  • React组件通信
  • Vue父子组件通信

实现示例

javascript
// React父子组件通信
function ParentComponent() {
  const [count, setCount] = useState(0)
  
  const handleIncrement = () => {
    setCount(count + 1)
  }
  
  return (
    <div>
      <ChildComponent count={count} onIncrement={handleIncrement} />
    </div>
  )
}

function ChildComponent({ count, onIncrement }) {
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={onIncrement}>Increment</button>
    </div>
  )
}

1.3 性能优化

代码分割与懒加载

技术手段:webpack的动态导入(import())、React.lazy、Vue的异步组件

应用场景

  • 减少初始加载时间
  • 按需加载路由组件
  • 按需加载大型第三方库

实现示例

javascript
// React路由懒加载
import { lazy, Suspense } from 'react'
import { BrowserRouter, Routes, Route } from 'react-router-dom'

const Home = lazy(() => import('./pages/Home'))
const About = lazy(() => import('./pages/About'))
const Products = lazy(() => import('./pages/Products'))

function App() {
  return (
    <BrowserRouter>
      <Suspense fallback={<div>Loading...</div>}>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/products" element={<Products />} />
        </Routes>
      </Suspense>
    </BrowserRouter>
  )
}

图片优化

技术手段:使用WebP格式、响应式图片、懒加载、CDN加速

应用场景

  • 提高页面加载速度
  • 减少带宽消耗
  • 提升用户体验

实现示例

html
<!-- 响应式图片 -->
<picture>
  <source srcset="image.webp" type="image/webp">
  <source srcset="image.jpg" type="image/jpeg">
  <img src="image.jpg" alt="描述" loading="lazy" width="800" height="600">
</picture>

<!-- 图片懒加载 -->
<img src="placeholder.jpg" data-src="actual-image.jpg" class="lazyload" alt="描述">

<script>
// 图片懒加载实现
const lazyImages = document.querySelectorAll('.lazyload')

if ('IntersectionObserver' in window) {
  const imageObserver = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const image = entry.target
        image.src = image.dataset.src
        image.classList.remove('lazyload')
        imageObserver.unobserve(image)
      }
    })
  })
  
  lazyImages.forEach(image => {
    imageObserver.observe(image)
  })
}
</script>

1.4 组件化与复用

组件设计模式

技术手段:原子设计、组件库、高阶组件、自定义Hook/Composable

应用场景

  • 提高代码复用率
  • 保证UI一致性
  • 简化组件开发

实现示例(Vue Composable):

javascript
// composables/usePagination.js
import { ref, computed } from 'vue'

export function usePagination(items, pageSize = 10) {
  const currentPage = ref(1)
  
  const totalPages = computed(() => Math.ceil(items.value.length / pageSize))
  
  const paginatedItems = computed(() => {
    const start = (currentPage.value - 1) * pageSize
    const end = start + pageSize
    return items.value.slice(start, end)
  })
  
  const goToPage = (page) => {
    if (page >= 1 && page <= totalPages.value) {
      currentPage.value = page
    }
  }
  
  return {
    currentPage,
    totalPages,
    paginatedItems,
    goToPage,
    nextPage: () => goToPage(currentPage.value + 1),
    prevPage: () => goToPage(currentPage.value - 1)
  }
}

// 使用
import { usePagination } from '@/composables/usePagination'

const items = ref([...])
const { currentPage, totalPages, paginatedItems, nextPage, prevPage } = usePagination(items, 10)

1.5 错误处理与调试

全局错误处理

技术手段:window.onerror、try-catch、Vue.config.errorHandler、React.ErrorBoundary

应用场景

  • 捕获全局JavaScript错误
  • 组件渲染错误的优雅降级
  • 错误监控与上报

实现示例(React ErrorBoundary):

javascript
class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props)
    this.state = { hasError: false, error: null }
  }

  static getDerivedStateFromError(error) {
    return { hasError: true, error }
  }

  componentDidCatch(error, errorInfo) {
    // 错误上报
    console.error('ErrorBoundary caught an error:', error, errorInfo)
    // 可以调用错误监控服务,如Sentry
    // Sentry.captureException(error, { extra: errorInfo })
  }

  render() {
    if (this.state.hasError) {
      return (
        <div className="error-container">
          <h2>页面出现错误</h2>
          <p>{this.state.error?.toString()}</p>
          <button onClick={() => this.setState({ hasError: false })}>
            重试
          </button>
        </div>
      )
    }

    return this.props.children
  }
}

// 使用
<ErrorBoundary>
  <App />
</ErrorBoundary>

1.6 安全防护

XSS防护

技术手段:输入验证、输出转义、CSP(Content Security Policy)、XSS Filter

应用场景

  • 防止恶意脚本注入
  • 保护用户数据安全

实现示例

javascript
// 输入验证
function sanitizeInput(input) {
  return input.replace(/<script[^>]*>([\S\s]*?)<\/script>/gim, '')
}

// 输出转义
function escapeHtml(text) {
  const div = document.createElement('div')
  div.textContent = text
  return div.innerHTML
}

// CSP配置(服务器端设置)
// Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://trusted-cdn.com;

// React中自动转义
function UserComment({ comment }) {
  // React会自动转义content内容
  return <div className="comment">{comment.content}</div>
}

2. 后端开发常见技术手段

2.1 API设计与版本管理

API版本控制

技术手段:URL路径版本、请求头版本、媒体类型版本

应用场景

  • 兼容老版本客户端
  • 平滑升级API

实现示例(Node.js + Express):

javascript
// app.js
const express = require('express')
const app = express()

// 引入不同版本的路由
const v1Routes = require('./routes/v1')
const v2Routes = require('./routes/v2')

// 使用不同版本的路由
app.use('/api/v1', v1Routes)
app.use('/api/v2', v2Routes)

app.listen(3000, () => {
  console.log('Server running on port 3000')
})

// routes/v1/users.js
const express = require('express')
const router = express.Router()

// V1版本用户接口
router.get('/users', (req, res) => {
  res.json({
    version: 'v1',
    users: [
      { id: 1, name: '张三' },
      { id: 2, name: '李四' }
    ]
  })
})

module.exports = router

// routes/v2/users.js
const express = require('express')
const router = express.Router()

// V2版本用户接口(新增email字段)
router.get('/users', (req, res) => {
  res.json({
    version: 'v2',
    users: [
      { id: 1, name: '张三', email: 'zhangsan@example.com' },
      { id: 2, name: '李四', email: 'lisi@example.com' }
    ]
  })
})

module.exports = router

RESTful API设计

技术手段:使用HTTP方法(GET/POST/PUT/PATCH/DELETE)表示资源操作,使用URL表示资源

应用场景

  • 统一API设计规范
  • 提高API可读性和可维护性

实现示例

# 获取用户列表
GET /api/v1/users

# 获取单个用户
GET /api/v1/users/1

# 创建用户
POST /api/v1/users

# 更新用户
PUT /api/v1/users/1
# 部分更新用户
PATCH /api/v1/users/1

# 删除用户
DELETE /api/v1/users/1

# 获取用户的订单
GET /api/v1/users/1/orders

2.2 数据处理与存储

数据库设计规范

技术手段:三范式、索引优化、分库分表、读写分离

应用场景

  • 提高数据库性能
  • 保证数据一致性
  • 支持高并发访问

实现示例(MySQL索引优化):

sql
-- 为查询频繁的字段创建索引
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_user_id ON orders(user_id);

-- 创建联合索引(注意顺序)
CREATE INDEX idx_orders_user_id_created_at ON orders(user_id, created_at DESC);

-- 查看索引使用情况
EXPLAIN SELECT * FROM users WHERE email = 'zhangsan@example.com';

数据缓存策略

技术手段:Redis、Memcached、本地缓存(如Ehcache)

应用场景

  • 减少数据库查询压力
  • 提高数据访问速度
  • 支持高并发请求

实现示例(Redis缓存):

javascript
// Node.js中使用Redis缓存
const redis = require('redis')
const client = redis.createClient()

// 缓存用户信息
async function getUserById(id) {
  // 先从缓存获取
  const cachedUser = await client.get(`user:${id}`)
  if (cachedUser) {
    return JSON.parse(cachedUser)
  }
  
  // 缓存不存在,从数据库查询
  const user = await db.query('SELECT * FROM users WHERE id = ?', [id])
  
  // 设置缓存,过期时间1小时
  await client.set(`user:${id}`, JSON.stringify(user), 'EX', 3600)
  
  return user
}

// 更新用户信息时,删除缓存
async function updateUser(id, data) {
  // 更新数据库
  await db.query('UPDATE users SET ? WHERE id = ?', [data, id])
  
  // 删除缓存
  await client.del(`user:${id}`)
  
  return true
}

2.3 并发与性能优化

异步处理

技术手段:多线程、异步IO、消息队列(RabbitMQ、Kafka)

应用场景

  • 处理耗时任务
  • 削峰填谷
  • 解耦系统组件

实现示例(Kafka消息队列):

java
// 生产者发送消息
@Service
public class OrderService {
    @Autowired
    private KafkaTemplate<String, Order> kafkaTemplate;
    
    public void createOrder(Order order) {
        // 保存订单到数据库
        orderRepository.save(order);
        
        // 发送订单创建消息到Kafka
        kafkaTemplate.send("order-created", order.getId().toString(), order);
    }
}

// 消费者处理消息
@Component
public class OrderConsumer {
    @Autowired
    private EmailService emailService;
    
    @KafkaListener(topics = "order-created", groupId = "order-group")
    public void handleOrderCreated(ConsumerRecord<String, Order> record) {
        Order order = record.value();
        
        // 发送订单确认邮件
        emailService.sendOrderConfirmation(order);
        
        // 更新库存
        inventoryService.updateStock(order);
    }
}

负载均衡

技术手段:Nginx、LVS、Ribbon(Spring Cloud)、Gateway

应用场景

  • 分散服务器压力
  • 提高系统可用性
  • 支持水平扩展

实现示例(Nginx负载均衡):

nginx
# nginx.conf
http {
    upstream backend {
        # 轮询策略
        server backend1.example.com:8080;
        server backend2.example.com:8080;
        server backend3.example.com:8080;
        
        # 权重策略
        # server backend1.example.com:8080 weight=3;
        # server backend2.example.com:8080 weight=2;
        # server backend3.example.com:8080 weight=1;
        
        # IP哈希策略
        # ip_hash;
    }
    
    server {
        listen 80;
        server_name api.example.com;
        
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

2.4 安全与认证

认证授权机制

技术手段:JWT、OAuth2.0、Session-Cookie、API Key

应用场景

  • 用户身份认证
  • API访问授权
  • 第三方应用授权

实现示例(JWT认证):

javascript
// Node.js中使用JWT
const jwt = require('jsonwebtoken')

// 生成JWT
function generateToken(user) {
  const payload = {
    userId: user.id,
    username: user.username,
    role: user.role
  }
  
  // 使用secret签名,过期时间1小时
  return jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h' })
}

// 验证JWT(中间件)
function verifyToken(req, res, next) {
  const token = req.header('Authorization')?.replace('Bearer ', '')
  
  if (!token) {
    return res.status(401).json({ message: '未提供认证token' })
  }
  
  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET)
    req.user = decoded
    next()
  } catch (error) {
    return res.status(401).json({ message: '无效的token' })
  }
}

// 使用中间件
app.get('/api/v1/users/me', verifyToken, (req, res) => {
  res.json({ user: req.user })
})

安全防护措施

技术手段:密码加密(bcrypt、Argon2)、SQL注入防护、CSRF防护、请求限流

实现示例(密码加密与SQL注入防护):

javascript
// 密码加密
const bcrypt = require('bcrypt')

async function hashPassword(password) {
  const salt = await bcrypt.genSalt(12) // 12轮盐值
  return await bcrypt.hash(password, salt)
}

async function comparePassword(password, hash) {
  return await bcrypt.compare(password, hash)
}

// 用户注册
async function registerUser(username, password) {
  const hashedPassword = await hashPassword(password)
  await db.query(
    'INSERT INTO users (username, password) VALUES (?, ?)', 
    [username, hashedPassword]
  )
}

// 用户登录
async function loginUser(username, password) {
  // 使用参数化查询防止SQL注入
  const user = await db.query(
    'SELECT * FROM users WHERE username = ?', 
    [username]
  )
  
  if (!user) {
    throw new Error('用户不存在')
  }
  
  const isPasswordValid = await comparePassword(password, user.password)
  if (!isPasswordValid) {
    throw new Error('密码错误')
  }
  
  return generateToken(user)
}

2.5 错误处理与监控

全局异常处理

技术手段:统一异常处理器、错误码规范、日志记录

应用场景

  • 统一错误响应格式
  • 快速定位问题
  • 提高系统可维护性

实现示例(Spring Boot全局异常处理):

java
@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception e, HttpServletRequest request) {
        // 记录错误日志
        log.error("请求URL: {}", request.getRequestURL(), e);
        
        ErrorResponse error = new ErrorResponse();
        error.setTimestamp(LocalDateTime.now());
        error.setPath(request.getRequestURI());
        
        // 根据异常类型设置错误码和消息
        if (e instanceof ResourceNotFoundException) {
            error.setStatus(HttpStatus.NOT_FOUND.value());
            error.setError(HttpStatus.NOT_FOUND.getReasonPhrase());
            error.setMessage(e.getMessage());
        } else if (e instanceof IllegalArgumentException) {
            error.setStatus(HttpStatus.BAD_REQUEST.value());
            error.setError(HttpStatus.BAD_REQUEST.getReasonPhrase());
            error.setMessage(e.getMessage());
        } else if (e instanceof AuthenticationException) {
            error.setStatus(HttpStatus.UNAUTHORIZED.value());
            error.setError(HttpStatus.UNAUTHORIZED.getReasonPhrase());
            error.setMessage("认证失败");
        } else {
            error.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
            error.setError(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
            error.setMessage("服务器内部错误");
        }
        
        return new ResponseEntity<>(error, HttpStatus.valueOf(error.getStatus()));
    }
    
    // 错误响应实体
    @Data
    static class ErrorResponse {
        private LocalDateTime timestamp;
        private int status;
        private String error;
        private String message;
        private String path;
    }
}

系统监控

技术手段:Prometheus + Grafana、ELK Stack、APM工具(如New Relic、SkyWalking)

应用场景

  • 实时监控系统性能
  • 异常告警
  • 性能瓶颈分析

实现示例(Prometheus监控):

yaml
# prometheus.yml
scrape_configs:
  # 监控Prometheus自身
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  
  # 监控Node.js应用
  - job_name: 'nodejs-app'
    static_configs:
      - targets: ['nodejs-app:3000']
  
  # 监控Spring Boot应用
  - job_name: 'spring-boot-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['spring-boot-app:8080']

2.6 部署与运维

容器化与编排

技术手段:Docker、Kubernetes(K8s)、Docker Compose

应用场景

  • 简化部署流程
  • 提高环境一致性
  • 支持弹性伸缩

实现示例(Docker Compose):

yaml
# docker-compose.yml
version: '3'

services:
  # 前端应用
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend
  
  # 后端应用
  backend:
    build: ./backend
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=mysql
      - DB_USER=root
      - DB_PASSWORD=password
      - DB_NAME=app_db
    depends_on:
      - mysql
      - redis
  
  # 数据库
  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=app_db
    volumes:
      - mysql_data:/var/lib/mysql
  
  # 缓存
  redis:
    image: redis:6.0
    volumes:
      - redis_data:/data

volumes:
  mysql_data:
  redis_data:

CI/CD流水线

技术手段:Jenkins、GitLab CI、GitHub Actions

应用场景

  • 自动化构建、测试、部署
  • 提高开发效率
  • 保证代码质量

实现示例(GitHub Actions):

yaml
# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '16'
    
    - name: Install dependencies
      run: npm install
    
    - name: Run tests
      run: npm test
    
    - name: Build
      run: npm run build
    
    - name: Deploy to Production
      if: github.ref == 'refs/heads/main'
      uses: easingthemes/ssh-deploy@v2.1.5
      env:
        SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
        SOURCE: 'dist/'
        REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
        REMOTE_USER: ${{ secrets.REMOTE_USER }}
        TARGET: '/var/www/app/'

3. 前后端协作技术手段

3.1 接口文档与Mock数据

API文档工具

技术手段:Swagger/OpenAPI、Postman、Apifox、YApi

应用场景

  • 前后端接口协作
  • 自动化接口测试
  • API文档管理

实现示例(Swagger):

java
// Spring Boot中使用Swagger
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.api"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo());
    }
    
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("API文档")
                .description("前后端协作接口文档")
                .version("1.0.0")
                .build();
    }
}

// 接口注解
@RestController
@RequestMapping("/api/v1/users")
@Api(tags = "用户管理")
public class UserController {
    
    @GetMapping
    @ApiOperation("获取用户列表")
    public List<User> getUsers() {
        // 实现
    }
    
    @PostMapping
    @ApiOperation("创建用户")
    public User createUser(@RequestBody User user) {
        // 实现
    }
}

Mock数据

技术手段:Mock.js、json-server、MSW(Mock Service Worker)

应用场景

  • 前后端并行开发
  • 测试不同数据场景
  • 模拟异常情况

实现示例(MSW):

javascript
// src/mocks/handlers.js
import { rest } from 'msw'

export const handlers = [
  // 模拟获取用户列表
  rest.get('/api/v1/users', (req, res, ctx) => {
    return res(
      ctx.status(200),
      ctx.json([
        { id: 1, name: '张三', email: 'zhangsan@example.com' },
        { id: 2, name: '李四', email: 'lisi@example.com' }
      ])
    )
  }),
  
  // 模拟创建用户
  rest.post('/api/v1/users', (req, res, ctx) => {
    const newUser = req.body
    return res(
      ctx.status(201),
      ctx.json({
        id: 3,
        ...newUser
      })
    )
  }),
  
  // 模拟错误情况
  rest.get('/api/v1/error', (req, res, ctx) => {
    return res(
      ctx.status(500),
      ctx.json({ message: '服务器内部错误' })
    )
  })
]

// src/mocks/server.js
import { setupServer } from 'msw/node'
import { handlers } from './handlers'

export const server = setupServer(...handlers)

// src/index.js
// 在开发环境启用Mock
if (process.env.NODE_ENV === 'development') {
  const { server } = require('./mocks/server')
  server.listen()
}

3.2 跨域解决方案

CORS(Cross-Origin Resource Sharing)

技术手段:服务器设置CORS响应头,前端代理配置

应用场景

  • 前后端分离架构
  • 跨域API请求

实现示例(服务器设置CORS):

javascript
// Node.js + Express
const express = require('express')
const cors = require('cors')
const app = express()

// 允许所有来源的跨域请求
app.use(cors())

// 或配置特定来源
app.use(cors({
  origin: 'http://localhost:3000', // 允许的前端域名
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  credentials: true // 允许携带cookie
}))
java
// Spring Boot
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:3000")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*").allowCredentials(true)
                .maxAge(3600);
    }
}

反向代理

技术手段:Nginx反向代理、Vite/CRA代理配置

应用场景

  • 开发环境跨域
  • 生产环境统一入口

实现示例(Vite代理配置):

javascript
// vite.config.js
export default defineConfig({
  server: {
    proxy: {
      // 将/api开头的请求代理到后端服务
      '/api': {
        target: 'http://localhost:3000', // 后端服务的地址
        changeOrigin: true, // 开启跨域,修改请求头中的Origin字段
        rewrite: (path) => path.replace(/^\/api/, '') // 重写路径,去掉/api前缀
      }
    }
  }
})

配置说明

  • server.proxy:配置Vite开发服务器的代理规则
  • /api:代理的路径前缀,所有以/api开头的请求都会被代理
  • target:指定后端服务的地址,请求会被转发到这个地址
  • changeOrigin:当设置为true时,会修改请求头中的Origin字段为target的域名,解决跨域问题
  • rewrite:重写请求路径的函数,这里用于去掉/api前缀,后端服务实际接收的是去掉前缀后的路径

解决的问题

  1. 开发环境跨域:通过代理服务器转发请求,解决浏览器的同源策略限制
  2. 路径统一:在前端代码中统一使用/api前缀,便于管理和维护
  3. 避免硬编码:无需在前端代码中硬编码后端服务地址,便于环境切换

应用场景

  • 前端开发环境下,后端服务运行在不同域名或端口
  • 需要在请求发送前对路径进行处理
  • 统一管理API请求的域名和路径

4. 总结

前后端开发中有许多成熟的技术手段可以解决各种实际问题,选择合适的技术手段需要考虑:

  1. 业务需求:根据实际业务场景选择最合适的技术方案
  2. 性能要求:考虑系统的性能指标和并发需求
  3. 团队能力:选择团队熟悉的技术栈,降低学习成本
  4. 可维护性:确保技术方案具有良好的可维护性和扩展性
  5. 成本因素:考虑技术方案的实施成本和运维成本

通过合理运用这些技术手段,可以提高开发效率、保证系统质量、提升用户体验,从而构建出稳定、高效、可扩展的应用系统。

Updated at:

Released under the MIT License.